Net::FTP::Stepstone

今作ってるやつなんだけど、一応Stepstoneは「踏み台」のつもりでつけたら「石段」なのね。ほんで「足がかり」の意味だとstepping stoneなのな。ほんで「踏み台」だとladderなのね。
ほんで何するやつかっていうと↓絵を描いてみた。

サーバー1にNet::FTP::Stepstoneで書いたスクリプトをおいて実行すると、サーバー2にsshでログインして、サーバー3にFTPでログインしてファイルをとってきて、サーバー2の適当なディレクトリにダウンロードする。ほんで、今回使う事例だとサーバー2のダウンロード先のディレクトリはNFSで解放されているので、サーバー1からファイルを取得してtar.gzを解凍する、みたいな流れ。とりあえずサーバー3にはなるだけおれらを近づけたくないらしい。
というのをふまえて。
STDERRとSTDOUTをどっちも星井場合に(なんか変換が変だが)どうするかというと、

my (@outlines, @errlines);
my @all = `(echo '$ftp_command' | 
            ssh -l $self->{stepstone_user} $self->{stepstone_addr} ftp -n 2 |
            sed -e 's/^/stdout: /') 2>&1`;
for (@all) {push @{ s/^stdout: // ? \@outlines : \@errlines }, $_ }

とすればいいという。Perl Cookbook (初版) レシピ16.9より。うはー。IPC::Open3を使えというお話よりこっちの方が好み。わかりやすい。push先をs///できるかどうかで切り替える辺りが全然思いつかないのでかっこいいなぁ、と思ってしまう。

ソースはこちら。↓
http://coderepos.org/share/browser/lang/perl/Net-FTP-Stepstone/trunk/