Я пытаюсь настроить некоторые универсальные параметры для отскока ssh-соединений. Вот мой ~/.ssh/config
файл, сокращенный:
Host *%via
ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p
Host gateway
HostName gateway.example.com
User username
ForwardAgent yes
IdentityFile keypathg
Host target
User username
HostName target.example.com
IdentityFile keypatht
Когда я использую *%via
псевдонимы Host
, я получаю:
% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host
Однако, если я использую
% ssh target.example.com%via
Я зашел на целевой сервер, но как неправильный пользователь и без аутентификации по открытому ключу.
ядуматьмой вопрос, на данный момент, заключается в том, проходит ли этот метод отскока, при использовании ForwardAgent
, через всю мою конфигурацию/среду ssh или только ключи. Если только ключи, можно ли каким-то образом использовать первое?
Моя версия ssh — 5.9v1, gateway — 5.9v1, а target — 5.3p1. Я думаю, что -W
это было введено в 5.4, но это не должно иметь значения для последнего блока в линии? Использование старой школы, nc
похоже, ничем не отличается.
Я проверил, что могу вручную подключиться по ssh к каждому ящику в строке. Это означает, что информация о псевдониме имени хоста не передается, так как на шлюзе я не могу, ssh target
но могу ssh target.example.com
. Это работает с аутентификацией по открытому ключу. Кстати, шлюз и цель имеют одно и то же имя пользователя, поэтому это работает, если не отправляется конфигурация.
Если ForwardAgent
или подобная конфигурация не может передать эту информацию, какой самый разумный способ обойти это, сохранив .ssh/config на шлюзе с этой информацией?
решение1
Ого, спасибо, что задали этот вопрос. Я редко вижу, чтобы кто-то полностью эксплуатировал SSH, и этот вопрос затрагивает несколько областей.
Это не ProxyCommand
проблема. ProxyCommand
Просто инструктирует локального клиента ssh сделать что-то в качестве подготовки, прежде чем пытаться связаться с удаленным клиентом. Да, в нашем случае мы общаемся с другим сеансом ssh, но этот сеанс с просто -W
принимает наши входные данные и пересылает их на другую машину. Вы можете считать этот подготовительный сеанс ssh полностью независимым. Неизбежная аналогия с автомобилем: ваш автомобиль — это тот же автомобиль, независимо от того, пришлось ли вам ехать на пароме, чтобы добраться из пункта А в пункт Б.
Это не проблема ForwardAgent
. ForwardAgent
предоставляет ли локальный клиент возможность сделать локальные ключи доступными в среде удаленного сеанса. Вы не прошли дальше установления удаленного сеанса.
Это .ssh/config
проблема формата. Обратите внимание на вторую и третью строки debug1. Они перечисляют, какие строфы Host применяются из вашего .ssh/config
. Вы замечаете, что это $ ssh target.example.com%via
работает, но как неправильное имя пользователя и ключ. Ну, строфа для Host target
не читается (что предоставило бы правильное имя пользователя и ключевой файл). Какие строфы используются? *
и *%via
.
Как заставить эти параметры пройти? Что ж, довольно интересно, подстановочный знак соответствует строкам длиной 0. Host target*
будет соответствовать target
, target%via
, target.example.com
и target.example.com%via
.
И вот вы задаете вопрос, поможет ли установка .ssh/config
на gateway
машине. Нет, не поможет. Она никогда не будет прочитана. Все происходит с нашей локальной машины.
Все, что я объяснил, лишь отвечает на вопрос, почему $ ssh target.example.com%via
что-то не работает.
Вы предпочитаете $ ssh target%via
. Правильно, так удобнее. Короткая форма дает сбой, потому что, как имя хоста, target
не найдено; оно не разрешается. Почему нет, не выдает ssh: ssh: Could not resolve hostname target: Name or service not known
? Потому что ProxyCommand
уже успешно установлено. Элементы соединения ssh были созданы, но сбой имени хоста происходит там, где он не ожидает, и поэтому он вылетает с более общим сообщением. Я бы отправил отчет об ошибке по этому поводу, чтобы помочь определить, где можно улучшить отладочную информацию.
Заключительный комментарий:
Мне нравится Host *%via
синтаксис. Он чистый, но гибкий. Я видел его раньше, Host *+*
и он использует как первую, так и последнюю часть %h(ost)
для определения того, куда идти. Но требуется немного больше усилий, чтобы вникнуть в это. ссылка:http://wiki.gentoo.org/wiki/SSH_jump_host