无法使用sudo以其他用户身份执行命令

时间:2019-05-06 06:14:05

标签: 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 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:对不起,英语不好。谢谢!

2 个答案:

答案 0 :(得分:1)

当我从命令行尝试此操作时,只要提供正确的密码即可。 (根据您的情况,正确的密码是tomcat帐户的密码;请参阅man sudo。)

所以我建议您检查以下内容:

  • 尝试从命令行运行完全相同的shell脚本。
  • 在命令行上检查您的用户名是否正确,是否在回显正确的密码。 (当用户名不正确时收到另一条错误消息……但是YMMV。)
  • 检查ignore_local_sudoers政策中的sudo无效。
  • 检查requiretty政策中的sudo无效。
  • 检查visiblepw策略中的sudo无效。
  • 检查tomcat用户在sudoers文件中是否具有适当的条目。
  • 如果您在具有强制执行模式的SELinux的系统上运行,请尝试暂时禁用该功能(!)

有关man sudoers策略的更多详细信息,请参见sudo。 (请注意,从文档中还不清楚所提到的3个策略选项如何与-S选项交互。)


我要指出,您所做的不是很安全。具有外壳程序访问权限的人可能可以通过运行ps -efl | grep echo来清除密码。 (如果他们在正确的时间运行它.....)

您可以通过使用Process来保护流密码,避免使用echo命令来向流中写入Java密码。

一个更重要的问题是,如果tomcat帐户被盗或有人设法破坏了您的tomcat服务器,允许tomcat用户运行sudo命令会使您的系统处于危险之中。想象一下,如果黑客能够诱使tomcat运行,将会发生什么事情:

   echo tomcat-passwd | sudo -S -u root rm -rf /

答案 1 :(得分:1)

我想出现问题是因为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 Apr26 201:44 / usr / lib / jvm / java / bin / java ...

如您所见,tomcat用户的名称将在显示的输出的第一列中。

然后,您为此用户添加sudo权限,并通过在文件“ / etc / sudoers”中添加以下行来启用sudo,而无需输入密码(您可以通过在终端中输入“ sudo visudo”对其进行编辑,是编辑此文件的某种快捷方式)

  

tomcat9 ALL =(全部)NOPASSWD:全部