Подтвердить что ты не робот

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()

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

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

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

4b9b3361

Ответ 1

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

12345

И затем вы делаете следующее:

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

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

Ответ 2

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

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

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

Defaults    requiretty

Ответ 3

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

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

и с php:

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

Предполагая, что пользователь nobody работает с apache.

Ответ 4

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

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

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

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

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

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

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

sudo chmod 0440 /etc/sudoers.d/mount

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

У меня была аналогичная ситуация с попыткой выполнить exec() команду backend, а также не получить 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.

Ответ 8

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

          • killProcess.php

Ответ 9

Как запустить PHP script с sudo и опустить его в script? Это также может заботиться о разрешениях для дочерних процессов.