gpt4 book ai didi

java - SSHJ 如何使用命令 su 更改当前用户?

转载 作者:行者123 更新时间:2023-11-30 03:54:55 26 4
gpt4 key购买 nike

我使用 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(), ... 应用程序正在等待并且不会继续下一步。感谢您的帮助。

最佳答案

因此,您需要做一些事情来检查这一点。根据您的描述,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 session ,您可以在其中使用 Input 和输出流发送命令并监视提示的输出,然后通过将响应写入提供的 OutputStream 来处理它们。然而,这绝对是更长、更复杂的方法!

关于java - SSHJ 如何使用命令 su <user> 更改当前用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com