0

nginix/ FCGI によって呼び出される perl スクリプトでは、これを行うssh user@ip <command>と動作します。つまり、ti はリモート マシンに接続します。コードは非常に一般的であり、バグが含まれているとは思いません.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 に答える