Сценарий Python-сервера и C-программы Ошибка связи - PullRequest
1 голос
/ 31 декабря 2011

Цель моего приложения - управлять некоторыми светодиодами на моей встроенной цели по каналу Ethernet.Моя встроенная плата поддерживает веб-сервер lighttpd.С этого веб-сервера я могу без проблем запускать скрипты Python, которые читают на устройства на моей плате.Проблема возникает, когда я пытаюсь записать на эти устройства.Сервер lighttpd работает как группа "www".У пользователя root на моей доске нет пароля.Любая попытка заставить сервер lighttpd работать от имени root приводит к тому, что lighttpd вообще не запускается.Поэтому я создал C-программу, которая будет называться подпроцессом, повышенным до уровня root с помощью sudo из скрипта python.

моя 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;
}

Python-скрипт, которыйв cgi-bin

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 Ответ

1 голос
/ 31 декабря 2011

Предложение Рикардо Карденеса об изменении владельца или прав доступа к устройству является хорошим, но если вы не можете этого сделать, просто сделайте сценарий Python, который вызывает lighttpd, сценарием "setuid", что означает, что lighttpd будет вызывать его как www, но он будет работать как root.

Обычно я бы не советовал создавать сценарий setuid (создание скомпилированного setuid для программы на C немного менее опасно, возможно). Но в вашем случае вы, похоже, не беспокоитесь о безопасности (поскольку вы упомянули о попытке запустить lighttpd от имени root), поэтому я бы попробовал. Только не забудьте, что ваш скрипт setuid может делать все, что захочет!

...