1

I use sshj library for communication with linux from my Java app. And I need change user with command: 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());

But, in IOUtils.readLines(cmd.getInputStream(), ... app is waits and does not go next. Thanks for any help.

4

1 回答 1

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) 使用期望脚本来查找提示并做出响应。

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

于 2014-09-26T14:46:15.857 回答