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

Answers:


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

您基本上需要从内部走。


谢谢。尝试了单线,没有用。我不知道这是否只是逃避。你可以仔细检查一下吗?此外,您能否解释为什么嵌套是必需的,而链接却不起作用?
1.61803

1
好吧,“不起作用”是什么?意思?链接有效,但不能使用链接scp,因为SCP需要使用SCP控制消息,但会获取SSH控制消息而失败。另一方面,ProxyCommand它是透明进行的,因此最外面的ssh(或scp)将直接从另一端获取消息。
雅库耶

我想我会得到> 提示,提示正在等待中断行的继续,即该命令从不执行。
1.61803

1
@TrevorBoydSmith因为它要求您在所有代理主机上安装一些外部程序(nc)。使用-W的IO重定向不需要这样做,仅需要在计算机上安装openssh客户端即可。
贾库耶

2
@RomanDodin翻番%:应该工作%%h在你的情况
Jakuje

-1

我已经完成了跳,但是应该可以完成三跳。最简单的方法是~/.ssh/config在每个主机上设置文件。因此,如果您想打开hostahostd通过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

如我所说,我知道nc的使用。您实际上可以重写我ProxyCommand作为选项发布的命令吗?
1.61803

您提到“您知道它的用途,但想使用scp”。它不会干扰scp。但是我很快会给您一个可笑的长命令作为编辑。
DopeGhoti

谢谢。您能改写专注于ProxyCommand嵌套的答案吗?如果您重新阅读我的文章,您会发现要点。我以为可以,而不是像您一样嵌套,可以将中的所有中间节点链接起来ProxyCommand。我仍然想知道这是否有可能。
1.61803

实际上,这就是正在做的事情。由于所有嵌套的(而且越来越多的转义)引号,因此它比原位配置更难阅读。您必须那样做,因为您将所有ProxyCommand指令与您一起带到了链中的下一个主机。
DopeGhoti '16

错了 该配置仅在您的本地计算机上,不会像您建议的那样在主机之间分发。
贾库耶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.