8

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

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

在下面的代码中,我可以执行 sudo 命令,但是在获得 sudo 访问权限后,如何使用 user 在 nohup 中执行 shell masteruser。因此,创建我的 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();
    }

}
4

2 回答 2

19

要按顺序执行多个命令,您可以创建如下命令字符串:

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

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

于 2013-10-10T20:16:02.673 回答
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();
}

WhereprintOutput用于channel.getInputStream()读取命令的结果。

于 2018-02-05T11:25:56.270 回答