rootユーザ、かつ日本語ロケールでscriptを実行すると、Net::SSH::Perl->new() のとこで
# perl hoge.pl Net::SSH: Can't bind socket to port 1023: アドレスは既に使用中です at hoge.pl line 10
となって困った。sourceで"Can't bind socket to port" と書いてる付近を見る。
232 for(; $p != $end; $p += $delta) { 233 socket($sock, AF_INET, SOCK_STREAM, getprotobyname('tcp') || 0) || 234 croak "Net::SSH: Can't create socket: $!"; 235 last if not $p or bind($sock, sockaddr_in($p,$addr)); 236 if ($! =~ /Address already in use/i) { 237 close($sock) or warn qq{Could not close socket: $!\n}; 238 next; 239 } 240 croak "Net::SSH: Can't bind socket to port $p: $!";
236行目の正規表現かなー。ぐぐる先生によると、モジュールをいじって対応している人もいるけど、は複数サーバで実行するscriptを想定しているため、各サーバのモジュールを修正するのは少し面倒。というわけでscript内で
use POSIX qw(setlocale LC_ALL); setlocale( LC_ALL, "C" );
として、localeを変更することで対応した。