c++ - Python服务器脚本与C程序通信报错

标签 c++ python web ipc

我的应用程序的目标是通过以太网链接控制我的嵌入式目标上的一些 LED。我的嵌入式主板支持 lighttpd 网络服务器。从这个网络服务器,我可以运行 python 脚本,毫无问题地读取到我板上的设备。当我试图写入这些设备时,问题就来了。 lighttpd 服务器作为“www”组运行。我的开发板的 root 用户没有密码。我强制 lighttpd 服务器以 root 身份运行的任何尝试都会导致 lighttpd 根本无法启动。所以我制作了一个 C 程序,作为子进程调用,通过 python 脚本中的 sudo 提升到根目录。

我控制 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 服务器错误。

最佳答案

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

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

关于c++ - Python服务器脚本与C程序通信报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688509/

相关文章:

python - AWS 情绪分析教程崩溃 "No module named nltk"

c++ - lxml._ElementTree.getpath(element) 返回 "*"而不是非默认 namespace 中元素的标签名称

rest - 在 RESTful API 中更改密码(PATCH 上的服务器验证)

c++ - 如何将非常非常长的参数列表传递给程序?

c++ - 地址清理器不适用于 Windows 上的 bash

python - 使用 Linux 从 Python 终止 FFMPEG

html - 如何在 Vue.js 中将日期选择器的下拉面板置于顶部?

java - 在没有 web.xml 的情况下配置 servlet url-patterns

c++ - 有什么方法可以为函数指针模板参数(或某些等效参数)创建静态 const 变量?

c++ - 我如何找出为什么 g++ 在特定文件上花费很长时间?