SSHJ如何使用命令su <user>?</user>更改当前用户

时间:2014-05-05 13:46:15

标签: java sshj

我使用sshj库从我的Java应用程序与linux进行通信。 我需要用命令更改用户:su

SSHClient ssh = new SSHClient();
ssh.connect(host);
ssh.authPassword(login, password);
Session s = ssh.startSession();
Command cmd = s.exec("su my_user");
List<String> resultLines = IOUtils.readLines(cmd.getInputStream(), Charset.defaultCharset());

但是,在IOUtils.readLines(cmd.getInputStream()中,... app正在等待,而不是下一步。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

所以,有几件事可以帮你检查一下。鉴于您所描述的内容,IOUtils.readLines()方法永远不会返回,因为InputStream永远不会到达流的末尾。

我见过这种情况的唯一方法就是你运行的命令是否等待输入。我敢打赌,它会提示输入密码并等待永远不会响应的响应。

以下步骤可帮助您进行调试:

1)在exec命令之前添加以下行以分配伪终端并确保任何提示肯定会写入InputStream:

s.allocateDefaultPTY();

2)更改输出处理以逐字符地将输出字符打印到控制台,而不是等待到达流的末尾。像下面这样的东西可以解决这个问题:

    InputStream in = cmd.getInputStream();

    System.out.println("Starting SSH output.");
    int cInt;
    while ((cInt = in.read()) >= 0) {
        char c = (char) cInt;
        System.out.print(c);
    }

这将允许您在控制台中准确地看到导致命令永远不会执行的提示。

如果有提示,我发现回应它们的最佳方式是:

1)使用expect脚本查找提示并回复它。

2)如果您希望将其保留在Java代码中,请使用session.startShell()方法而不是session.exec(),以便允许您打开一个完整的shell会话,您可以在其中使用Input和输出流以发送命令并监视输出以获取提示,然后通过将响应写入提供的OutputStream来处理它们。这绝对是更长,更复杂的方法!