запустить скрипт bash от имени пользователя root со страницы php

У меня есть php-страница.

Он вызывает bash-скрипт проверки, который проверяет переменные, переданные с php-страницы.

Затем я вызываю другой сценарий bash, который мне нужно выполнить под пользователем root. Я следил за руководством здесь Как запустить из PHP скрипт bash под пользователем root и все еще не может заставить скрипт выполняться от имени root.

У меня есть следующее:

php-страница

$bashFile = shell_exec('./Validation.sh "'.$coinName.'" "'.$coinNameAbreviation.'" "'.$blockReward.'" "'.$blockSpacing.'" "'.$targetTimespan.'" "'.$totalCoins.'" "'.$firstBitAddy.'" "'.$seedNode.'" "'.$seedName.'" "'.$headline.'" ');
echo "<pre>$bashFile</pre>";

файл проверки:

sudo nohup /bin/bash /usr/sbin/CoinCreationBashFile "$coinName" "$coinNameAbreviation" "$blockReward" "$blockSpacing" "$targetTimespan" "$totalCoins" "$firstAddyBit" "$seedNode" "$nameSeedNode" "$headline" "$blocksPerDay" "$startingDifficulty" >> /tmp/BASH2log.txt 2>&1 &

я добавил

www-data ALL=NOPASSWD /usr/sbin/CoinCreationBashFile

до конца sudo visudo

и сделал:

chown root:root /usr/sbin/CoinCreationBashFile
chmod 755 /usr/sbin/CoinCreationBashFile

запускал его из usr/sbin из предложения здесь http://ubuntuforums.org/showthread.php?t=1848069 Кто-нибудь может увидеть, что я делаю неправильно?? Большое спасибо, редактирование: я могу запустить скрипт CoinCreationBashFile без команды sudo, и он работает нормально до того момента, когда ему требуется привилегия root ... поэтому я знаю, что скрипт работает, и при выполнении из терминала скрипт работает идеально, как и хотелось. вывод в tmp/BASH2log.txt

sudo: no tty present and noaskpass program specified

person Fuzzybear    schedule 08.08.2013    source источник
comment
может быть, ваш www-сервер использует другую учетную запись пользователя (не www-данные)?   -  person gawi    schedule 09.08.2013
comment
когда я запускаю top в терминале на сервере, это пользователь, который выполняет все процессы   -  person Fuzzybear    schedule 09.08.2013
comment
можете ли вы уточнить, успешно ли вы запустили скрипт как пользователь www-data без пароля?   -  person gawi    schedule 09.08.2013
comment
да скрипт может быть запущен, когда я набрал sudo -u www-data /usr/sbin/CoinCreationBashFile var1 var2 var3   -  person Fuzzybear    schedule 09.08.2013
comment
Это не ответ на мой вопрос. Вы пытались выполнить su для www-data (sudo -u www-data bash), а затем запустить скрипт (sudo /usr/sbin/CoinCreationBashFile var1 var2 var3)   -  person gawi    schedule 09.08.2013
comment
Спасибо за разъяснение правильного теста для этого, и да, сценарий может запускаться при входе в систему как www-data, набрав su www-data, а затем запустив sudo script var1 var2 запускает скрипт нормально, без запросов пароля   -  person Fuzzybear    schedule 09.08.2013
comment
давайте продолжим обсуждение в чате   -  person Fuzzybear    schedule 09.08.2013


Ответы (3)


Этот вопрос похож на sudo в php exec(), и они не пришли к выводу.

В вашем случае, поскольку таким образом необходимо выполнить только один сценарий bash, учитывая используя setuid вместо этого:

$ su
[enter password]
chown root:root something.sh
chmod 4755 something.sh
exit

Примечание. Некоторые дистрибутивы Linux по умолчанию отключают setuid для сценариев оболочки из соображений безопасности.

Обновление: по-видимому, ни один широко используемый сегодня дистрибутив Linux не поддерживает setuid в оболочке. скрипты. Раньше Perl был исключением, но теперь suid-perl устарел.

Единственный способ выполнить ваш bash-скрипт с помощью этого метода — вызвать его из скомпилированного бинарного файла. См. пример с кодом C, чтобы узнать, как это сделать.

person Niklas Lindblad    schedule 08.08.2013
comment
Мне было интересно, отключил ли Linux setuid... на Ubuntu 12.04 для ОС. Запустили chown root:root /usr/sbin/CoinCreationBashFile и chmod 4755 /usr/sbin/CoinCreationBashFile с терминала.. мне было интересно, говорит ли руководство по ссылкам создать отдельный файл bash для смены пользователя.. но я бы подумал, что сделано сейчас, я запустил его как root из терминала - person Fuzzybear; 09.08.2013
comment
@Peter Обновил мой ответ после некоторых исследований. - person Niklas Lindblad; 09.08.2013
comment
решение, которое я использовал, состояло в том, чтобы получить php-страницу для записи переменных в текстовый файл в пустой каталог. В начале моего сценария bash эта php-страница вызывала его, теперь он ищет файл .txt в пустом каталоге, если нет файла txt, затем выходите, если есть, извлеките переменные и запустите задание cron. Большое спасибо за вашу помощь Никлас - person Fuzzybear; 14.08.2013

Недавно я опубликовал проект, который позволяет PHP получить и взаимодействовать с реальной оболочкой Bash, вы можете легко получить оболочку с правами root. Получите его здесь: https://github.com/merlinthemagic/MTS

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

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);

$strCmd = "/usr/sbin/CoinCreationBashFile ".$coinName." ".$coinNameAbreviation." ".$blockReward." ".$blockSpacing." ".$targetTimespan." ".$totalCoins." ".$firstAddyBit." ".$seedNode." ".$nameSeedNode." ".$headline." ".$blocksPerDay." ".$startingDifficulty." >> /tmp/BASH2log.txt 2>&1 &";
$return1  = $shell->exeCmd($strCmd);

//if there is any return from the script you can wait for the return
//or you can trigger like you have it now and get no return.
person MerlinTheMagic    schedule 20.05.2016
comment
Какие риски безопасности связаны с этим? - person Fuzzybear; 20.05.2016
comment
Поскольку вам требуются права root, проект, который я создал, достигает этого одним из двух способов: вы предоставляете apache право на sudo python ИЛИ вы передаете учетные данные root объекту каждый раз, когда вам нужна оболочка с настройкой root. Разрешение sudo для python — реальная проблема, но так же, как и передача учетных данных root в скрипте. Разрешить PHP где-нибудь рядом с корнем всегда сложно. Выбрать свой яд. :) - person MerlinTheMagic; 20.05.2016

У вас опечатка в записи visudo. В NOPASSWD нет R. Должен быть:

www-data ALL=NOPASSWD /usr/sbin/CoinCreationBashFile
person gawi    schedule 08.08.2013
comment
хорошее место, но, к сожалению, только опечатка в вопросе здесь .. в коде это был PASSWD и до сих пор не работает :( - person Fuzzybear; 09.08.2013