【问题标题】:Using JCraft Jsch - executing sshpass command is unsuccessful使用 JCraft Jsch - 执行 sshpass 命令不成功
【发布时间】:2017-12-01 00:10:40
【问题描述】:

需要从 machine1 建立一个远程 ssh 到 machine2。使用 ssh.but 不成功尝试下面的代码。在 sshpass 请求之前和之后运行文件创建命令以进行验证。文件在 Machine1 中创建,但在 Machine2 中不起作用。 请帮忙。还有其他选择吗

String Cl_samp= new String("sshpass -p "xxxx" ssh -o StrictHostKeyChecking=no root@XXX.XX.115.71");
try{    
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();

        Session session_r=jsch.getSession(user, XXX.XX.115.70, 22);
            session_r.setConfig("StrictHostKeyChecking", "no");
        session_r.setPassword(password);
        session_r.setConfig(config);
        session_r.connect();
        ChannelExec(session_r, "ls -la >>result.txt")
        ChannelExec(session_r, Cl_samp);
        ChannelExec(session_r, "ls -la >>result.txt")
        session_r.disconnect();
        System.out.println("DONE");

        }catch(Exception e){
        e.printStackTrace();
    }
private void ChannelExec(Session session_1, String Serv_cmd) throws IOException{

    try {
        Channel channel;
        channel = session_1.openChannel("exec");
        ((ChannelExec)channel).setCommand(Serv_cmd);
        channel.setInputStream(null);
        ((ChannelExec)channel).setErrStream(System.err);
        channel.connect();
        System.out.print("Server-"+"command:"+Serv_cmd+" \n");
        channel.disconnect();           
        } catch (JSchException ex) {
            Logger.getLogger(ContactEditorUI.class.getName()).log(Level.SEVERE, null, ex);
        }

   }   

【问题讨论】:

  • “但它不成功” -- 你必须告诉我们它是如何不成功的,并包含任何错误消息和/或堆栈跟踪(将堆栈跟踪格式化为代码,而不是块引用)。
  • 在 sshpass 请求之前和之后运行文件创建命令以进行验证。文件在 Machine1 中创建,但在 Machine2 中不起作用。

标签: java linux ssh jsch sshpass


【解决方案1】:
ChannelExec(session_r, "ls -la >>result.txt")
ChannelExec(session_r, Cl_samp);
ChannelExec(session_r, "ls -la >>result.txt")

您创建的每个频道都将独立于其他频道运行。在常见情况下(与 unix 服务器建立 ssh 连接),每个通道将调用一个单独的 shell 实例,该实例运行您指定的命令然后退出。在一个通道中运行ssh 不会影响后续在不同通道中启动的命令。

要在第二台主机上调用 ssh 并让它在第三台主机上运行命令,您需要通过一个 exec 通道完成整个操作,如下所示:

String Cl_samp= "sshpass -p '...' ssh -o ... root@... 'ls -la >>result.txt'";
ChannelExec(session_r, Cl_samp);

这会将要调用的命令添加到ssh 命令行,这会导致 ssh(在第二台主机上运行)请求在第三台主机上运行该命令。

【讨论】:

  • 感谢您的回复。我试过你上面提到的。但仍然没有运气。如果我直接从 machine2 的 putty 会话运行命令: sshpass -p '...' ssh -o ... root@... 'ls -la >>result.txt' ,它可以工作,文件是在 machine3 中创建的.问题是从 Java 代码启动相同的。
猜你喜欢
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2020-09-06
相关资源
最近更新 更多