Python服务器脚本和C程序通信错误

时间:2011-12-31 14:01:03

标签: c++ python web ipc

我的应用程序的目标是从以太网链接控制嵌入式目标上的某些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服务器错误。

1 个答案:

答案 0 :(得分:1)

RicardoCárdenes建议更改设备的所有权或权限是一个很好的建议,但如果你不能这样做,只需将lighttpd调用的Python脚本变为“setuid”脚本,这意味着lighttpd将调用它作为www,但它将以root身份运行。

我通常不建议制作一个脚本setuid(使编译的C程序setuid可能稍微不那么危险)。但在你的情况下,你似乎并不担心安全性(因为你提到尝试以root身份运行lighttpd),所以我会试一试。只是不要忘记你的setuid脚本可以做任何想做的事情!