У меня есть tcl сценарий, который вызывает много функций от удара включая ssh. Часть, с которой я борюсь, похожа на это:
proc connect {where} {
set bash c:/cygwin/bin/bash
catch {exec $bash -c "ssh $where"} result
puts $result
}
connect user@localhost
Я получаю аутентификацию отказавшее сообщение:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password,keyboard-interactive).
Я не могу выяснить, как запросить (или показ консоли или tk окно, действительно не имеет значения), пользователь для пароля, таким образом, аутентификация проходит.
Причина я использую удар для ssh, состоит в том, потому что в конечном счете я хочу соединиться с GitHub со сценарием (должен запросить ключ доступа).
Попробуйте следующее:
puts -nonewline "enter your passphrase: "
flush stdout
gets stdin passphrase
exec $bash -c "ssh $where" << $passphrase
Аргумент <<
к exec
передает заданное значение команде на ее stdin
Если это не сработает, вам придется попробовать Expect, или использовать ключ без парольной фразы.
Одна из важных альтернатив (которую я советую) - это настроить локальный агент обработки ключей (например, ssh-agent
или pageant
) для держите дешифрованный ключ, чтобы ваш код вообще не обрабатывал пароли. Я считаю, что в целом это гораздо более простой метод, потому что он не позволяет большому количеству кода понимать что-либо о паролях (которые труднее правильно обрабатывать, чем вы думаете…)