Разрешить ssh имена хостов из конфигурации при использовании ProxyCommand и режима netcat

Разрешить ssh имена хостов из конфигурации при использовании ProxyCommand и режима netcat

Я пытаюсь настроить некоторые универсальные параметры для отскока 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

Связанный контент