Я не знаю, что это за сделка здесь …
Поэтому я хочу запустить 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);
/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, вы хотите запустить скрипт с корневого уровня без привилегий 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
и опустить его в скрипт? Это может также потребовать разрешения для дочерних процессов.