SSH跳转和本地命令

Ant*_*ine 5 ssh

我在我的中添加了这个~/.ssh/config以帮助避免愚蠢的错误:

Host *.prod-domain.com
    LocalCommand print "WARNING: PROD" && print "continue ?" && read
    PermitLocalCommand yes
Run Code Online (Sandbox Code Playgroud)

这使得ssh打印警告并提示,当我尝试连接到下一个主机prod-domain.com

现在,大多数主机不会公开暴露 ssh,因此我们必须通过网关。我曾经做过

ssh -J gateway.prod-domain.com target.prod-domain.com
Run Code Online (Sandbox Code Playgroud)

但是在启用本地命令的情况下,ssh 失败:

Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect
Run Code Online (Sandbox Code Playgroud)

直接连接(例如ssh gateway.prod-domain.com)仍然可以正常工作,如果我评论本地命令,则使用跳转连接可以工作。

本地命令和 ssh 跳转是否不兼容?它是否记录在某处,有没有办法让它工作(比如在“跳跃”时禁用本地命令),或者我是否遇到了错误?

Lac*_*cek 8

正如ssh_config联机帮助页所说:

该命令是同步运行的,并且无法访问生成它的 ssh(1) 的会话。它不应用于交互式命令。

您的问题出在read语句上,它搞乱了在通过创建的隧道中执行的 SSH 协商过程gateway.prod-domain.com

您可以配置您的客户端,以便只有“端点”给您警告,网关不会,通过在您~/.ssh/config的网关中有一个空条目,如下所示:

Host gateway.prod-domain.com gateway
    HostName gateway.prod-domain.com

Host *.prod-domain.com
    ProxyJump gateway
    LocalCommand print "WARNING: PROD" && print "continue ?" && read
    PermitLocalCommand yes
Run Code Online (Sandbox Code Playgroud)

这样,您尝试做的将起作用,只是确保不要使用“prod-domain”服务器作为跳转代理(当然网关除外)。或者,为了完全避免交互式命令,您可以使用以下内容:

Host *.prod-domain.com
    LocalCommand echo -e "\x1b[30;41mWARNING: You are on a PRODUCTIVE system!\x1b0m"
    PermitLocalCommand yes
Run Code Online (Sandbox Code Playgroud)

这样,虽然您无法阻止会话建立,但您将收到一个大红色警告。