Назад | Перейти на главную страницу

Как получить запрос пароля от ssh в сценарии Perl

Когда я выполняю это из командной строки, мне предлагается ввести пароль Джо (это то, что я хочу):

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 или что-то подобное).