我没有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或密钥对。
答案 0 :(得分:1)
您需要进行3项更改。
$out
与/password:/
而不是$in
匹配。这是脚本,希望它有所帮助:
#!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";