以前の記事で、Perl の Net::OpenSSH モジュールを用いて、rsync でファイル転送するスクリプトを作った。今回は rsync する際の転送ログを取得してみる。
Net::OpenSSH による rsync
まず、ログを残さずに単に rsync するコードは以下のようになる。
#!/usr/bin/env perl
use strict;
use Net::OpenSSH;
my $host = 'host.example.com';
my %opt = (
user => 'MyUSER',
password => 'MyPASS',
);
my $ssh = Net::OpenSSH->new($host, %opt);
die 'SSH connection failed: ' . $ssh->error if ($ssh->error);
$ssh->rsync_put(
{
archive => 1,
},
'./test/',
'./test/'
);
これに対して、rsync_put/get に
verbose => 1
というオプションを付加すれば、転送情報を表示することができる。ただし標準出力に垂れ流されるので、変数に入れたりファイルに書きだしたりすることができない。
Capture::Tiny モジュール
Capture::Tiny モジュールを使えば、関数やメソッドの標準出力と標準エラー出力を変数に取得することができる。
まず cpanm でモジュールをインストールしておく。
$ cpanm Capture::Tiny
capture で、rsync_put/get の出力を変数に取得する。
#!/usr/bin/env perl
use strict;
use Net::OpenSSH;
use Capture::Tiny qw(capture);
my $host = 'host.example.com';
my %opt = (
user => 'MyUSER',
password => 'MyPASS',
);
my $ssh = Net::OpenSSH->new($host, %opt);
die 'SSH connection failed: ' . $ssh->error if ($ssh->error);
my ($stdout, $stderr) = capture {
$ssh->rsync_put(
{
archive => 1,
verbose => 1,
},
'./test/',
'./test/'
);
};
print $stdout;
実行すると次のようになる。
$ ./rsync_capture.pl
building file list ... done
created directory ./test
./
hoge.jpg
fuga.jpg
sent 815838 bytes received 70 bytes 326363.20 bytes/sec
total size is 815497 speedup is 1.00
このように、STDOUT を変数で取得することができた。これをファイルに書き出せば、転送ログを残すこともできる。
コメント