Você pode usar o Expect. Consulte o link
(e as perguntas frequentes sobre o módulo Esperar sobre este tópico link ...)
Quando eu executo isso a partir da linha de comando, sou solicitado pela senha do joe (que é o que eu quero):
ssh -t 192.168.1.32 'scp [email protected]:/etc/hosts /tmp'
Quando tento executar o mesmo comando a partir de um script perl, ele fica pendurado (sem prompt):
'ssh -t 192.168.1.32 'scp joe\@192.168.1.31:/etc/hosts /tmp'';
Como posso fazer isso funcionar a partir de um script Perl?
Observação: não, não posso usar a autenticação baseada em chave para isso.
Você poderia usar o Net::SCP
para esse Perl, que seria o solução mais limpa (all-perl, sem chamadas de comandos externos).
Ou você pode fazer como Andrew sugere e usar o Expect (que provavelmente é mais rápido).
Ou você poderia fork()
, exec()
e waitpid()
(deixar seu comando scp
ter o terminal do qual seu script Perl está sendo executado para que possa obter senhas de você, que é um bom Unix antigo -a abordagem, mas muito mais trabalho do que eu estaria disposto a fazer pessoalmente).
TIMTOWTDI. : -)
Eu tive exatamente o mesmo tipo de problemas há algum tempo.
A razão pela qual ele trava é porque o ssh gera um terminal para a entrada de senha. Perl não pode pegar este terminal (por motivo). A string "Password" nunca é vista pelo perl.
É melhor usar as libs (bibliotecas Net :: SSH2 ou algo similar).