The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

AnyEvent::SSH2 - 基于 AnyEvent 的 SSH2 的非阻塞事件驱动的实现

SYNOPSIS

对多台主机, 并行的远程执行一些命令.

    use AE;
    use AnyEvent::SSH2;

    my $ssh1 = AnyEvent::SSH2->new(
        'ip',
        user => 'root',
        pass => 'pass',
    );   
    
    my $ssh2 = AnyEvent::SSH2->new(
        'ip'
        user => 'root',
        pass => 'pass',
    );   
    
    my $cv = AE::cv;

    $cv->begin;
    $ssh1->send('sleep 5;hostname' => sub {
        my ($ssh,  $stdout, $stderr) = @_;
        print "$stdout";
        $cv->end;
    })->connect;  
    
    $cv->begin;
    $ssh2->send('sleep 1;hostname' => sub {
        my ($ssh,  $stdout, $stderr) = @_;
        print "$stdout";
        $cv->end;
    })->connect;  

    $cv->recv;

对同一个主机, 并行的执行多条命令...注意顺序并不固定, 任何一个命令先执行完都会先回调.

    use AnyEvent::SSH2;
    my $ssh = AnyEvent::SSH2->new(
        'ip'
        user => 'root',
        pass => 'pass',
    );   
    
    
    my $cv = AE::cv;
    $cv->begin;
    $ssh->send('sleep 5; echo 5' => sub {
        my ($ssh,  $stdout, $stderr) = @_;
        print "$stdout";
        $cv->end;
    });
    
    $cv->begin;
    $ssh->send('sleep 1; echo 1 ; uptime' => sub {
        my ($ssh,  $stdout, $stderr) = @_;
        print "$stdout";
        $cv->end;
    });
    
    $ssh->connect;  
    
    $cv->recv;

或者你可能想有一定层次, 根据前一条命令的条件来执行指定的命令.

    my $cv = AE::cv;
    $ssh->send('sleep 5; echo 5' => sub {
        my ($ssh,  $stdout, $stderr) = @_;
        print "$stdout";
        $ssh->send('sleep 1; echo 1 ; uptime' => sub {
            my ($ssh,  $stdout, $stderr) = @_;
            print "$stdout";
            $cv->send;
        });
    });
    
    $ssh->connect;  
    
    $cv->recv;

DESCRIPTION

这个模块是基于 Net::SSH::Perl 实现的在 AnyEvent 上的事件驱动的支持. 并不是使用的 Fork 的实现 (non-fork), 这是基于 socket 的原生事件驱动实现. 可以同时异步的连接多个主机进行操作. 并且也可以支持同时对一个主机同时执行多条命令与根据前面结果然后在执行指定命令.

属性

默认对象 new 的时候需要提供连接的主机地址. 本对象的属性继承所有的 Net::SSH::Perl 的属性. 并实现了下列这些

user

提供用于远程连接的用户名. 如果不提供会默认使用当前用户.

pass

提供用于远程连接的密码. 也支持 key 方式认证. 需要指定如下属性

    identity_files => ['/root/.ssh/id_rsa'],
    options => [
        'PubkeyAuthentication yes',
        'PasswordAuthentication no', # 可能你想关掉密码认证
    ],

方法

本对象所支持的方法如下

send

这个需要提供你要给远程执行的命令做为第一个参数, 第二个参数是命令执行完的回调函数. 回调函数的第二个和第三个参数会别会是命令执行的标准输出和标准错误.

本方法可以重复设置, 都会一次性发给远程主机执行. 所以执行完会根据执行结果的速度, 会立即返回并调用回调.

connect

当上面的命令定义完了, 可以调用 connect 方法来运行整个事件.

SEE ALSO

AnyEvent, Net::SSH::Perl

AUTHOR

扶凯 fukai <iakuf@163.com>