如何用 重写以下命令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 [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.
幸运的是,因为7.3
-J
orProxyJump
满足了我的目的——尽管我仍然需要解决我的按键设置问题。
ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
答案1
使用简单的ssh
配置文件
nc
不建议将该版本与较新版本的ssh
.请改用-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/
或进行连接rsync
。
附注
对于那些喜欢在 ssh 配置文件中使用绘图而不是文本的人来说,这里是一个信号流程图:
localhost
||
\/
username1@jumphost1
||
\/
username2@jumphost2
||
\/
username3@jumphost3
||
\/
username4@server
pps for fun 这里是一个单行,但请注意这种方法很难打字也很难阅读:
ssh -oProxyCommand= \
'ssh -W %h:%p -oProxyCommand= \
\'ssh -W %h:%p -oProxyCommand= \
\\\'ssh -W %h:%p username1@jumphost1\\\' \
username2@jumphost2\' \
username3@jumphost3' \
username4@server
你基本上需要从内部开始。
答案2
我已经这样做了二啤酒花,但它应该适用于三个。最简单的方法是~/.ssh/config
在每个主机上设置该文件。因此,如果您想打开hosta
并访问hostd
viahostb
和 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