java - 在 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);
所以到目前为止我尝试过的事情。
创建 Socket Factory 设置绑定地址然后运行
InetSocketAddress addr = new InetSicketAddress("1.1.1.1", 0); Socket socket = new Socket(sshhost, 22); socket.bind(addr); session.setSocketFactory((SocketFactory) socket);
尝试将内置端口转发与会话类一起使用
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();
}
}
netstat -an
我在我的 Linux 机器上验证了这一点,并观察到连接的本地端绑定到 1.1.1.1,并带有一个临时端口号(我暂时使用这个地址设置了一个接口)。
我在调用之前立即设置了工厂session.connect()
:
SocketFactory sfactory = new MySocketFactory();
session.setSocketFactory(sfactory);
session.connect();
推荐阅读
- asp.net-mvc-5 - 带区域的 MVC 5 ActionLink
- ios - 无法同时满足约束 - LayoutConstraints
- javascript - 如何在类组件中使用 next.js 中的“useRouter()”?
- drupal - Drupal 8 迁移后未加载 Javascript 和 CSS
- java - 给定一个由 n 个整数和一个整数 x 组成的未排序数组,重新排列其中的元素
- javascript - Typescript React 泛型函数类型
- node.js - TypeError 子类别不是构造函数
- java - java.util.concurrent.Future 在超时方面的行为是什么?
- c++ - C++ 中的局部变量是右值吗?
- azure - 如何解决在天蓝色 ILB ASE 中创建的函数应用程序无法访问的问题?