Я хотел бы установить переменную для вывода команды ssh в zsh. Сама команда ssh подключается к первому серверу, а затем снова подключается по ssh с этого сервера ко второму серверу, где я хочу выполнить свою команду.

Вот команда (отлично работает при вводе в оболочке):

ssh -t host1 "ssh -t host2 "uname -a""

У меня есть настройка ssh-ключа для host1, поэтому соединение не запрашивает пароль. У меня его нет для последующего соединения между host1 и host2, поэтому я должен ввести пароль.

Теперь я хотел бы сохранить содержимое uname в переменной для использования в моем скрипте zsh. Я наивно пытался

a=$(ssh -t host1 "ssh -t host2 "uname -a"")

но, кажется, навсегда зависает, почему-то интерактивная подсказка для входа в систему пароля не перенаправлена ко мне. Если после этого я попробую повторить запрос echo $a то user@host2's password:' чтобы подтвердить его

Я думаю, что что-то пошло не так, как zsh обрабатывает кавычки и двойные кавычки, но я не мог понять, что именно. Я перепробовал много вариантов, но безуспешно.

1 ответ1

0

Это определенно не связано с цитированием (которое, вероятно, должно быть ssh -t host1 "ssh -t host2 \"uname -a\""). Кавычки применяются только к аргументам командной строки, а не к вводу / выводу команды. Только $() может повлиять на вывод.

Проблема может быть просто в том, как ssh обрабатывает ввод / вывод tty. Похоже, что ssh (здесь ssh -t host1) не использует клиентское оконечное устройство, даже если у него есть одно доступное - вместо этого он записывает в stdout, который захватывает $() .


Лучшим решением было бы настроить аутентификацию по ключу между локальным и host2, затем добавить ваши ключи в ssh-agent и использовать опцию "Переадресация агента": ssh -A host1 ssh host2 uname -a . Таким образом, вам не нужно никуда копировать свой закрытый ключ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .