man ssh
говорит:
SSH_ASKPASS
If ssh needs a passphrase, it will read the passphrase from the
current terminal if it was run from a terminal. If ssh does not
have a terminal associated with it but DISPLAY and SSH_ASKPASS
are set, it will execute the program specified by SSH_ASKPASS
and open an X11 window to read the passphrase.
Я бы хотел, чтобы SSH использовал программу askpass, даже если она запускалась из терминала.
Иногда мне приходится подключаться к серверам, где появляется некоторая задержка при отображении запроса пароля (возможно, из-за проблем с сетью, может быть из-за попыток обратного поиска DNS,…). Я раздражаюсь и переключаюсь на что-то другое, и забываю о попытке соединения. (Вставьте шутку о концентрации внимания золотой рыбки.) Когда я, наконец, вернусь к ней, время ожидания подсказки истекло, и даже правильный пароль привел бы к закрытому соединению.
Ключи были бы одним решением, но не каждая система, которую я использую, имеет мои обычные ключи SSH. Однако я обычно использую системы Ubuntu, и в Ubuntu по умолчанию установлена программа SSH askpass.
Однако если всплывет окно «Аскпас», я сразу узнаю об этом. Это достаточно хороший компромисс для меня, если только я смогу заставить его работать.
/dev/tty
(LD_PRELOAD
?).Ответы:
Это будет немного сложнее, но сочетание нескольких частей сделает его работоспособным:
объяснение
Чтобы заставить
ssh
использовать$SSH_ASKPASS
программу, вы не можете позволитьssh
увидеть реальноеtty
. Это просто состояние. Это можно сделать, используяsetsid
и используя-n
переключатель вssh
.Этот случай может инициировать соединение, но вы не сможете взаимодействовать с оболочкой, что, вероятно, также является вашим требованием;) (а также нарушает ваш локальный TTY).
Но вы можете отказаться от «первого сеанса». Вы также должны добавить
-N
переключатель, который подавляет удаленную команду и выполняет только аутентификацию .Также возможный вывод «мусор» может быть перенаправлен,
&> /dev/null
если вы не заинтересованы в нем.Установить
ControlMaster
вssh_config
. Это отличная функция, и как только соединение установлено, вы можете довольно быстро «запустить» сеанс. Этот фрагмент~/.ssh/config
должен сделать это:Вы можете добавить это в некоторый
host
блок, перечисляющий ваших «медленных кандидатов», или просто везде. Это почти без накладных расходов.Финальная линия
Тогда вы сможете подключиться к хосту, который, как вы ожидаете, займет некоторое время:
Весь процесс можно упростить,
alias
или функция bash выполняет оба действия за один шаг, но это остается на воображение читателей.Только аргументы командной строки
Вы можете объединить обе вещи в командной строке без
ssh_config
части:Следующая функция должна работать, если не указаны параметры SSH:
-f
инструктирует SSH перейти в фоновый режим непосредственно перед выполнением программы, то есть после получения пароля.-w
говоритsetsid
ждать окончания программы. В этом случае это происходит, когда SSH переходит в фоновый режим. В сочетании сssh -f
этим ручное ожидание между двумя командами SSH может быть исключено.источник
ControlMaster
уже настроен именно потому, что в таких случаях вводить пароли очень сложно. Не должно быть сложно написать функцию, которая тестирует существующий мастер и использует askpass, если он не может его найти. Спасибо!Руководство по SSH (
man ssh
):Поэтому вам необходимо отключить терминал (например, путем добавления канала) и убедиться, что
DISPLAY
он не установлен (если вы хотите использовать терминал для своей фразы-пароля).Простой пример:
То же самое с
ssh-add
:источник
Pseudo-terminal will not be allocated because stdin is not a terminal
, так что кажется, что труба что-то делает.ssh </dev/null
имел тот же эффект. Однако в обоих случаях он все еще запрашивает пароль, и я все еще могу ввести его. Я пробовал на Linux и Mac. Я пытался,ssh -vvv
но это не говорит ничего полезного.SSH_ASKPASS=/foo DISPLAY= setsid ssh host
работает хотя.