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

Posted

技术标签:

【中文标题】Python服务器脚本与C程序通信错误【英文标题】:Python server script and C program communication Error 【发布时间】:2011-12-31 14:01:02 【问题描述】:

我的应用程序的目标是通过以太网链路控制我的嵌入式目标上的一些 LED。我的嵌入式主板支持 lighttpd 网络服务器。从这个网络服务器,我可以运行 python 脚本,读取到我板上的设备没有问题。当我尝试写入这些设备时,问题就来了。 lighttpd 服务器作为“www”组运行。我的董事会的根用户没有密码。我试图强制 lighttpd 服务器以 root 身份运行会导致 lighttpd 根本无法启动。所以我做了一个 C 程序,作为一个子进程调用,通过 sudo 从 python 脚本提升到 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 行,我的程序将运行并给我所有的打印语句输出。 当这些行出现时,我会收到 500 服务器错误。

【问题讨论】:

您是否添加了 cgi 的标头? print("content-type: text/html; charset=utf-8\n\n"); 在 python CGI 中?此外,您可能希望在 python - cgi 脚本库中 import cgi。允许调试等。您的 C 程序是否也作为 CGI 运行(您还必须将标头放在那里。 更改设备的权限/所有权以便 www 可以进行写入不是更容易吗?只是说:) 为什么不做C程序setuid? 无论如何,看看 lighttpd 错误日志。如果您收到 500 错误,则可能是 Python 脚本因某些错误而死,并且回溯应该在日志中。 var/log 中没有 lighttpd 日志(此文件夹为空)。在 lighttp.conf 中,设置为:server.errorlog= |/var/log/lighttpd/error.log"。@RicardoCárdenes 以及我如何/在哪里可以更改权限以便 www 可以进行写作? 【参考方案1】:

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

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

【讨论】:

import pwd, os uid = pwd.getpwnam('root')[2] os.setuid(uid) 是我用来让脚本以 root 身份运行的。但是我在这里又遇到了 500 服务器错误... 当有人说“制作一个脚本 setuid”时,他们通常并不是要写更多的代码。这是 Unix 世界中的一个许可位。我在答案中添加了一个***链接。

以上是关于Python服务器脚本与C程序通信错误的主要内容,如果未能解决你的问题,请参考以下文章

python 当浏览器js无法与另一个域通信时使用的python 2服务器端脚本

Chrome扩展程序后台脚本如何与网页服务工作者进行通信?

shell脚本--初始CGI

Chrome 扩展后台脚本如何与网页服务工作者通信?

Python脚本和一个win32程序之间的通信(用Delphi开发)

Python CGI 脚本错误:头文件前的脚本输出结束