Не удается перезагрузить компьютер через скрипт

1726
SSumner

Мне нужно перезагрузить встроенную систему через веб-страницу локальной сети (скрипт CGI). У меня есть страница, построенная, и она вызывает скрипт на станции (которая является (apache) хостом веб-страницы). Этот сценарий должен вызывать команду перезагрузки, но он не работает.

Одна попытка была такая:

 #!/bin/bash  sudo reboot 

Он работал, когда запускался из командной строки, когда входил телнет, но не при вызове CGI. Ошибка (с /var/log/apache2/error.log) была:

sudo: tty отсутствует и не задана программа askpass

Хорошо, достаточно справедливо. Я попытался добавить NOPASSWDв файл sudoers для правильного пользователя, но без сигары. Поэтому я попробовал этот метод, который я нашел в Интернете. Это также работало при запуске из командной строки, но не с сервера. Я подумал, что не получу ту же ошибку, так как это было через Telnet, и это не так.

 #!/usr/bin/expect  set name [lindex $argv 0] spawn telnet $name expect "login:" send "<user>\r" expect "Password:" send "Reformed\r"  send "sudo reboot\r" 

Ошибка была:

искаженный заголовок из скрипта. Неверный заголовок = ОШИБКА !!: WebInterfaceReboot

(если я жестко закодирую IP в скрипте, это выдаст мне ошибку Bad header=spawn telnet 192.168.0.79 #: WebInterfaceReboot send: spawn id exp6 not open while executing "send "<username>\r"" (file ./reboot2.sh" line 9))

Я включил ведение журнала cgi на сервере, и «подробный» журнал CGI больше не помог:

 %% [Wed Oct 09 09:24:25 2013] POST /cgi-bin/WebInterfaceReboot HTTP/1.1 %% 500 /usr/lib/cgi-bin/WebInterfaceReboot %request Host: 192.168.0.79 Connection: keep-alive Content-Length: 19 Cache-Control: max-age=0 Authorization: Basic aGhwOlJlZm9ybWVk Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Origin: http:// 192.168.0.79 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 Content-Type: application/x-www-form-urlencoded DNT: 1 Referer: http:// 192.168.0.79/cgi-bin/WebInterfaceReboot Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8  RebootButton=Reboot %response ERROR!! 

Примечание. «RebootButton» - это название кнопки, нажатой на странице для вызова сценария оболочки.

Я почти уверен, что это не настоящий CGI-скрипт, поскольку, когда я тестировал первую реализацию, скрипт явно работал. Какие изменения я должен внести в сценарий или установку, чтобы команда перезагрузки могла работать таким образом?

1
Разве это не будет работать с `sudo reboot` или` sudo shutdown -r now`, если вы добавите пользователя apache в sudoers и позволите ему выполнить `shutdown` без пароля? Я знаю, что вы пробовали нечто подобное, но я не могу сказать, добавили ли вы нужного пользователя в sudoers. От какого пользователя работает ваш веб-сервер? terdon 11 лет назад 0
@terdon - Я пытался добавить «hhp», который является пользователем практически для всего. Как мне подтвердить пользователя apache? SSumner 11 лет назад 0
`PS Aux | grep apache2`, должен быть один процесс, запускаемый `root`, а некоторые другие запускаются чем-то вроде` www-data`. Вы хотите `www-данные`. terdon 11 лет назад 0
@terdon - так что мне нужно добавить пользователя "www-data" в файл sudoers с NOPASSWD для перезагрузки? SSumner 11 лет назад 0
Да, это должно сделать это. terdon 11 лет назад 1

1 ответ на вопрос

1
terdon

Веб-сервер работает от имени другого пользователя, именно этого пользователя вы хотите добавить sudoers. Чтобы узнать имя пользователя apache, запустите эту команду (вывод из моей системы должен быть похожим):

$ ps aux | grep apache2 root 13108 0.0 0.0 9756 868 pts/0 S+ 17:51 0:00 tail -f /var/log/apache2/error.log root 15140 0.0 0.2 170752 9116 ? Ss 20:10 0:00 /usr/sbin/apache2 -k start www-data 15143 0.0 0.1 170752 5868 ? S 20:10 0:00 /usr/sbin/apache2 -k start www-data 15144 0.0 0.1 170752 5540 ? S 20:10 0:00 /usr/sbin/apache2 -k start 

Итак, пользователь apache www-data, вы должны разрешить этому пользователю запускать перезагрузку без пароля (это не очень хорошая идея с точки зрения безопасности, но эй):

www-data ALL=NOPASSWD:/sbin/reboot 
Безопасность должна быть в порядке - она ​​находится в закрытой сети, а сайт уже защищен паролем SSumner 11 лет назад 0
Я собираюсь принять, потому что я думаю, что это был правильный путь, но я изменил CGI, чтобы просто вызвать команду системной перезагрузки (`system (sudo reboot);`), которую, как я думал, я пробовал ранее, и она работает SSumner 11 лет назад 0
@SSumner это работает, потому что вы добавили `www-data` в sudoers, верно? terdon 11 лет назад 0
да я так считаю SSumner 11 лет назад 0

Похожие вопросы