LINUX.ORG.RU

perl прога сидит 30 сек тихо, а потом вылезает


0

0

Есть прога, которую нужно запускать через 30 скунд после того как человек залогиниться (запуск этого файла в .profile прописан). Как 30 секунд подождать? Не используя sleep - чтобы консоль была свободна, и не используя crontab. Именно стредствами perl это можно сделать? А, и не испльзовать background а потом fg - по определнным причинам тоже не подходит :P. Если perl-ом нельзя то может еще как-то можно (чтоб условия соблюдались) ?


Ответ на: комментарий от anonymous

#!/usr/bin/perl
exit if fork();
sleep 30;
do_thms();

......

anonymous
()
Ответ на: комментарий от anonymous

anonymous No1 - спасибо, вроде работает...
только почему $var=<STDIN>, при использовании exit if fork() чего-то считывает?
anonymous No2 - с бякграундом нам непойдет ,)

anonymous
()
Ответ на: комментарий от anonymous

после исаользования этого exit if fork() все <STDIN> считываются до ввода (сразу же)... Может как то отстановить его действие?

anonymous
()
Ответ на: комментарий от anonymous

что значит остановить считывание <STDIN> при форк?

anonymous
()
Ответ на: комментарий от anonymous

Anonymous No1 - Про fork() я не так вразился наверное. Вот есть строчка $var=<STDIN> и она работет. Как только в тексте программы появляестся exit if fork() то при запросе ввода $var=<STDIN> он сразу чего-то считывает.

kuz
() автор топика
Ответ на: комментарий от kuz

Anonymous No2 - так как ты советушеь не могу так как почему-то когда этот процесс выходит из бякграунда на него начинает действовать Control+C, который в проге запрещен посредством
$SIG{'INT'} = "IGNORE";

kuz
() автор топика
Ответ на: комментарий от kuz

уфф....
что значит
"$var = <STDIN> работает"?

и что значит "$var=<STDIN> чего-то считывает"

?

работать строка будет, т.к. она синтаксически правильная.

$var = <STDIN> - считывает первую строку из потока "стандартный ввод".

если у вас оператор "что-то" считывает, то посмотрите на значение переменной.

Если же в этом месте программа замирает, так причина в том, что оператор
<> считывает строку до символа завершения строки, а символ то и не приходит.

anonymous
()
Ответ на: комментарий от anonymous

Мнде.. тяжко у меня с формулировками :)
Вот полный код проги
#!/usr/bin/perl

#exit if fork();
#sleep 5;
$SIG{'INT'} = "IGNORE";
print qq {password:};
$pass=<STDIN>;
use Digest::MD5 qw(md5_hex);
$hash = md5_hex($pass);
open (FILE,"pass") or die "can't open file!";
while ($fhash=<FILE>)
{
chomp($fhash);
if ( $fhash eq $hash)#
{
print "correct\n";
}
else
{
print qq{Password incorrect. Exiting...\n};
$_=`ps | grep "bash (bash)" | grep -v "grep" |grep -v "ps"`;
my ($pid,$tty,$stat,$time,$command) = split();
#$_=`kill -9 $pid`;
}
}
#close FILE;

Вот если exit if fork() раскомментировать - то в $pass считывается что-то не дожидаясь ввода с клавы.

Вот такая прога. Сам глобальный вопрос - как ее заставить подождать 30 сек :)

kuz
() автор топика
Ответ на: комментарий от kuz

опишите задачу полностью. не понятно, зачем вам ждать 30 секунд? вы хотите дать возможность пользователю работать в системе 30 секунд, а потом спросить пароль или предложить зарегистрироваться? )))

anonymous
()
Ответ на: комментарий от anonymous

Задача полностью: 1) Юзер заходит в систему, набирает свой обычный пароль. 2) Через 30 секунд вылезает приглашение ввести второй пароль Введенный юзером парорль шифруется md5 и сравнивается с хешем, лежащим в уже заранее созданном файле. Если хеши совпадают - прога пишет "коррект" и замолкает, а если не совпадают - то убивает bash. -> она не должна вырубаться Control+C Вот. Хочется уже заранее сказать спасибо за стольтерпеливую помощ :)

kuz
() автор топика
Ответ на: комментарий от Sorcerer

А в это 30 сек пользователь должен иметь доступ к системе, тоесть консоль должна быть доступна. А чего он там делать будет - его дело, например скачатвать файл с хешем и потом расшифровывать его :))

kuz
() автор топика
Ответ на: комментарий от kuz

дело в другом.
perl скрипт будет запущен от имени этого пользователя.
значит он спокойно может прибить его с помощью kill. как? - см. выше.

anonymous
()
Ответ на: комментарий от kuz

бестолковая система получается, на самом-то деле.

если это ловушка для хацкеров, то проще написать свою приблуду, которая будет спрашивать у юзера его второй пароль и которую юзер должен запустить сам. и системного демона, который отслеживает все логины и если через 60 секунд после входа второй пароль не введен -- убивать логин и звонить в милицию.

плюс ко всему надо учесть, что хацкеры совсем не обязательно ходят по telnet или ssh, шелл можно и на дырявом cgi-скрипте поиметь. а если пользоваться автоматизированными средствами взлома, 30 секунд хватит на то чтобы зайти, скачать рукткит, установить его и выйти.

anonymous
()
Ответ на: комментарий от anonymous

Для хрен с этими хацкерами и осмысленностью проги :))
как подождать то?
:))))))

kuz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.