无法使用 sudo 以其他用户身份执行命令
Cannot execute command as another user with sudo
我有这个代码,即 运行 在 tomcat:
try {
Process p = Runtime.getRuntime().exec("sh /home/user/script.sh");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
StringBuilder result = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
result.append(line).append('\n');
}
while ((line = errorReader.readLine()) != null) {
System.err.println(line);
}
return result.toString();
} catch (IOException | InterruptedException e) {
System.err.println(e.getMessage());
}
还有我的 script.sh
文件:
#/bin/sh
echo 'USER_PASSWORD'| sudo -S -u USER ls
从命令行,脚本执行得非常好,我看到了结果。
但是当从 tomcat 执行它时,我收到此消息:
[sudo] password for tomcat: Sorry, try again.
[sudo] password for tomcat:
sudo: 1 incorrect password attempt
我无法解决这个问题。我需要你的帮助。
P.S:对不起我的英语不好。谢谢!
当我从命令行尝试此操作时,当我提供正确的密码时它会起作用。 (在您的情况下,正确的密码是 Tomcat 帐户的密码;参见 man sudo
。)
所以我建议您检查以下内容:
- 尝试从命令行运行使用完全相同的shell脚本。
- 检查您在命令行中使用了正确的 Tomcat 用户名并且您回显了正确的密码:
- 如 mprev0 所述,Tomcat 帐户名取决于系统,也可能取决于您的 Tomcat 版本。
- 当用户名不正确时,我收到不同的错误消息...但是 YMMV。
- 检查
ignore_local_sudoers
是否在 sudo
策略中生效。
- 检查
requiretty
是否在 sudo
策略中生效。
- 检查
visiblepw
是否在 sudo
策略中生效。
- 检查 Tomcat 用户在
sudoers
文件中是否有适当的条目。
- 如果您运行在 SELinux 处于强制模式的系统上,请尝试暂时禁用它(!)
有关 sudo
政策的更多详细信息,请参阅 man sudoers
。 (请注意,文档中并不清楚提到的 3 个策略选项如何与 -S
选项交互。)
我要指出的是,您所做的并不是很安全。具有 shell 访问权限的人可能能够通过 运行ning ps -efl | grep echo
明文查看密码。 (如果他们 运行 它恰好在正确的时间.....)
您可以通过使用 Process
为您提供从 Java 写入密码的流来保护密码,避免使用 echo
命令。
一个更重要的问题是,如果 Tomcat 帐户被泄露或有人管理颠覆你的 Tomcat 服务器。想象一下,如果黑客能够将 Tomcat 欺骗到 运行ning:
会发生什么
echo tomcat-passwd | sudo -S -u root rm -rf /
我猜是因为 Tomcat 进程是 运行 与您用来手动执行命令的用户不同的用户(具有不同的权限)。
通常,tomcat 用户被命名为 "tomcat" 或类似 "tomcat7"、"tomcat8" 等名称,具体取决于版本。
要解决您的问题,您必须为您的 tomcat 用户添加 sudo 权限。
如果您不知道 tomcat 用户的确切名称,当 tomcat 为 运行 时,您可以在终端中使用以下命令进行检查:
ps aux | grep -v grep | grep tomcat
这将 return 是这样的:
tomcat9 26840 1.4 49.1 7920356 1904504 ? Sl Apr26 201:44 /usr/lib/jvm/java/bin/java...
如您所见,tomcat 用户的名称将出现在显示输出的第一列中。
然后,您为该用户添加 sudo 权限并通过将以下行添加到文件“/etc/sudoers”来启用无需密码即可使用 sudo(您可以通过在中输入 "sudo visudo" 来编辑它终端,这是编辑此文件的某种快捷方式)
tomcat9 ALL=(ALL) NOPASSWD: ALL
我有这个代码,即 运行 在 tomcat:
try {
Process p = Runtime.getRuntime().exec("sh /home/user/script.sh");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
StringBuilder result = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
result.append(line).append('\n');
}
while ((line = errorReader.readLine()) != null) {
System.err.println(line);
}
return result.toString();
} catch (IOException | InterruptedException e) {
System.err.println(e.getMessage());
}
还有我的 script.sh
文件:
#/bin/sh
echo 'USER_PASSWORD'| sudo -S -u USER ls
从命令行,脚本执行得非常好,我看到了结果。
但是当从 tomcat 执行它时,我收到此消息:
[sudo] password for tomcat: Sorry, try again.
[sudo] password for tomcat:
sudo: 1 incorrect password attempt
我无法解决这个问题。我需要你的帮助。
P.S:对不起我的英语不好。谢谢!
当我从命令行尝试此操作时,当我提供正确的密码时它会起作用。 (在您的情况下,正确的密码是 Tomcat 帐户的密码;参见 man sudo
。)
所以我建议您检查以下内容:
- 尝试从命令行运行使用完全相同的shell脚本。
- 检查您在命令行中使用了正确的 Tomcat 用户名并且您回显了正确的密码:
- 如 mprev0 所述,Tomcat 帐户名取决于系统,也可能取决于您的 Tomcat 版本。
- 当用户名不正确时,我收到不同的错误消息...但是 YMMV。
- 检查
ignore_local_sudoers
是否在sudo
策略中生效。 - 检查
requiretty
是否在sudo
策略中生效。 - 检查
visiblepw
是否在sudo
策略中生效。 - 检查 Tomcat 用户在
sudoers
文件中是否有适当的条目。 - 如果您运行在 SELinux 处于强制模式的系统上,请尝试暂时禁用它(!)
有关 sudo
政策的更多详细信息,请参阅 man sudoers
。 (请注意,文档中并不清楚提到的 3 个策略选项如何与 -S
选项交互。)
我要指出的是,您所做的并不是很安全。具有 shell 访问权限的人可能能够通过 运行ning ps -efl | grep echo
明文查看密码。 (如果他们 运行 它恰好在正确的时间.....)
您可以通过使用 Process
为您提供从 Java 写入密码的流来保护密码,避免使用 echo
命令。
一个更重要的问题是,如果 Tomcat 帐户被泄露或有人管理颠覆你的 Tomcat 服务器。想象一下,如果黑客能够将 Tomcat 欺骗到 运行ning:
会发生什么 echo tomcat-passwd | sudo -S -u root rm -rf /
我猜是因为 Tomcat 进程是 运行 与您用来手动执行命令的用户不同的用户(具有不同的权限)。
通常,tomcat 用户被命名为 "tomcat" 或类似 "tomcat7"、"tomcat8" 等名称,具体取决于版本。
要解决您的问题,您必须为您的 tomcat 用户添加 sudo 权限。
如果您不知道 tomcat 用户的确切名称,当 tomcat 为 运行 时,您可以在终端中使用以下命令进行检查:
ps aux | grep -v grep | grep tomcat
这将 return 是这样的:
tomcat9 26840 1.4 49.1 7920356 1904504 ? Sl Apr26 201:44 /usr/lib/jvm/java/bin/java...
如您所见,tomcat 用户的名称将出现在显示输出的第一列中。
然后,您为该用户添加 sudo 权限并通过将以下行添加到文件“/etc/sudoers”来启用无需密码即可使用 sudo(您可以通过在中输入 "sudo visudo" 来编辑它终端,这是编辑此文件的某种快捷方式)
tomcat9 ALL=(ALL) NOPASSWD: ALL