it-roy-ru.com

sudo в php exec ()

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

Итак, я хочу запустить appleScript: 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 можно каким-то образом устранить, я не думаю, что у меня возникнет проблема с разрешениями.

38
pop850

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

12345

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

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

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

17
scabezas

Звучит так, как будто вам нужно настроить Sudo без пароля. Пытаться:

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

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

Defaults    requiretty
15
tomit

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

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

и с php:

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

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

8
Ezequiel Hdez.

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
    }
    ..........
    

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

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

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

Sudo chmod 0440 /etc/sudoers.d/mount
4
lisu

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

1
Keshav Maheshwari

У меня была похожая ситуация, когда я пытался выполнить 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
Balage

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

          • killProcess.php
0
Sanjay Kumar N S

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

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

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