使用 JSch 的多个命令

Posted

技术标签:

【中文标题】使用 JSch 的多个命令【英文标题】:Multiple commands using JSch 【发布时间】:2013-06-25 12:31:44 【问题描述】:

我的要求如下: 我必须使用我的凭据登录到 Unix 框,一旦登录,我必须对不同的用户执行 sudo。一旦 sudo 成功,我必须在 nohup 中调用 shell。执行完成后,关闭通道和会话。

我尝试了使用 sudo 命令连接的第一步,但我不知道如何在 sudo 命令之后调用 shell 脚本。

在下面的代码中,我可以执行 sudo 命令,但是在获得 sudo 访问权限后,如何使用用户 masteruser 在 nohup 中执行 shell。所以我的shell创建的所需文件的所有者为masteruser

public class SSHUploader 

    Session session = null;

    public SSHUploader()

    

    public void connect()
    try 

            JSch jsch = new JSch();
            session = jsch.getSession("user", "xxx.xxx.xx.xx", 22);
            session.setPassword("test");
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
         catch (Exception ex) 
            ex.printStackTrace();
        
    

    public void executeCommand(String script) throws JSchException, IOException
        System.out.println("Execute sudo");
        String sudo_pass = "test";
        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        ((ChannelExec) channel).setCommand( script);

        InputStream in = channel.getInputStream();
        OutputStream out = channel.getOutputStream();
        ((ChannelExec) channel).setErrStream(System.err);

        channel.connect();
        out.write((sudo_pass + "\n").getBytes());
        out.flush();

        byte[] tmp = new byte[1024];
        while (true) 
            while (in.available() > 0) 
                int i = in.read(tmp, 0, 1024);
                if (i < 0)
                    break;
                System.out.print(new String(tmp, 0, i));
            
            if (channel.isClosed()) 
                System.out.println("exit-status: " + channel.getExitStatus());
                break;
            
            try 
                Thread.sleep(1000);
             catch (Exception ee) 
                System.out.println(ee);
            
        
        channel.disconnect();
        System.out.println("Sudo disconnect");
    

    public void disconnect()
        session.disconnect();
    


    public static void main(String... args) throws JSchException, IOException 

        SSHUploader up = new SSHUploader();
        up.connect();

        up.executeCommand("sudo -u masteruser bash");

        up.disconnect();
    


【问题讨论】:

How to perform multiple operations with JSch的可能重复 【参考方案1】:

为了按顺序执行多个命令,您可以创建一个命令字符串,如下所示:

String script ="pbrun su - user; cd /home/scripts;./sample_script.sh”

执行它并将这个字符串传递给你上面的方法。

【讨论】:

另外,添加“echo Running script_X; ./script_X”似乎很适合使用多个命令。 请注意,这是 *nix shell 特定的解决方案 - 它既不是 SSH 也不是 JSch 功能 - 所以在其他系统(如 Windows)上,可能需要不同的语法。 +1 我遇到了这种类型的实现问题。相反,我创建了 2 个通道而不是 1 个(这里我有 2 个命令要运行)【参考方案2】:

这篇文章可能很旧,但我找到了另一种简单的方法,可以让您分别检索每个命令的输出。请注意,此代码必须在会话打开后执行,如示例 (http://www.jcraft.com/jsch/examples/Exec.java.html) 所示:

for (String command : commands) 
    ChannelExec channel = (ChannelExec) session.openChannel("exec");
    channel.setInputStream(null);
    channel.setErrStream(System.err);
    channel.setCommand(command);
    channel.connect();
    printOutput(channel);
    channel.disconnect();

其中printOutput 使用channel.getInputStream() 读取命令的结果。

【讨论】:

以上是关于使用 JSch 的多个命令的主要内容,如果未能解决你的问题,请参考以下文章

JSch 在一个会话中执行多个 linux 命令

使用java JSch库一个接一个地执行多个命令

如果我从多个线程中使用 JSch,我应该如何使用它

JSch 多个隧道/跳转主机

JSch 多个隧道/跳转主机

使用JSCH执行命令并读取终端输出的一些使用心得