1

Мне нужно перезагрузить встроенную систему через веб-страницу локальной сети (скрипт 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 ответ1

1

Веб-сервер работает как другой пользователь, это тот пользователь, которого вы хотите добавить в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .