Как мне подключиться по SSH к машине A через B одной командой?

С помощью ProxyCommand в вашей конфигурации SSH.

Создайте файл конфигурации SSH в вашем домашнем каталоге (если вы не хотите сделать это общесистемным), ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)Hostname 12.34.45.56    # Change this IP address to the address of the brokerUser myusername         # Change this default user accordingly                         # (`user@unibroker` can overwrite it)Host internalmachine    # Machine A definition (the target host)ProxyCommand ssh -q unibroker nc hostname.or.IP.address.internal.machine 22

Теперь вы можете напрямую связаться с машиной А с помощью

ssh user@internalmachine

Также обратите внимание, что теперь у вас есть одно целевое имя SSH-хоста для него, вы можете использовать его и в других приложениях. Например.:

  • SCP для копирования файлов.

    scp somefile user@internalmachine:~/
  • В ваших приложениях с графическим интерфейсом:

    использовать sftp://user@internalmachine/ в качестве местоположения для просмотра на компьютере.

    На основе KDE (Dolphin): используйте fish://user@internalmachine/

Записи

Изменить hostname.or.IP.address.internal.machine и порт (22) к машине, до которой вы хотели бы дотянуться, как если бы вы были от unibroker машина.

В зависимости от версий netcat на хосте unibroker, -q0 опция должна быть опущена. Что касается аутентификации; вы в основном настраиваете два SSH-соединения со своей рабочей станции. Это означает, что как хост unibroker, так и хост internalmachine проверяются / аутентифицируются друг против друга (как для пары ключей / пароля, так и для проверки ключа хоста).

Объяснение

Этот подход к использованию ProxyCommand и "netcat" - это всего лишь один из способов сделать это. Мне это нравится, потому что мой SSH-клиент напрямую связывается с целевой машиной, так что я могу проверить ключ хоста у своего клиента, и я могу использовать аутентификацию с открытым ключом, не используя другой ключ у брокера.

Каждый Host определяет начало нового раздела хоста. Hostname является целевым именем хоста или IP-адресом этого хоста. User это то, что вы бы предоставили в качестве пользовательской части в ssh user@hostname.

ProxyCommand будет использоваться в качестве канала к целевой машине. Используя SSH для подключения к первой машине и непосредственно настраивая простой "netcat" (nc) к цели оттуда, это в основном просто пересылка открытого текста на внутреннюю машину от посредника между ними. То -q варианты заключаются в том, чтобы отключить любой вывод (просто личные предпочтения).

Убедитесь, что у вас установлен netcat на брокере (обычно доступен по умолчанию в Ubuntu) - либо netcat-openbsd Install netcat-openbsd или netcat-традиционный Install netcat-traditional.

Обратите внимание, что здесь вы по-прежнему дважды используете SSH с шифрованием. В то время как канал netcat является открытым текстом, ваш SSH-клиент на вашем ПК настроит другой зашифрованный канал с конечной целевой машиной.