mod_perl環境下で ssh, scpする為に Net::OpenSSH をnew()すると、見慣れないerrorが発生。
my $ssh = Net::OpenSSH->new('localhost', user =>'endo', passwd=>'ないしょ');
↑こう書くと、apacheのerror_logに次のようなエラー。
An error occurred at preview.pl. child process STDIN is not a real system file handle at 〜
http://www.perlmonks.org/?node_id=830581
↑このurlによれば、mod_perlが標準入力を握っていることが原因みたい。なので、つぎのように修正することで解決。
my $DUMMY_STDIN_OUT = '/dev/null'; open(my $stdin_fh,$DUMMY_STDIN_OUT) or die "can't open $DUMMY_STDIN_OUT $!"; open(my $stdout_fh,$DUMMY_STDIN_OUT) or die "can't open $DUMMY_STDIN_OUT $!"; my $ssh = Net::OpenSSH->new('localhost', user =>'endo', passwd =>'ないしょ', default_stdin_fh => $stdin_fh, default_stdout_fh => $stdin_fh);
openしたファイルハンドルをcloseすると、Log4perlでログを書けなくなったので、closeはomitしています