Perl で関数の STDOUT を変数に取得する

スポンサーリンク

以前の記事で、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 を変数で取得することができた。これをファイルに書き出せば、転送ログを残すこともできる。

コメント

タイトルとURLをコピーしました