当我从命令行执行这个,我得到提示乔的密码(这是我想要的):
ssh -t 192.168.1.32 'scp [email protected]:/etc/hosts /tmp'
当我尝试从perl脚本运行相同的命令,它只是挂在那里(没有提示):
`ssh -t 192.168.1.32 'scp joe\@192.168.1.31:/etc/hosts /tmp'`;
我怎样才能从Perl脚本做这项工作?
注意:不,我无法使用基于密钥的身份validation。
你可以使用Expect。 请参阅https://stackoverflow.com/a/1366802
(以及有关此主题的Expect模块常见问题解答http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod#I_want_to_automate_password_entry_for_su/ssh/scp/rsh/ …)
您可以使用Perl的Net::SCP ,这将是最干净的(全部,无外部命令调用)解决scheme。
或者你可以像Andrewbuild议的那样去使用Expect(这可能更快)。
或者你可以fork() , exec()和waitpid() (让你的scp命令有你的Perl脚本运行的terminal,这样它可以从你那里得到密码,这是一个很好的旧式Unix-y方法,但比我愿意亲自做更多的工作)。
TIMTOWTDI。 🙂
前段时间我也有类似的问题。
挂起的原因是因为ssh产生了一个input密码的terminal。 Perl不能捕捉这个terminal(原因)。 “密码”string永远不会被Perl看到。
最好使用libs(Net :: SSH2库或类似的东西)。