如何使用 IPC::Run 回答 rsync 密码提示?
Posted
技术标签:
【中文标题】如何使用 IPC::Run 回答 rsync 密码提示?【英文标题】:How to answer the rsync password prompt using IPC::Run? 【发布时间】:2014-10-01 09:40:09 【问题描述】:我没有 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 或密钥对。
【问题讨论】:
怎么样?当然使用期望或密钥对(对不起)。 您可以在plink
之上运行rsync
,它可以获得密码作为命令行参数。
@AKHolland 我不能使用 Expect,也不能使用密钥对方法。我正在寻找另一种方式。我想以某种方式“简单地”将密码写入提示符是可能的。
这似乎与a problem I had 相似,这是由于使用另一种类型的读取来获取密码。
Qtax 的解决方案看起来很有希望。在 Linux 或 cygwinm 上,似乎有一个使用期望的解决方案:***.com/questions/12029140/…
【参考方案1】:
您需要进行 3 项更改。
-
您必须使用pseudo tty 来捕获密码提示。
要使其在 IPC::Run 中运行,您必须 run bash first 然后输入您想要的命令。
您需要将
$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";
【讨论】:
以上是关于如何使用 IPC::Run 回答 rsync 密码提示?的主要内容,如果未能解决你的问题,请参考以下文章