在由nginix / FCGI调用的perl脚本中,如果我这样做ssh user@ip <command>
,它就可以工作,即ti连接到远程机器
但是,如果我这样做 - 期望&gt; spawn(ssh user @ ip),FCGI会在执行打开时返回错误(该代码非常通用,我不指望其中的错误)。如果我使用expect运行脚本作为一个独立的,它的工作原理。
这让我相信FCGI可能不允许进程产生期望。虽然我不确定。到目前为止,谷歌搜索没有帮助。任何投入赞赏
答案 0 :(得分:2)
它失败的原因是因为Expect.pm尝试复制STDIN并且FCGI.pm不支持该操作,FCGI.pm的下一版本将有一个比Not a GLOB reference at /path/to/perl/lib/...
更清晰的错误消息。
解决方案是避免在进行进程间通信时使用全局变量:STDIN,STDOUT,STDERR和%ENV。
my ($stdin, $stdout, $stderr, $env) =
(IO::Handle->new, IO::Handle->new, IO::Handle->new, {});
my $r = FCGI::Request($stdin, $stdout, $stderr, $env)
or die "Couldn't create FCGI request: '$!'";
while ($r->Accept >= 0) {
my $exp = Expect->spawn('ssh', 'user@ip')
or die "Cannot spawn command: $!\n";
print $stdout "OK\n";
}