首页 > 解决方案 > 在 Jsch Session 中使用绑定地址

问题描述

我正在尝试设置一个地址,以便当我离开我的服务器以 scp 一个文件时,我不会作为服务器主机名离开,而是作为不同的 ip 离开。linux方面的一切都是设置。我可以运行以下 ssh 命令,一切都按预期工作。

ssh -b 1.1.1.1 testuser@sshhost

我的问题是现在我正在尝试使用 JSch 来 scp 文件,但我无法确定正确的会话设置。我正在使用公钥私钥,并且这些私钥可以正常工作。下面是我目前的流程。

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);

所以到目前为止我尝试过的事情。

  1. 创建 Socket Factory 设置绑定地址然后运行

    InetSocketAddress addr = new InetSicketAddress("1.1.1.1", 0);
    Socket socket = new Socket(sshhost, 22);
    socket.bind(addr);
    session.setSocketFactory((SocketFactory) socket);
    
  2. 尝试将内置端口转发与会话类一起使用

    session.setPortForwardingL(0, "1.1.1.1", 22);
    

标签: javajsch

解决方案


使用以下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();
    }

}

netstat -an我在我的 Linux 机器上验证了这一点,并观察到连接的本地端绑定到 1.1.1.1,并带有一个临时端口号(我暂时使用这个地址设置了一个接口)。

我在调用之前立即设置了工厂session.connect()

SocketFactory sfactory = new MySocketFactory();
session.setSocketFactory(sfactory);

session.connect();

推荐阅读