Доброе время суток, Аll!Ситуация следующая:
Есть скрипт запуска pptp, pptp-command, наверное его все знают!
В виду того, что у меня на маршрутизаторе 2 соединения pptp решил я его немного подредактировать, потому как для нескольких соединений он адаптирован частично.
Почему разработчики не предусмотрели что может быть не одно и не 2 а несколько Pptp соединений я незнаю.
Вообщем исходный код:
====== сut=======
это из самого начала файла!!!
#######
# Data
#
# the regexp for the list of characters that are unsafe
# to put inside a system() or ``
# it is built by saying everything but known safe characters
# anyone want to make bets on if this holds true for i18n'ed systems?
my $safe_set = '-A-Za-z0-9\s\._\/:';
my $unsafe_re = "[^$safe_set]";
my $safe_re = "[$safe_set]*";sub stop() {
Rotate $resolv, $resolv_real, $resolv_pptp;
print "Sending HUP signal to PPTP processes...\n";
`killall -HUP /usr/sbin/pptp`;========сut ====== Это из оригинального файла
Хочеться чтобы было вот так:
sub stop() {
Rotate $resolv, $resolv_real, $resolv_pptp;
open(RUN, "<$run_dir/ppp253.pid") or die "couldn't open $run_dir/ppp253.pid: $!";
my @run = <RUN>;
close RUN;
my ($pid) = @run;
# if $pid !~ /^($safe_re)$/o {
# $pid = $1; };
#$pid =~ /$unsafe_re/o;
#print $pid;
#my $pid = `kill -HUP | cat $run_dir/ppp253.pid`;
chomp $pid;
system("kill", "-HUP", "$pid =~ /$unsafe_re/o");
==============
Вообще я хочу прочитать из файла pid процесса и грохнуть!
пробовал уже по всякому - в итоге получаюInsecure dependency in system while running with -T switch at ./pptp-command253
line 842.В начало файла вставил
# $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
непомогает!Что нужно сделать подскажите - устал уже - в перле не силен!
Спасибо!
>system("kill", "-HUP", "$pid =~ /$unsafe_re/o");что мешает проделать
$pid =~ /$unsafe_re/o;
system "kill -HUP $pid";
Не хочу отправлять вас в perldoc -f system, но $pid стоит обработать до вызова system и по соображениям безопасноти и по логичности чтения вывода. Все же первый аргемент команда, остальные аргументы к этой самой команде, извините за тавтологию, и про никакие квантификаторы и иже с ними банальный шел не знает.
system есть не что иное как fork + waitpid. отсюда и пляшите.
>
>>system("kill", "-HUP", "$pid =~ /$unsafe_re/o");
>
>что мешает проделать
>
>
>$pid =~ /$unsafe_re/o;
>system "kill -HUP $pid";
>Не хочу отправлять вас в perldoc -f system, но $pid стоит обработать
>до вызова system и по соображениям безопасноти и по логичности чтения
>вывода. Все же первый аргемент команда, остальные аргументы к этой самой
>команде, извините за тавтологию, и про никакие квантификаторы и иже с
>ними банальный шел не знает.
>system есть не что иное как fork + waitpid. отсюда и пляшите.
>
Большушее вам Спасибо! Скиф, но у меня почему-то все оставлось по прежнему!
темболее я делал такую проверку уже! не мне всеравно выдаетInsecure dependency in system while running with -T switch at ./pptp-command253
line 843.Поэтому то я и спрашиваю в чем может быть дело!
Спасбо еще раз!
>Большушее вам Спасибо! Скиф, но у меня почему-то все оставлось по прежнему!
>
>темболее я делал такую проверку уже! не мне всеравно выдает
>
>Insecure dependency in system while running with -T switch at ./pptp-command253
>line 843.Цитирую:
---------------
Попытка сделать что-то, непонравившееся механизму меченных данных. Этот механизм включается, когда выполняется setuid или setgid, либо задан -T для явного его включения. Он помечает все данные явно или косвенно полученные от пользователя, которые считаются недостояными доверия. Если такие данные используются в "опасной" операции, то генерируется сообщение об этой ошибке.
---------------
"Программирование на Perl", Лари Уолл, стр. 1011
system как раз и неявляется секурной.
Отсюда, с какими ключами и опциями пускается скрипт (#!/usr/bin/perl _чего_тут_написано_ + use _чего_пользуем_)
Цитирую:
---------------
-T Включает проверки "меченых" данных("taint" checks), которые становиться возможным использовать. Обычно эти проверки осуществляются только при установленых setuid или setgid. Неплохо явно включить их для программ, выполняемых от другого имени, таких как CGI.
Обратите внимание, что по соображениям безопасности Perl должен увиденть этот параметр как можно раньшеl; обычно это значит, что он должен стоят в начале командной строки или строки #!.
---------------
Там же, стр. 552
Ну с этим разобрались.>
>Поэтому то я и спрашиваю в чем может быть дело!
>Спасбо еще раз!
Если строка 843 это и есть вызов system, то отсюда выход проверить $pid + явно указать расположение kill:
$pid =~ /$unsafe_re/o;
warn $pid;
system "kill -HUP $pid";
warn "kill -HUP $pid";или
$pid =~ /$unsafe_re/o;
warn $pid;
system "/bin/kill -HUP $pid";
warn "/bin/kill -HUP $pid";Ну и в заключение, а что мешает использовать встроенную функцию kill? Философия или религия?
root@fbsd2.home /usr/home/skif :perldoc -f kill
kill SIGNAL, LIST
Sends a signal to a list of processes. Returns the number of
processes successfully signaled (which is not necessarily the
same as the number actually killed).$cnt = kill 1, $child1, $child2;
kill 9, @goners;If SIGNAL is zero, no signal is sent to the process. This is a
useful way to check that a child process is alive and hasn't
changed its UID. See perlport for notes on the portability of
this construct.Unlike in the shell, if SIGNAL is negative, it kills process
groups instead of processes. (On System V, a negative PROCESS
number will also kill process groups, but that's not portable.)
That means you usually want to use positive not negative sig-
nals. You may also use a signal name in quotes.See "Signals" in perlipc for more details.
root@fbsd2.home /usr/home/skif :kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP
TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2