Хочу сделать сабж, чтобы можно было определить отсутствие связи и прочие проблемы, произошедшие с ssh.
Однонаправленный вариант работает нормально ($proga на сервере получает данные):
$pid = open(RECV, "| -");
$SIG{ALRM} = sub { die "whoops, program pipe broke" };
if($pid)
{
print RECV "blablabla" || die ("Can't send data!\n");
close(RECV) || die ("SSH exited $?");
exit 0;
}
else
{#child
($EUID, $EGID) = ($UID, $GID);
exec("/usr/bin/ssh $user\@$server $proga 2>/dev/null") || die "can't exec program: $!";
}
Самый страшный двунаправленный вариант, который придумался - вот такой (данные получает шелл пользователя $user):
pipe(PR, CW);
pipe(CR, PW);
$pid = fork();
$SIG{ALRM} = sub { dielog("ssh pipe broke"); };
if ($pid)
{#parent
close PR; close PW;
print CW "blablabla" || dielog("can't send data");
close(CW) || dielog("ssh exited $?");
close(CR) || dielog("ssh exited $?") ;
waitpid($pid,0);
exit 0;
}
else
{#child
dielog("cannot fork: $!") unless defined $pid;
close CR; close CW;
open(STDOUT,">&PW"); close PW;
open(STDIN,"<&PR"); close PR;
($EUID, $EGID) = ($UID, $GID);
my $server = "$ssh $user\@server 2>/dev/null";
exec($server) || dielog("can't exec $server: $!");
}
Вот этот вариант успешно завершается даже при попытке послать данные на несуществующий сервер (левый ip-шник).
Что я делаю не так? Существует ли более элегантное решение? Мне важно, чтобы скрипт прерывался при любых проблемах со связью.
![](/photos/5912:-1089048451.jpg)
Ответ на:
комментарий
от vilfred
![](/img/p.gif)
Ответ на:
комментарий
от Gelin
![](/photos/5912:-1089048451.jpg)
![](/img/p.gif)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум смена EUID в perl-скрипте (2003)
- Форум вопрос о правах доступа. (2009)
- Форум Задание на Stepik по Perl. Никак не могу понять, где загвоздка. HELP. (2020)
- Форум Perl + FastCGI + nginx (2009)
- Форум [perl] прога плодит зомби (2008)
- Форум Perl. Сокеты. (2007)
- Форум сегфолт в perl gtk2, которого раньше не было (2014)
- Форум perl ssh2 в 1 сессию (2008)
- Форум Буфер вывода в Perl - как отключить? (вывод от wine) (2012)
- Форум Непонятные тормоза в паренте после fork (2005)