Я думаю, что проблема с вашим примером - последние аргументы; вы ssh
к B, когда вы должны перечислить "конечный пункт назначения", хотя хост / порт, перенаправленный на порт, это порт 10000, но должен быть localhost
, а не B
, так как B
разрешается с точки зрения A
, и порт 10000 на B
, вероятно, не открыт внешне. Например, исправлено:
ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p user_on_B@B" -p 10000 localhost
Чтобы доказать это самому себе, я настроил тот же эксперимент, хотя и немного проще, поскольку мое имя пользователя одинаково на всех хостах, и я использую переадресацию агента; обратите внимание, что мой hophost
(ваш B
) принимает SSH на нестандартный порт, 2222.
На C:
ssh -fNAR 12345:localhost:22 hophost -p 2222
Тогда на А:
ssh -A localhost -p 12345 -o "ProxyCommand ssh -A hophost -p 2222 nc %h %p"
В качестве альтернативы, вы можете закодировать это в свой .ssh/config
на A:
Host C
HostName localhost
Port 12345
ForwardAgent yes
#ProxyCommand ssh -A hophost -p 2222 nc %h %p
ProxyCommand ssh -A hophost -p 2222 -W %h:%p
#ProxyCommand $HOME/.ssh/proxy -w 2 -h hophost:2222 %h %p
Тогда ваша команда на А просто
ssh C
Обратите внимание, я также включил две альтернативные версии ProxyCommand
. Первый использует nc
если ваша версия ssh
старше 5.3, когда была добавлена опция -W
. Другой использует прокси-скрипт, который я использовал в течение долгого времени, для обхода некоторых хостов (как в этом примере) и использования corkscrew
для выхода из брандмауэров, которые блокируют исходящий ssh
. Вы можете увидеть скрипт ssh-proxy
на моем github. Он упрощает записи ~/.ssh/config
когда вы хотите использовать прокси для записей Host *
, но я не обещаю, что он всегда работает во всех ситуациях, так как я изменил его с течением времени, как мне было нужно для в разных ситуациях, поэтому любой из вариантов может быть хрупким или даже сломанным, но это может помочь.