Perl如何退出执行telnet的子脚本?

时间:2013-02-06 13:25:09

标签: perl telnet exit

我有一个执行少量命令然后telnet到机器的脚本。现在我需要从另一个perl脚本调用这个脚本。

$result = `some_script.pl`;

脚本some_script.pl成功执行,但是当脚本在telnet提示符处等待时,我无法退出主脚本。

我还需要捕获脚本的退出状态,以确保some_script.pl成功执行。

我无法修改some_script.pl。

在some_script.pl成功执行后,有什么方法可以让我退出吗?

2 个答案:

答案 0 :(得分:0)

试试这个,这个'魔术'关闭标准输入/输出/错误并且可以让你的程序完成。

$ result =`some_script.pl>& - 2>& - <& - ';

否则你可以使用open2并期望在程序输出中查看特定字符串(如Done!)并在完成后关闭它。

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod

此致

答案 1 :(得分:0)

我不喜欢您通过对系统进行“反引号”调用来实际执行perl脚本的方式。 我建议你实际上是fork(或类似的东西)并以更加可控的方式运行程序。

use POSIX ":sys_wait_h";
my $pid = fork();
if($pid) { # on the parent proc, $pid will point to the child
  waitpid($pid); # wait for the child to finish      
} else { # this is the child, where we want to run the telnet
  exec 'some_script.pl'; # this child will now "become" some_script.pl
}

由于我不知道some_script.pl实际上是如何工作的,所以我在这里真的无法帮助你。但是,例如,如果您只需要在some_script.pl的命令行上打印“quit”,则可以使用IPC::Open2中建议的another question。做类似的事情:

use IPC::Open2;

$pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some_script.pl');
print CHLD_IN "quit\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;

你需要稍微调整一下,但这个想法可以解决你的问题。