我的应用程序的目标是从以太网链接控制嵌入式目标上的某些LED。我的嵌入式主板支持lighttpd web服务器。从这个Web服务器,我可以运行python脚本,读取我板上的设备没问题。当我尝试写入这些设备时出现问题。 lighttpd服务器作为“www”组运行。我的主席的root用户没有密码。我试图强制lighttpd服务器以root身份运行导致lighttpd根本无法启动。所以我创建了一个C程序,作为从python脚本通过sudo升级到root的子进程调用。
我控制LED的C程序:
int main(int argc, char* args[]){
string python_message = "";
bool quit = false;
while (!quit)
{
cin >> python_message;
if (python_message == "quit"){
quit = true;
}else if (python_message == "1"){
ledn(1,"1");
}else if (python_message == "2"){
ledn(1,"0");
}else {
cout << "Huh?" << endl;
}
}
return 0;
}
cgi-bin中的python脚本
import sys
import time
print "Blinking User LED Program"
import subprocess
proc = subprocess.Popen(["sudo","/usr/bin/slave"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
print "1"
proc.stdin.write("1\n")
time.sleep(.5)
print "0"
proc.stdin.write("0\n")
time.sleep(.5)
如果我评论proc.stdin和proc.stdout行我的程序运行并给我所有的print语句输出。 当那些行存在时,我得到500服务器错误。
答案 0 :(得分:1)
RicardoCárdenes建议更改设备的所有权或权限是一个很好的建议,但如果你不能这样做,只需将lighttpd调用的Python脚本变为“setuid”脚本,这意味着lighttpd将调用它作为www,但它将以root身份运行。
我通常不建议制作一个脚本setuid(使编译的C程序setuid可能稍微不那么危险)。但在你的情况下,你似乎并不担心安全性(因为你提到尝试以root身份运行lighttpd),所以我会试一试。只是不要忘记你的setuid脚本可以做任何想做的事情!