如何使用 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 密码提示?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 IPC::Run 作业何时完成

Perl:使用 IPC::Run 进行 I/O 重定向

对 perl IPC::Run 感到困惑

rsync如何不指定密码文件

无密码通过ssh执行rsync

如何在不询问密码提示的情况下自动执行rsync [关闭]