0

在 nginix/FCGI 调用的 perl 脚本中,如果我这样做ssh user@ip <command>,它可以工作,即 ti 连接到远程机器但是,如果我这样做,expect->spawn(ssh user@ip),FCGI 在打开时返回错误(即代码非常通用,我不希望其中有错误)。如果我使用 expect 作为独立运行脚本,它可以工作。这让我相信 FCGI 可能不允许进程由期望产生。虽然我不确定。到目前为止,谷歌搜索没有帮助。任何输入表示赞赏

4

1 回答 1

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";
}
于 2012-04-11T11:07:10.867 回答