ProxyCommand 用于多跳和提示身份验证

ProxyCommand 用于多跳和提示身份验证

如何用 重写以下命令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 -JorProxyJump满足了我的目的——尽管我仍然需要解决我的按键设置问题。

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 serverscp 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并访问hostdviahostb和 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

相关内容