#apache #perl #signals #interrupt
#apache #perl #сигналы #прерывание
Вопрос:
У меня есть скрипт perl, работающий от имени root, который отслеживает последовательное устройство и отправляет на него команды. В apache у меня есть другой perl-скрипт, который отображает графический интерфейс для управляющего «корневого» скрипта.
Я пытаюсь прервать с помощью sigint и sigusr1 корневой perl-скрипт из скрипта perl с графическим интерфейсом, но операция get не разрешена, вероятно, поскольку один является root, а другой нет.
Я в основном хочу, чтобы графический интерфейс мог указывать управляющему корневому скрипту передавать некоторую команду на последовательное устройство.
Если я запускаю скрипт gui из строки cmd как root, он может успешно сигнализировать о корневом скрипте
Я не уверен, куда идти дальше, какие-либо предложения по методам прерывания корневого скрипта, когда он не запускается от имени root? вызов отдельного скрипта «signal», как показано на рисунке:
@cmds = ("perl /var/www/signal.cgi", "$perlSerialPID", "test");
if (0 == system(@cmds)) {
# code if the command runs ok
print "system call ok: $?";
} else {
# code if the command fails
print "not ok $?";
}
# try backticks
$output = `perl /var/www/signal.cgi $perlSerialPID test`;
print "<br>:::$output";
signal.cgi:
#!/usr/bin/perl
$pid = $ARGV[0];
$type = $ARGV[1];
if($type eq "test"){
if(kill 0, $pid) {
print "perl-serial $pid running!";
}else{
print "perl-serial $pid gone $!";
}
}elsif($type eq "USR1"){
if(kill USR1, $pid) {
print "perl-serial interrupted";
}else{
print "perl-serial interrupt failed $!";
}
}else{
print "FAILED";
}
Комментарии:
1. Создайте скрипт, который отправляет сигнал. Используйте sudo для вызова этого скрипта от имени root.
2. perlmonks.org/?node_id=742855
3. Как упоминалось выше, скрипт gui запускается под управлением apache, как вы затем используете sudo, чтобы вызвать его как root, как вы предлагаете?
Ответ №1:
- Используйте именованные каналы для IPC.
Недостатком является то, что вам придется модифицировать свой основной скрипт для чтения из именованного канала как процесс, управляемый событиями.
- Аналогично по концепции описанному выше (с тем же недостатком), но используйте сокеты для связи.
- Создайте отдельный скрипт «отправить сигнал», который вызывается через системный вызов из вашего пользовательского интерфейса, и сделайте этот новый скрипт SUID и принадлежащим root — в этом случае он будет выполняться с правами root.
Недостаток: это созрело для злоупотребления безопасностью, поэтому ужесточите это очень тщательно.
Комментарии:
1. Я попробую небезопасный сценарий-оболочку, поскольку я действительно хочу прерывать, а не опрашивать или проверять файл / канал через регулярные промежутки времени
2. Когда вы говорите sepperate script, вы имели в виду perl-скрипт, поскольку я это сделал, и его операция по-прежнему запрещена. Код, показанный выше
3. В итоге я добавил www-data в sudo и вызвал сценарий signal через ‘sudo perl / path/ to/signal.cgi’, передавая любые команды через сокет UNIX. Прерывание сообщает скрипту считывать и обрабатывать любые cmd’ы, отправленные через сокет, поскольку я не могу блокировать скрипт во время чтения канала.