请注意,我在这里专门询问命令行,我确切地知道如何使用 ssh“配置”文件来解决这个问题。
从 Windows 到 Linux 计算机建立 ssh 连接时,您经常会收到“输入时 MAC 损坏”错误。
通过在命令行上指定 MAC 可以轻松纠正此问题,如以下两个示例中所示:
ssh -m hmac-sha2-256 [email protected]
ssh -o "MACs [email protected]" [email protected]
但是,如果我想使用计算机 1 作为计算机 2 的跳转主机,情况就不同了。标准命令行将是
ssh -J [email protected] [email protected]
这会产生上述错误(正如预期的那样)
但是,添加 MAC 选项(以各种方式)
ssh -J [email protected] -m hmac-sha2-256 [email protected]
ssh -m hmac-sha2-256 -J [email protected] [email protected]
ssh -J [email protected] -o "MACs [email protected]" [email protected]
ssh -o "MACs [email protected]" -J [email protected] [email protected]
对我来说毫无作用,我仍然收到错误。
记录显示,在我的设置中,只有 computer1 首先存在 MAC“问题”,当我在本地时,我可以直接连接到 computer2,而无需任何额外的设置。
那么,有没有什么办法可以解决这个问题,只使用命令行?
如果我将以下内容添加到我的 SSH 配置文件中,此设置将完美运行,但对于此处的用例,我非常希望有一个不依赖于配置文件的命令行解决方案。(也不依赖于服务器上配置的更改)。但事实上,此配置更改确实有效,这似乎表明我的环境没有任何问题(嗯,我猜除了 MAC 问题存在之外),这只是我的命令行选项的问题。
Host computer1.domain
MACs [email protected]
编辑:按照@George的建议添加 -vvv 揭示了一件看起来很有趣的事情,但我真的不知道如何解决它。根据调试消息,当使用 JumpHost 选项运行 ssh 时,会生成一个子命令,而命令行上指定的选项似乎没有被带进来,因此我仍然遇到原始问题:
debug1: Setting implicit ProxyCommand from ProxyJump: "ssh" -vvv -W "[%h]:%p" computer1.domain
debug1: Executing proxy command: exec "ssh" -vvv -W "[computer2.domain]:22" computer1.domain
debug3: spawning "ssh" -vvv -W "[computer2.domain]:22" computer1.domain as subprocess
其余的调试输出显示我的客户端同意 computer1 使用[email protected],而这正是我试图告诉它不要使用的 MAC 地址
没有
-J
ssh -o ProxyCommand='ssh -W %h:%p …' …
你可以用它做什么-J
。在这种形式中,你可以ssh
分别将选项传递给每个选项,这样你就可以-m
在需要的地方使用它:-J
/-o ProxyJump=
是在 2016 年的 OpenSSH 7.3 中引入的。在此之前,ProxyCommand=
使用跳转主机的方式如上所述。和
-J
man 1 ssh
OpenSSH明确指出:这意味着如果不使用某种文件,您就无法指定跳转主机的配置。您可以选择带有 的文件
-F
。从 OpenSSH来看,
ssh
如果不使用 ,它会读取配置文件两次-J
,而使用 时则会读取更多次-J
(您发现的子命令会自行读取配置);因此您不能使用ssh -F /dev/stdin …
或ssh -F <(cat <<'EOF' …
来管道传输新配置,因为管道只允许读取一次配置。如果您的 shell 是 Zsh,那么您可以使用
=(…)
创建临时常规文件的形式。常规文件可以多次读取。这应该有效:在不支持
=(…)
但可以使用 Zsh 的 shell 中,您可以将上述代码与 一起使用zsh -c
:如果没有 Zsh,你需要自己创建一个临时文件,使用它
ssh
然后删除它。例如: