java - 在远程服务器上执行 ssh 以跳转到另一台服务器并使用 Java 和 JSch 在那里执行进一步的命令
问题描述
我正在尝试使用 JSch 库通过 SSH 在远程机器上执行多个命令。我快到了,但被困在一个命令中。
我正在使用两台远程机器,比如说 RM1 和 RM2
能够执行以下步骤,
- 能够连接到远程机器RM1。
- 能够在 RM1 上执行单个/多个命令(遵循此https://www.journaldev.com/246/jsch-example-java-ssh-unix-server和https://stackoverflow.com/a/5831846/8773024) .
- 能够连接到远程机器 RM1 并再次连接到另一台远程机器 RM2。
无法执行此步骤, 1. 一旦我将连接到远程机器 RM2 之后无法执行任何命令。
请让我知道是否有人可以帮助我。
我试过这段代码:
String host="IP";
String user="username";
String password="password";
String command1="pwd";
String command2="ssh -tt user@ip";
String command3="pwd";
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session=jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
System.out.println("Connected");
Channel channel1=session.openChannel("exec");
((ChannelExec)channel1).setCommand(command1;command2;command3);
channel1.setInputStream(null);
((ChannelExec)channel1).setErrStream(System.err);
InputStream in1=channel1.getInputStream();
channel1.connect();
byte[] tmp=new byte[1024];
while(true){
while(in1.available()>0){
int i=in1.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel1.isConnected()){
System.out.println("exit-status: "+channel1.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
System.out.println("DONE");
解决方案
尝试pwd;ssh -tt user@ip;pwd
在连接到 RM1 的普通 SSH 终端客户端中执行。它不会工作,所以它也不会在 Java 中工作。
要进行“跳转”,您应该使用端口转发(参见JSchJumpHosts
示例),而不是ssh
在跳转服务器上执行。
推荐阅读
- excel - VBA 数据透视表排序
- node.js - 如何让 Jest 识别以 # 开头的 ES6 绝对路径导入?
- angular - 在 Angular 中未收到来自 API 的错误响应
- javascript - 根据在类型周的输入中选择的周更改标签天
- regex - Google 表格 importXML 不适用于 youtube 网址
- java - 如何将不同的对象从客户端发送到服务器,并根据其类型处理每个对象?
- python - 可以单独对多个列进行 GROUP BY 并使用 django ORM 将它们中的每一列聚合到其他列?
- heroku - 如何诊断和减少 NodeJS Heroku App 的启动时间
- java - 如何访问maven多模块父java类?
- javascript - C# selenium 如何在任何页面上打开一个新选项卡