Туннелируйте ssh-соединение через промежуточный компьютер одной командой

10

Есть ли способ, с помощью одной команды, установить ssh-соединение от моего компьютера A, через компьютер B, к компьютеру C, чтобы у меня был доступ к оболочке на компьютере C?

Морщинка (которая, по-видимому, исключает простую переадресацию ssh-соединения с помощью опции -L), состоит в том, что у меня есть пароль к учетной записи на компьютере B, а учетной записи на компьютере B разрешено подключаться к учетной записи на компьютере C, но У меня нет пароля к учетной записи на компьютере C.

вменяемость
источник

Ответы:

8

Я понял, что вы хотите просто войти на компьютер C, а не туннелировать что-либо от A до C. Итак, это должно сработать:

ssh -t computer-b "ssh computer-c"

Возможно, вам придется вводить пароли дважды, сначала для компьютера B, а затем для компьютера C, но этого можно избежать с помощью аутентификации пары ключей ssh.

аф.
источник
1
Спасибо, это работает! Если я могу быть настолько смелым, чтобы попросить о продолжении. Любые идеи, как я могу scp файл из A в C в одной команде?
здравомыслие
Это немного сложно. Это можно сделать, добавив tar к миксу, но если в нем всего один файл, а на компьютере B есть место на диске для его хранения, скопировать его намного проще в два этапа.
аф.
Вы также можете сделать это три раза! ssh -t computer-b "ssh -t computer-c 'ssh computer-d'": D
Гак
0

Вы, вероятно, хотите использовать ProxyCommand SSH: http://benno.id.au/blog/2006/06/08/ssh_proxy_command

Рори
источник
Я не могу найти способ заставить это работать, потому что у меня нет пароля для компьютера C, и этот подход требует его. Открыт для предложений, хотя, как этот подход кажется более элегантным.
здравомыслие
0

Если вы используете ssh-ключи, вы можете сгенерировать новый ключ для машины B и использовать его для подключения от A к B. На машине B вы можете добавить

command="ssh C" ssh-....

в ~/.ssh/authorized_keysфайле. Это означает, что всякий раз, когда вы подключаетесь к B с помощью этого ключа ssh, он выполняет ssh Cкоманду.

Я не знаю, работает ли это с scp.

Рори
источник
0

использование ProxyCommand

См man ssh_config. Я рекомендую использовать ProxyCommand. Давайте возьмем ваш оригинальный сценарий:

  • Компьютер A (ваш компьютер)
  • Компьютер B (имя хоста прокси)
  • Компьютер C (доступен только через SSH с компьютера B)

Изменить ~/.ssh/configсо следующим содержанием.

Host computerb
    HostName <hostname or IP of Computer B>

Host computerc 192.168.35.*
    ProxyCommand ssh computerb nc -w 180 %h %p

Теперь вы сможете прозрачно добраться до компьютера C.

ssh computerc

Преимущества этого метода

Более безопасный

Вам нужен только ваш закрытый ключ, чтобы быть на компьютере A (ваш компьютер). Команда ncбудет действовать как прокси, по которому SSH будет шифровать трафик. Это включает в себя аутентификацию. Распространение вашего личного ключа на несколько серверов - очень плохая идея (поскольку любой скомпрометированный сервер с вашим закрытым ключом в конечном итоге ставит под угрозу ваш закрытый ключ).

Соответствует нескольким направлениям

Можно использовать несколько компьютеров назначения Host. Один компьютер или любой компьютер в определенной сети (например, 192.168.35.0/24в приведенном выше примере) для прокси через компьютер B. Он также служит псевдонимом.

ssh 192.168.35.27

В приведенном выше примере он будет прокси через компьютер B, чтобы получить IP-адрес.

Дейзи цепи прокси

Используя этот метод, вы можете подключить столько автоматических прокси, сколько необходимо. Например, вы можете добавить компьютер D, который доступен только с компьютера C, и он будет работать прозрачно.

Host computerd
    ProxyCommand ssh computerc nc -w 180 %h %p

ssh computerdавтоматически прокси через компьютер C и компьютер B в приведенных выше ssh_configпримерах.

Сэм Глеске
источник
Я использую ProxyJump вместо ProxyCommand, и он работает нормально. Кажется, теперь есть больше вариантов.
fgiraldeau