Java 无法使用sudo以另一个用户的身份执行命令
我有一段代码,在tomcat上运行:Java 无法使用sudo以另一个用户的身份执行命令,java,linux,tomcat,sudo,Java,Linux,Tomcat,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 BufferedRe
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
我不能解决这个问题。我需要你的帮助
对不起,我英语不好。谢谢 当我从命令行尝试此操作时,如果我提供了正确的密码,它就会起作用。(在您的情况下,正确的密码是Tomcat帐户的密码;请参阅
man sudo
)
因此,我建议您检查以下内容:
- 尝试从命令行运行完全相同的shell脚本
- 检查您在命令行上是否有正确的Tomcat用户名,并回显正确的密码:
- 如所述,Tomcat帐户名取决于系统,也可能取决于您的Tomcat版本
- 当用户名不正确时,我会收到不同的错误消息。。。但是YMMV
- 检查
策略中的sudo
是否无效ignore\u local\u sudoers
- 检查
在requirety
策略中是否无效sudo
- 检查
在visiblepw
策略中是否无效李>sudo
- 检查Tomcat用户在
文件中是否有适当的条目sudoers
- 如果您在SELinux处于强制模式的系统上运行,请尝试暂时禁用该模式(!)
sudo
策略的更多详细信息,请参见mansudoers
。(请注意,从文档中不清楚所述的3个策略选项如何与-S
选项交互。)
我想指出,你所做的不是很安全。通过运行
ps-efl | grep echo
,具有shell访问权限的用户可以清楚地看到密码。(如果他们在正确的时间运行……)
您可以通过使用Process
为您提供一个从Java向其中写入密码的流来保护密码,从而避免使用echo
命令
一个更重要的问题是,如果Tomcat帐户被破坏或有人试图破坏您的Tomcat服务器,允许Tomcat用户运行sudo
命令会使您的系统处于风险之中。想象一下,如果黑客能够诱使Tomcat运行,会发生什么:
echo tomcat-passwd | sudo -S -u root rm -rf /
当我从命令行尝试此操作时,当我提供正确的密码时,它就会工作。(在您的情况下,正确的密码是Tomcat帐户的密码;请参阅
man sudo
)
因此,我建议您检查以下内容:
- 尝试从命令行运行完全相同的shell脚本
- 检查您在命令行上是否有正确的Tomcat用户名,并回显正确的密码:
- 如所述,Tomcat帐户名取决于系统,也可能取决于您的Tomcat版本
- 当用户名不正确时,我会收到不同的错误消息。。。但是YMMV
- 检查
策略中的sudo
是否无效ignore\u local\u sudoers
- 检查
在requirety
策略中是否无效sudo
- 检查
在visiblepw
策略中是否无效李>sudo
- 检查Tomcat用户在
文件中是否有适当的条目sudoers
- 如果您在SELinux处于强制模式的系统上运行,请尝试暂时禁用该模式(!)
sudo
策略的更多详细信息,请参见mansudoers
。(请注意,从文档中不清楚所述的3个策略选项如何与-S
选项交互。)
我想指出,你所做的不是很安全。通过运行
ps-efl | grep echo
,具有shell访问权限的用户可以清楚地看到密码。(如果他们在正确的时间运行……)
您可以通过使用Process
为您提供一个从Java向其中写入密码的流来保护密码,从而避免使用echo
命令
一个更重要的问题是,如果Tomcat帐户被破坏或有人试图破坏您的Tomcat服务器,允许Tomcat用户运行sudo
命令会使您的系统处于风险之中。想象一下,如果黑客能够诱使Tomcat运行,会发生什么:
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 它将返回如下内容: tomcat9 26840 1.4 49.1 7920356 1904504?Sl APR26201:44/usr/lib/jvm/java/bin/java 如您所见,tomcat用户的名称将出现在显示输出的第一列中 然后,您为该用户添加sudo权限,并通过在文件“/etc/sudoers”中添加以下行启用无需密码即可使用sudo(您可以通过在终端中输入“sudo visudo”进行编辑,这是编辑该文件的某种快捷方式) tomcat9 ALL=(ALL)NOPASSWD:ALL
我猜出现这个问题是因为Tomcat进程使用的用户(权限不同)与您手动执行命令的用户不同 通常,tomcat用户被命名为“tomcat”或类似“tomcat7”、“tomcat8”等,具体取决于版本 要解决您的问题,您必须为tom添加sudo权限