Когда я выполняю это из командной строки, мне предлагается ввести пароль Джо (это то, что я хочу):
ssh -t 192.168.1.32 'scp joe@192.168.1.31:/etc/hosts /tmp'
Когда я пытаюсь запустить ту же команду из сценария perl, она просто зависает (без приглашения):
`ssh -t 192.168.1.32 'scp joe\@192.168.1.31:/etc/hosts /tmp'`;
Как я могу заставить эту работу работать с Perl-скриптом?
Примечание. Нет, я не могу использовать для этого аутентификацию на основе ключей.
Вы можете использовать Expect. Видеть https://stackoverflow.com/a/1366802
(и FAQ по модулю Expect по этой теме http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod#I_want_to_automate_password_entry_for_su/ssh/scp/rsh/...)
Вы можете использовать Perl's Net::SCP
для этого, что было бы самым чистым (полностью на Perl, без внешних вызовов команд) решением.
Или вы могли бы сделать как Эндрю предлагает и используйте Expect (что, вероятно, быстрее).
Или ты мог fork()
, exec()
, и waitpid()
(позволяя вашему scp
У команды есть терминал, с которого запускается ваш Perl-скрипт, чтобы он мог получать от вас пароли, что является хорошим подходом Unix-y старой школы, но гораздо больше работы, чем я бы хотел сделать лично).
TIMTOWTDI. :-)
Некоторое время назад у меня были точно такие же проблемы.
Причина зависания в том, что ssh порождает терминал для ввода пароля. Perl не может поймать этот терминал (не зря). Строка «Пароль» никогда не видна perl.
Лучше использовать библиотеки (Net :: SSH2 libs или что-то подобное).