2014-10-01 3 views
3

У меня нет ожиданий, и я не заставляю его работать на моей машине. Я не использую пару ключей ssh ​​для rsync, но будет предоставлять пароль (нет, пароль не хранится в скрипте или где-то еще - это просто программа, откуда-то откуда-то откуда-то передается пароль и ее нужно вставить). Я использую cygwin на Windows x64Как ответить на запрос пароля rsync с помощью IPC :: Run?

Я попытался обработать его, используя IPC::Run, но мне не удалось. Так или иначе, подсказка пароля, похоже, ведет себя иначе, чем обычное приглашение.

Это работает:

Размножение сценарий ask.pl генерировать подсказку:

#!perl 
use strict; 
use warnings; 

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

Размножение сценарий ответить prmot ask.pl в:

#!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', '[email protected]:/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 или пару ключей.

+2

Как? Использование ожидания или ключевой пары конечно (извините). – AKHolland

+0

Возможно, вы можете запустить 'rsync' поверх' plink', который может получить пароль в качестве аргумента командной строки. – salva

+0

@AKHolland Я не могу использовать Expect, и я не могу использовать метод key-pair. Я ищу другой путь. Я думаю, что так просто «просто» записать пароль в приглашение. – capfan

ответ

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 [email protected]:/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"; 
Смежные вопросы