Intereting Posts
Проверка уникальной уникальности для односторонних, однонаправленных с помощью таблицы соединений Как вручную интерполировать строку? как добавить переменную php в url name; не в ссылке URL Преобразование удаленных относительных путей в абсолютные пути Как бы вы выполнили вызов `debug_token`, используя facebook php sdk? Передача переменных $ _GET (или $ _POST) с разбиением на страницы (SESSION не работает) Получение аудиофайла с сервлетами В Laravel: Почему с событием приложения `before`, метод Request :: segment ()` отлично работает и `Route :: currentRouteName ()` does not? Удалить последнюю запятую или предотвратить ее печать на всех MySQL / PHP Удаление выбранных данных в флажке CodeIgniter cart class Арабское регулярное выражение html5 chunk и webworker ничего не загружают Переопределить шаблон компонента Joomla Невозможно автоматически загрузить / загрузить базу данных базы данных в codeigniter позволить пользователю изменить свой собственный пароль?

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

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

 12345 

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

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

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

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

 %admin ALL=(ALL) NOPASSWD: ALL 

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

 Defaults requiretty 

php: создается консоль bash, и она выполняет 1-й скрипт, который вызывает 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 

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

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

и с php:

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

если nobody использует apache.

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

Недавно я опубликовал проект, который позволяет 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'); 

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