【问题标题】:How to answer the rsync password prompt using IPC::Run?如何使用 IPC::Run 回答 rsync 密码提示?
【发布时间】: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 上,似乎有一个使用期望的解决方案:stackoverflow.com/questions/12029140/…

标签: perl ipc


【解决方案1】:

您需要进行 3 项更改。

  1. 您必须使用pseudo tty 来捕获密码提示。
  2. 要使其在 IPC::Run 中运行,您必须 run bash first 然后输入您想要的命令。
  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";

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2013-02-09
    • 2010-11-21
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多