在 Jsch Session 中使用绑定地址
Use a bind address with Jsch Session
我正在尝试设置一个地址,这样当我离开我的服务器以对文件进行 scp 时,我不会作为服务器主机名离开,而是作为不同的 ip 离开。 linux 方面的一切都已准备就绪。我可以 运行 以下 ssh 命令并且一切正常。
ssh -b 1.1.1.1 testuser@sshhost
我现在的问题是我正在尝试使用 JSch 对文件进行 scp,但我无法确定正确的会话设置。我正在使用 public 私钥,这些私钥工作正常。以下是我目前的流程。
JSch jsch = new JSch();
Keypair keyPair = KeyPair.load(jsch, privateKey, publicKey);
boolean keyPairdecrpy = keyPair.decrypt(passphrase);
if(keyPairdecrpy)
{
jsch.addIdentity(privateKey, passphrase);
}
Session session = jsch.getSession("user", "sshhost", 22);
Properties config new Properties();
config.put("StrickHostKeyChecking:, "no");
config.put("PreferredAuthentications", "publickey");
session.setConfig(config);
session.connect(timeout);
到目前为止我已经尝试过的东西。
创建套接字工厂设置绑定地址,然后 运行ning
InetSocketAddress addr = new InetSicketAddress("1.1.1.1", 0);
Socket socket = new Socket(sshhost, 22);
socket.bind(addr);
session.setSocketFactory((SocketFactory) socket);
试图在会话中使用内置端口转发Class
session.setPortForwardingL(0, "1.1.1.1", 22);
使用以下 SocketFactory
对我有用:
class MySocketFactory implements SocketFactory {
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
Socket socket = new Socket();
socket.bind(new InetSocketAddress("1.1.1.1", 0));
socket.connect(new InetSocketAddress(host, port));
return socket;
}
@Override
public InputStream getInputStream(Socket socket) throws IOException {
return socket.getInputStream();
}
@Override
public OutputStream getOutputStream(Socket socket) throws IOException {
return socket.getOutputStream();
}
}
我在我的 Linux 盒子上使用 netstat -an
验证了这一点,并观察到连接的本地端被绑定到 1.1.1.1 和一个临时端口号(我暂时用这个设置了一个接口地址)。
我在调用session.connect()
之前立即设置了工厂:
SocketFactory sfactory = new MySocketFactory();
session.setSocketFactory(sfactory);
session.connect();
我正在尝试设置一个地址,这样当我离开我的服务器以对文件进行 scp 时,我不会作为服务器主机名离开,而是作为不同的 ip 离开。 linux 方面的一切都已准备就绪。我可以 运行 以下 ssh 命令并且一切正常。
ssh -b 1.1.1.1 testuser@sshhost
我现在的问题是我正在尝试使用 JSch 对文件进行 scp,但我无法确定正确的会话设置。我正在使用 public 私钥,这些私钥工作正常。以下是我目前的流程。
JSch jsch = new JSch();
Keypair keyPair = KeyPair.load(jsch, privateKey, publicKey);
boolean keyPairdecrpy = keyPair.decrypt(passphrase);
if(keyPairdecrpy)
{
jsch.addIdentity(privateKey, passphrase);
}
Session session = jsch.getSession("user", "sshhost", 22);
Properties config new Properties();
config.put("StrickHostKeyChecking:, "no");
config.put("PreferredAuthentications", "publickey");
session.setConfig(config);
session.connect(timeout);
到目前为止我已经尝试过的东西。
创建套接字工厂设置绑定地址,然后 运行ning
InetSocketAddress addr = new InetSicketAddress("1.1.1.1", 0); Socket socket = new Socket(sshhost, 22); socket.bind(addr); session.setSocketFactory((SocketFactory) socket);
试图在会话中使用内置端口转发Class
session.setPortForwardingL(0, "1.1.1.1", 22);
使用以下 SocketFactory
对我有用:
class MySocketFactory implements SocketFactory {
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
Socket socket = new Socket();
socket.bind(new InetSocketAddress("1.1.1.1", 0));
socket.connect(new InetSocketAddress(host, port));
return socket;
}
@Override
public InputStream getInputStream(Socket socket) throws IOException {
return socket.getInputStream();
}
@Override
public OutputStream getOutputStream(Socket socket) throws IOException {
return socket.getOutputStream();
}
}
我在我的 Linux 盒子上使用 netstat -an
验证了这一点,并观察到连接的本地端被绑定到 1.1.1.1 和一个临时端口号(我暂时用这个设置了一个接口地址)。
我在调用session.connect()
之前立即设置了工厂:
SocketFactory sfactory = new MySocketFactory();
session.setSocketFactory(sfactory);
session.connect();