我使用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正在等待,而不是下一步。 谢谢你的帮助。
答案 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来处理它们。这绝对是更长,更复杂的方法!