我添加了这个来~/.ssh/config
帮助避免愚蠢的错误:
Host *.prod-domain.com
LocalCommand print "WARNING: PROD" && print "continue ?" && read
PermitLocalCommand yes
当我尝试连接到 下的主机时,这使得ssh
打印警告和提示prod-domain.com
。
现在,大多数主机不公开 ssh,所以我们必须通过网关。我以前这样做
ssh -J gateway.prod-domain.com target.prod-domain.com
但是启用本地命令后,ssh 会失败,并显示:
Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect
直接连接(例如ssh gateway.prod-domain.com
)仍然可以正常工作,并且如果我注释本地命令,则跳转连接也可以工作。
本地命令和 ssh 跳转是否不兼容?是否有文档记录?是否有方法使其工作(例如在“跳转”时禁用本地命令),或者我是否遇到了错误?
答案1
正如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
这样,您尝试执行的操作将起作用,只需确保不要使用“prod-domain”服务器作为跳转代理(当然,网关除外)。或者,为了完全避免交互式命令,您可以使用类似这样的命令:
Host *.prod-domain.com
LocalCommand echo -e "\x1b[30;41mWARNING: You are on a PRODUCTIVE system!\x1b0m"
PermitLocalCommand yes
这样,虽然您无法阻止会话建立,但您会收到一个大红色警告。