Я думаю, что проблема с вашим примером - последние аргументы; вы 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 * , но я не обещаю, что он всегда работает во всех ситуациях, так как я изменил его с течением времени, как мне было нужно для в разных ситуациях, поэтому любой из вариантов может быть хрупким или даже сломанным, но это может помочь.