Невозможно выполнить команду как другой пользователь с sudo - PullRequest
1 голос
/ 06 мая 2019

У меня есть этот код, который работает на 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

Я не могу решить эту проблему.Мне нужна ваша помощь.

PS: Извините за плохой английский.Спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я полагаю, что проблема возникает из-за того, что процесс Tomcat выполняется с другим пользователем (с другими разрешениями), чем тот, который вы используете для выполнения команд вручную.

Обычно пользователю tomcat присваивается имя "tomcat "или что-то вроде" tomcat7 "," tomcat8 "и т. д. в зависимости от версии.

Чтобы решить вашу проблему, вы должны добавить права sudo для вашего пользователя tomcat.

Если вы не знаете точного имени вашего пользователя 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 для этого пользователя и разрешаете использовать sudo без пароля, добавив следующую строку в файл "/ etc / sudoers" (вы можете отредактировать его, введя "sudo visudo" втерминал, это своего рода ярлык для редактирования этого файла)

tomcat9 ALL = (ALL) NOPASSWD: ALL

0 голосов
/ 06 мая 2019

Когда я пытаюсь сделать это из командной строки, это работает, когда я ввожу правильный пароль.(В вашем случае правильный пароль - это пароль для учетной записи Tomcat; см. man sudo.)

Поэтому я предлагаю вам проверить следующее:

  • Попробуйте выполнить точныйтот же сценарий оболочки из командной строки.
  • Убедитесь, что в командной строке указано правильное имя пользователя Tomcat, и вы вводите правильный пароль:
    • Как отмечено mprev0 ,имя учетной записи Tomcat зависит от системы и может также зависеть от вашей версии Tomcat.
    • При неправильном имени пользователя появляется другое сообщение об ошибке ... но YMMV.
  • Убедитесь, что ignore_local_sudoers не действует в политике sudo.
  • Убедитесь, что requiretty не действует в политике sudo.
  • Проверьте, что visiblepw не действует в политике sudo.
  • Убедитесь, что у пользователя Tomcat есть соответствующая запись в файле sudoers.
  • Если вы работаете в системе с SELinux в принудительном режиме, попробуйте временно отключить это (!)

См. man sudoers для получения более подробной информации о политике sudo.(Обратите внимание, что из документации неясно, как указанные три параметра политики взаимодействуют с параметром -S.)


Я хотел бы отметить, что то, что вы делаете, не очень безопасно.Кто-то с доступом к оболочке может увидеть пароль в открытом виде, запустив ps -efl | grep echo.(Если они запускают его точно в нужное время .....)

Вы можете защитить пароль, используя Process, чтобы дать вам поток для записи пароля из Java, избегая echocommand.

Более важной проблемой является то, что разрешение пользователю Tomcat запускать команды sudo подвергает вашу систему риску, если учетная запись Tomcat взломана или кому-то удастся подорвать ваш сервер Tomcat.Представьте, что может случиться, если хакер сможет обмануть Tomcat:

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