当前位置: 首页 > 知识库问答 >
问题:

在远程服务器上执行ssh以跳转到另一个服务器,并使用Java和JSch在那里执行进一步的命令

终翔
2023-03-14

我试图在远程机器上执行多个命令,虽然SSH使用JSch库。

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

能够执行以下步骤,

  1. 能够连接到远程机器RM1
  2. 能够在RM1上执行单个/多个命令(如下所示https://www.journaldev.com/246/jsch-example-java-ssh-unix-server和https://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");

共有1个答案

苍恩
2023-03-14

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

要执行“跳转”,您应该使用端口转发(请参阅JSchJumpHosts示例),而不是在跳转服务器上执行ssh

 类似资料:
  • 问题内容: 我试图通过这样的本地服务器上的ssh命令在远程linux服务器上执行命令: ssh myremoteserver’类型ttisql’ 其中ttisql是我的远程计算机路径上的可执行文件。 运行此命令的结果是: bash:第0行:类型:ttisql:未找到 当我只是先连接并执行以下操作: ssh myremoteserver 然后输入命令: [myuser @ myremoteserve

  • 我们目前正在将jBPM(7.37.final)规则部署到一个Kie执行服务器,并使用执行服务器自动公开的REST API调用规则。 但是由于一些体系结构的限制,我们不能使用REST API调用规则。该选项是执行一个基于jar(kie服务器客户机或其他)的集成,并从客户机(java应用程序)远程调用执行服务器上的规则。 Virges Vinay

  • 我有一个数据库结果,每一个调用创建500条记录500条,然后下一个500条,然后下一个 我需要运行一个记录每个不同线程执行特定任务的程序 我举的例子如下 ExecutorService executor=Executors.newFixedThreadPool(10); 我的问题是,在完成当前executer服务之前,it需要获得接下来的500个用户并尝试开始处理,我需要停止该操作,直到处理了前5

  • 我使用JSCH API通过sftp连接到远程服务器。我需要将远程服务器中存在的目录从位置A移动到位置B。看起来channelsftp.put方法(src, est)只允许移动文件而不允许移动目录。 有人能告诉我怎么做吗?

  • 我试图在unix中使用JSCHSSH类(com.jcraft.jsch)执行一些工具。我的工具有一个选择菜单。我需要转到工具所在的文件夹,执行它并选择请求的选项。在每个命令之后,(cd,execute,…)我希望检查输出并检查状态代码(0/1)。我有下面的代码按预期执行它,但在这段代码中,我找不到一种方法来检查每个命令后的输出。 我无法找到一种方法,但我怎么能分开的命令,并打印他们一个接一个(在同

  • 我正在尝试设置一个类,以便我可以通过ssh连接到远程服务器(我有IP、用户名和密码),然后发送类似“echo”test“”的命令,然后接收回输出(例如,“test”)。我用JSch来做这个,但我不知道怎么做。 我不知道该怎么办,连接后我卡住了。 非常感谢您的建议。