sudo в php exec () - PullRequest
       50

sudo в php exec ()

40 голосов
/ 04 июля 2010

Я не знаю, в чем здесь дело ...

Итак, я хочу запустить яблочный скрипт: sudo osascript myscript.scpt

Это прекрасно работает в терминале, но не тогда, когда я запускаю его через PHP exec(); Ничего не произошло. Консоль говорит

no tty present and no askpass program specified ; TTY=unknown ; …

Я провел исследование и, похоже, мне не хватает пароля для команды sudo. Я попробовал несколько разных способов обойти это, в том числе:

  • написание %admin ALL=(ALL) ALL в /etc/sudoers
  • и proc_open() вместо exec()

ни один из которых, кажется, не работает, следовательно, сводит меня с ума!

Так в принципе, есть ли четкий способ заставить PHP выполнить простую терминальную команду?

РЕДАКТИРОВАТЬ: для уточнения, myscript.scpt - это простой appleScript, который изменяет экранный интерфейс (для более крупного проекта). Теоретически достаточно просто osascript myscript.scpt, однако по какой-то причине sudo необходимо для вызова некоторого ответа системы. Если бы sudo можно было как-то устранить, я не думаю, что у меня возникнет эта проблема с разрешениями.

Ответы [ 8 ]

17 голосов
/ 04 июля 2010

Похоже, вам нужно настроить sudo без пароля. Попробуйте:

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt

Также закомментируйте следующую строку (в / etc / sudoers через visudo), если она есть:

Defaults    requiretty
15 голосов
/ 16 ноября 2011

Если кому-то еще это нужно. Вы можете написать простой текстовый файл, скажем ~ ./. Sudopass / sudopass.secret , с паролем root. Допустим, пароль root - «12345». Вы создаете ~ ./. Sudopass / sudopass.secret только с содержимым '12345' :

12345

И тогда вы делаете следующее:

exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');

Не забудьте использовать это только в контролируемой среде.

9 голосов
/ 10 мая 2013

Я думаю, что вы можете предоставить конкретный доступ пользователю и команде с помощью visudo что-то вроде этого:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt

и с php:

@exec("sudo /path/to/osascript myscript.scpt ");

предположим, nobody пользовательработает apache.

4 голосов
/ 01 июня 2012

php: консоль bash создана и выполняет первый скрипт, который вызывает sudo для второго, см. Ниже:

$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);
  1. / home / www / start.bash

    #!/bin/bash
    /usr/bin/sudo /home/www/myMount.bash $1
    
  2. myMount.bash:

    #!/bin/bash
    function error_exit
    {
      echo "Wrong parameter" 1>&2
      exit 1
    }
    ..........
    

oc, выхотите запустить скрипт из корневого уровня без прав root, для этого создайте и измените файл /etc/sudoers.d/mount:

www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash

не забудьте chmod:

sudo chmod 0440 /etc/sudoers.d/mount
1 голос
/ 06 июля 2017

Выполнить команду sudo visudo, затем установить -%sudo ALL=(ALL:ALL) на %sudo ALL=(ALL:ALL) NOPASSWD: ALL, она будет работать.

0 голосов
/ 06 февраля 2019

Лучший безопасный способ - использовать crontab.т.е. сохраните все ваши команды в базе данных скажем, таблицу mysql и создайте cronjob, чтобы прочитать эти mysql entreis и выполнить через exec () или shell_exec ().Пожалуйста, прочитайте эту ссылку для более подробной информации.

          • killProcess.php
0 голосов
/ 14 ноября 2018

У меня была похожая ситуация при попытке exec() команды бэкэнда и получении no tty present and no askpass program specified в журнале ошибок веб-сервера. Оригинальный (плохой) код:

$output = array();
$return_var = 0;
exec('sudo my_command', $output, $return_var);

Оболочка bash решила эту проблему, например:

$output = array();
$return_var = 0;
exec('sudo bash -c "my_command"', $output, $return_var);

Не уверен, что это будет работать в каждом случае. Кроме того, обязательно примените соответствующие правила цитирования / экранирования для части my_command.

0 голосов
/ 18 мая 2016

Я недавно опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash.Получите это здесь: https://github.com/merlinthemagic/MTS В оболочке есть pty (псевдо-терминальное устройство, такое же, как в сеансе ssh), и вы можете получить оболочку как root, если хотите.Не уверен, что вам нужен root для выполнения вашего скрипта, но, учитывая упоминание sudo, это вероятно.

После загрузки вы просто используете следующий код:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('/path/to/osascript myscript.scpt');
...