うまいぼうぶろぐ

linuxとhttpdとperlのメモ

Net::SSH::Perlで"Net::SSH: Can't bind socket to port 1023: アドレスは既に使用中です" と言われてしまう件

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を変更することで対応した。