bash — запуск mkdir через php с использованием сценария оболочки не работает

Я создал файл 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');

Но каталог не создается!

Что я делаю неправильно?!


Правильный пользователь для разрешений sudo?

Когда я бегу shell_exec('whoami') на php-файле я получаю:

www-data

Правильный путь к скрипту из php?

Я проверил скрипт оболочки, добавив оператор 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

?

5

Решение

Если

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
0

Другие решения

Это сработало для меня: добавили это в мой файл ubuntu> sudoers www-data ALL=/etc/path-to-my/script.sh

Надеюсь, это решит и ваш

0

По вопросам рекламы [email protected]