【问题标题】:Executing ssh on remote server to jump to another server and execute further commands there using Java and JSch在远程服务器上执行 ssh 以跳转到另一台服务器并使用 Java 和 JSch 在那里执行进一步的命令
【发布时间】:2020-05-23 10:18:15
【问题描述】:

我正在尝试使用 JSch 库通过 SSH 在远程机器上执行多个命令。我快到了,但卡在一个命令中。

我正在使用两台远程机器,比如说 RM1 和 RM2

能够完成以下步骤,

  1. 能够连接到远程机器 RM1。
  2. 能够在 RM1 上执行单个/多个命令(遵循此 https://www.journaldev.com/246/jsch-example-java-ssh-unix-serverhttps://stackoverflow.com/a/5831846/8773024 )。
  3. 能够连接到远程机器 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");

【问题讨论】:

  • 您是否尝试在连接到 RM1 的普通 SSH 终端客户端中执行pwd;ssh -tt user@ip;pwd?它做你想做的事吗? => 它没有! – 那么,您为什么希望它可以在 Java 中工作?
  • 顺便说一句,要进行“跳转”,您应该使用端口转发(参见 JSch JumpHosts example),而不是在跳转服务器上执行 ssh
  • @MartinPrikryl 手动这些命令在 SSH 终端上不起作用;我在我的代码中尝试过这个“pwd;ls;pwd;”并且它有效,所以我想做一些解决方法。
  • @MartinPrikryl 我检查了您共享的链接并遵循相同的操作,但现在我收到错误“身份验证失败”请告诉我您是否可以帮助我?
  • @MartinPrikryl 嘿,我在我的问题中也添加了新代码,请检查并告诉我?我是 Java 语言的新手,所以我让这段代码尽可能简单。

标签: java shell ssh jsch


【解决方案1】:

尝试在连接到 RM1 的普通 SSH 终端客户端中执行pwd;ssh -tt user@ip;pwd。它不会工作,所以它也不会在 Java 中工作。

要进行“跳转”,您应该使用端口转发(参见JSch JumpHosts example),而不是在跳转服务器上执行ssh

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2017-03-29
    • 2013-11-22
    • 1970-01-01
    • 2015-04-24
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多