我需要通过本地网络网页(CGI 脚本)重启嵌入式系统。我已构建页面,它会调用站点上的脚本(即网页的 (apache) 主机)。此脚本原本应该调用重启命令,但失败了。
一次尝试是这样的:
#!/bin/bash
sudo reboot
当通过 telnet 进入命令行运行时,它可以工作,但当通过 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' 是页面上按下的按钮的名称,用于调用 shell 脚本
我很确定这不是实际的 CGI 脚本,因为当我测试第一个实现时,该脚本显然正在运行。我应该对脚本或安装进行哪些更改,以使重启命令能够以这种方式运行?
答案1
Web 服务器以不同的用户身份运行,您要添加的用户就是该用户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