Я создал файл test.sh
который выглядит так:
#!/bin/sh
mkdir /testDir
Если я запускаю скрипт в командной строке, как: sudo /path/to/test.sh
он успешно создает каталог.
Я добавил разрешения sudo, как это в visudo
:
www-data ALL=NOPASSWD: /path/to/test.sh
и я запускаю скрипт, как это в моем файле .php:
shell_exec('sh /path/to/test.sh');
Но каталог не создается!
Что я делаю неправильно?!
Когда я бегу shell_exec('whoami')
на php-файле я получаю:
www-data
Я проверил скрипт оболочки, добавив оператор echo, например:
#!/bin/sh
mkdir /testDir
echo "hello"
И когда я бегу .php
команда как:
echo shell_exec('sh /path/to/test.sh');
.php
страница возвращается
Привет
Я также пытался в test.sh
:
output=$( mkdir /testDir )
echo "$output"
но ничего не возвращается
Если я добавлю это к visudo
:
www-data ALL=(ALL) NOPASSWD: ALL
оно работает!! Но, когда я делаю:
www-data ALL=(ALL) NOPASSWD: /path/to/test.sh
Это не … Как вы уже знаете.
Я нашел хороший способ отладки, также изменив PHP на
echo shell_exec('sh /path/to/test.sh 2>&1 1> /dev/null');
и он возвращает ошибку:
sudo: tty отсутствует и не задана программа askpass
Итак, я попробовал:
добавление Defaults:www-data !requiretty
к visudo
но не повезло !!!!
добавление -t
а также -A
к команде sudo … (т.е. sudo -t ...
)
добавление export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass
перед командой sudo, и это просто приводит к совершенно новому миру ошибок.
Я понятия не имею об этом requiretty
поскольку, кажется, нигде в моей системе Ubuntu. Это не упоминается один раз в visudo
?
Может кто-нибудь сказать мне, с какими проблемами я мог бы столкнуться, если бы я только что сделал:
www-data ALL=(ALL) NOPASSWD: ALL
?
Если
www-data ALL=(ALL) NOPASSWD: ALL
работает, но
www-data ALL=(ALL) NOPASSWD: /path/to/test.sh
нет, то явно выполненная команда не совпадает /path/to/test.sh
,
И глядя на ваш код, вы на самом деле не ссылающееся /path/to/test.sh
:
sh /path/to/test.sh
Вы вызываете sh
! С /path/to/test.sh
в качестве первого аргумента, но все же.
Вам либо нужно вызвать скрипт напрямую (если это работает):
shell_exec('/path/to/test.sh');
или обновите файл sudoers соответствующим образом (обратите внимание на полный путь sh
):
www-data ALL=(ALL) NOPASSWD: /bin/sh /path/to/test.sh
Это сработало для меня: добавили это в мой файл ubuntu> sudoers www-data ALL=/etc/path-to-my/script.sh
Надеюсь, это решит и ваш