无法使用 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