- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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/
简单的问题,有什么区别 su oracle 和 su - oracle 我不确定 - 在这两个命令中的意义是什么。 更新: 执行 su oracle 后,尝试了 which sqlplus 但无法识别
我正在尝试找出一些给我的代码。有人能告诉我这是什么意思吗? process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(p
我正在尝试将自己设置为 root,一旦我在终端中输入 su - root 它就会给我一个错误提示/bin/su: Permission denied 所以我检查了权限在那个文件中 -rwsr-x---
当我尝试从具有系统权限的程序运行 su 命令时,我在 stderr 上返回了这个错误: uid 1000 not allowed to su 我将共享 uid 设置为 android.uid.syst
我想用非 root 用户启动一个容器,但我不能修改原始 Dockerfile,或者我知道我可以做一些像 Run useradd xx 然后 User xx 在 Dockerfile 中实现。我现在正在
我正在尝试编写一个将运行以下命令的脚本: sudo su runmqsc_result=`su -c "runmqsc QMGR 或者,您可以使脚本只能由 root 编写,并将以下内容添加到 /et
当我使用 adb 访问我的设备时(Android 4.4.2 直接来自制造商及其定制的 rom - 它不是常规设备 - 它内置了二维条码扫描仪)它直接进入了一个 # 我已经read 意味着我有 roo
我正在编写一个 bash 脚本来扫描多台 linux 机器以查看它是否符合组织的标准: grep "sulogin" /etc/inittab ~:S:wait:/sbin/sulogin 我正在使用
我有一个 bash 脚本,需要在不同的用户下运行几个命令。我想使用 su 执行此操作,但如果没有密码提示,我无法自动 su。 运行脚本的用户将是 centos 中的 apache(因此不是真实的用户帐
我想用 su 在一个命令行中更改用户 echo password | su user 但这行不通。还有其他的可能性吗?最良好的祝愿 最佳答案 首先:问问自己脚本是否真的有必要知道密码。 sudo 和
passwd命令 passwd 命令用来修改您的密码。 语法: 语法是 passwd [命令开关] 命令开关: -a 显示密码属性的所有项目。
我有一个 linux 用户 (user2),它已设置为 shell /usr/sbin/nologin(以阻止登录)。不,当我尝试使用 sudo su user2 切换到该用户时,我得到的信息是该帐户
今天早上我犯了一个小错误。 我想更改 wordpress 网站目录的所有者,我命令如下。 sudo chown -vR :theuser / var/wwwwordpress/ 但是这个命令是错误的。
如果我运行这个命令: su -l otheruser -c 'strace /usr/lib/systemd/systemd --user 2> /tmp/su.err' 失败了: Failed to
所以我无法让 su 命令在终端上工作。我所做的就是输入“su”并按 Enter 键,它会要求输入密码,然后我输入当前登录的用户密码。它总是给出这个错误。我发誓这以前有用,不知道发生了什么。 su: S
我正在使用流分析来实现简单的数据传递场景。 作业具有多个 SQL Server 输出(三个)和一个 EventHub 输入。事件数量很少。问题是我的 SU 利用率不断增加。我的临时解决方案是每天重新启
我是一名关于 Vagrant 的新生。我刚刚发现,当我在 Vagrant 监督的盒子里时,我可以通过“sudo su -”更改为 root,而无需输入密码。 奇怪的是,我检查了“/etc/sudoer
我有一个程序,该程序将使用密码作为输入,然后执行 shell 程序以在UNIX中执行“su”(切换用户)命令。但是,我不知道如何将password变量传递给UNIX su命令。我必须为此使用的语言非常
Process process = Runtime.getRuntime().exec("su"); 在 上运行上述命令时 Root 电话一切正常 但是当我在 上尝试相同的代码时无根设备导致内存泄漏,
我使用 boost 1_65_1 并尝试在 MacOS 上运行一个进程。我的主要进程以 root 身份运行我需要以普通用户身份启动子启动。我的命令行:su user_name -c "full 可执行
我是一名优秀的程序员,十分优秀!