如何使用IPC :: Run回答rsync密码提示?

时间:2014-10-01 09:40:10

标签: perl ipc

我没有Expect,也没有让它在我的机器上工作。 我没有为rsync使用ssh密钥对,但会提供密码(不,密码不存储在脚本或其他地方 - 它只是一个从某个地方获取密码并且必须插入密码的程序)。 我在Windows x64上使用cygwin

我尝试使用IPC::Run处理它,但我失败了。不知何故,密码提示似乎表现不同于正常提示。

这有效:

复制脚本ask.pl生成提示:

#!perl
use strict;
use warnings;

print "enter something:\n";
my $answer = <STDIN>;
print "your answer was: $answer\n";
exit(0);

复制脚本回答ask.pl的prmot:

#!perl
use strict;
use warnings;
use IPC::Run qw( start pump finish timeout );

my @cmd = ( "perl", "ask.pl" );

my $in = "ask something:\n";
my $out;
my $h = start( \@cmd, \$in, \$out, timeout(5) );

pump $h until $in =~ /something:/;
$in = "1234\n";
finish $h or die "app returned $?";

print "done";

这不起作用:

#!perl
use strict;
use warnings;
use IPC::Run qw( start pump finish timeout );

my @cmd = ( 'rsync', '-avr', 'user@host:/som/path/in/filesystem', '/target/folder' );

my $in = "password:\n";
my $out;
my $h = start( \@cmd, \$in, \$out, timeout(5) );

pump $h until $in =~ /password:/;
$in = "secret-password-here\n";
finish $h or die "app returned $?";

print "$out";
print "done";

那么如何为rsync提供密码?

我查看了其他线程(为SCP / SSH等提供密码),但解决方案是使用Expcect或密钥对。但是我不能使用Expect或密钥对。

1 个答案:

答案 0 :(得分:1)

您需要进行3项更改。

  1. 您必须使用pseudo tty来捕获密码提示。
  2. 要使其在IPC :: Run中运行,您必须run bash first然后使用您想要的命令。
  3. 您需要将$out/password:/而不是$in匹配。
  4. 这是脚本,希望它有所帮助:

    #!perl
    use strict;
    use warnings;
    use IPC::Run qw( start pump finish timeout );
    
    my @cmd = ('bash', '-c', 'rsync -avr user@host:/som/path/in/filesystem /target/folder');
    
    my $in;
    my $out;
    my $h = start \@cmd, '<pty<', \$in, '>pty>', \$out, timeout(5);
    
    pump $h until $out =~ /password:/;
    $in = "secret-password-here\n";
    finish $h or die "app returned $?";
    
    print "$out";
    print "done";