我在我的中添加了这个~/.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 跳转是否不兼容?它是否记录在某处,有没有办法让它工作(比如在“跳跃”时禁用本地命令),或者我是否遇到了错误?
正如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)
这样,虽然您无法阻止会话建立,但您将收到一个大红色警告。