Использование ProxyCommand для нескольких прыжков и быстрой аутентификации

18

Как я могу переписать следующую команду с ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Это не работает

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Я знаю о его использовании с nc, но я ищу способ использовать его с 3+ прыжками, а также использовать эту опцию с scp. Я проверил ssh_configсправочную страницу, но информации довольно мало, по крайней мере, для меня.

РЕДАКТИРОВАТЬ

Я пытался использовать ProxyCommandвложенный в другом, ProxyCommandкак предложено ниже, но я всегда получаю что-то вроде следующего

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.

К счастью, поскольку 7.3 -Jили ProxyJumpслужит моей цели - хотя мне все еще приходится обходить настройку ключей.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
1,61803
источник

Ответы:

26

ncВерсия не рекомендуется больше. Используйте -Wпереключатель, который предоставляется в последних версиях OpenSSH. Кроме того, вам не нужно копировать конфигурацию на другие хосты! Все настройки должны быть выполнены на вашем хосте, и это никак не мешает работе scp. Просто создайте файл ~/.ssh/configс:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

А затем подключиться с помощью ssh serverили использовать scp file server:path/. Если вы настаиваете на oneliner (или не уверены, что вы имеете в виду под ProxyCommandвложением), то, как уже указывалось, это адские побеги:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

Вам в основном нужно идти изнутри.

Jakuje
источник
Благодарю. Пробовал однострочник, не работал. Я не знаю, если это только сбежать. Можете ли вы перепроверить, пожалуйста? Кроме того, можете ли вы объяснить, почему вложение необходимо и цепочка не работает?
1.61803 21.10.16
1
Ну, а что значит "не работает!" жадный? Цепочка работает, но не с scp, потому что SCP ожидает управляющие сообщения SCP, но вместо этого получает управляющие сообщения SSH и терпит неудачу. С другой стороны, ProxyCommandон делает это прозрачно, и поэтому самый внешний ssh(или scp) будет получать сообщения непосредственно с другого конца.
Jakuje
Я получаю > подсказку, где ожидает прерывания строки, я думаю - команда никогда не выполняется.
1.61803 22.10.16
1
@TrevorBoydSmith Потому что для этого требуется, чтобы на всех прокси-хостах была установлена ​​какая-то внешняя программа (nc). Перенаправление ввода-вывода с использованием -W в этом не нуждается, и единственное требование - установить на вашем компьютере клиент openssh.
Jakuje
2
Двойной @RomanDodin %должен работать: %%hв вашем случае
Jakuje
-1

Я сделал это с двумя прыжками, но это должно работать в течение трех. Самый простой способ - установить ~/.ssh/configфайл на каждом хосте. Итак, если вы хотите подключиться hostaи получить доступ hostdчерез via hostbи hostc`, вы можете настроить свои конфигурации следующим образом:

В hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

В hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

В hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Затем вы можете ssh hostdна любом из хостов в цепочке, и вы доберетесь до hostd.

Использование netcat для прокси не мешает scp.

Если по какой-то причине вы действительно не хотите использовать локальные ~/.ssh/configфайлы, вы можете сделать это на hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd
DopeGhoti
источник
Как я уже сказал, я знаю об ncиспользовании. Можете ли вы переписать команду, которую я опубликовал ProxyCommandв качестве опции?
1.61803 19.10.16
Вы упоминаете «вы знаете о его использовании, но хотите использовать scp». Это не мешает scp. Но я дам вам комично длинную команду как редактирование в ближайшее время.
DopeGhoti
Благодарю. Не могли бы вы просто переписать свой ответ, сосредоточившись на ProxyCommandвложенности? Если вы перечитаете мой пост, вы увидите, что это суть. Я думал , что я мог бы, вместо того , чтобы гнездиться , как вы делали, все цепи средних узлов ProxyCommand. Я все еще задаюсь вопросом, возможно ли это как-то.
1.61803 19.10.16
Это на самом деле то, что делается; это просто намного сложнее читать, чем конфигурации in situ из-за всех вложенных (и все более и более экранированных) цитат. Вы должны сделать это таким образом, потому что вы переносите все ProxyCommandдирективы вместе с вами на следующий хост в цепочке.
DopeGhoti
Это не правильно. Конфигурация только на вашем локальном компьютере, не распределяется между хостами в пути, как вы пытаетесь предложить.
Jakuje