我有 3 台电脑:
1. 我的 Mac 装有 macOS Catalina
2. 我的第一台 Raspberry Pi
3. 我的第二台 Raspberry Pi
我的 Mac 上的 ssh 运行版本:OpenSSH_8.1p1、OpenSSL 1.1.1d 2019 年 9 月 10 日
我能够通过 ssh 分别登录每个 Raspberry Pi。
我想通过跳过第一台 Pi 来从我的 Mac SSH 到第二台 Pi。像这样:
+-------+ +--------+ +--------+
| Mac | ----> | raspi1 | ----> | raspi2 |
+-------+ +--------+ +--------+
使用这个 .ssh/config 文件:
Host 1pi
HostName raspi1
User pi
#IdentityFile ~/.ssh/id_ed25519
Host 2pi
HostName raspi2
User pi
ProxyJump 1pi
#IdentityFile ~/.ssh/id_ed25519
虽然我能够登录到第一个 Raspberry Pi,但是尝试登录到第二个 Pi 时总是出现同样的错误。
$ ssh 2pi
kex_exchange_identification: banner line contains invalid characters
我甚至尝试使用 IdentityFile 参数并仅使用 -J 选项。但结果仍然相同。
$ ssh -J pi@raspi1 pi@raspi2
kex_exchange_identification: banner line contains invalid characters
我在 macOS Mojave 上试过,成功了。我在 Linux 上试过,成功了。
如何让它在 macOS Catalina 上运行?如何从第一个 Pi 跳转到第二个 Pi?
当我这样做时,ssh 2pi -vv
我得到了这个(以及其他调试信息)
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 2097152 rmax 32768
debug1: kex_exchange_identification: banner line 0: \033[H\033[2JSSH-2.0-OpenSSH_7.9p1 Raspbian-10+deb10u1
kex_exchange_identification: banner line contains invalid characters
debug1: channel 0: free: direct-tcpip: listening port 0 for raspi2 port 22, connect from 127.0.0.1 port 65535 to UNKNOWN port 65536, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Killed by signal 1.
答案1
OpenSSH_8.1p1 有一个错误,它将%n
和交换了%h
。由于ProxyJump
本质上使用ProxyCommand ssh -W %h:%p
,因此它实际上发送的是Host
名称而不是HostName
(1pi
而不是raspi1
)。
如果您不想费力安装 OpenSSH_8.2p1 或其他任何版本,您可以将其替换ProxyJump 1pi
为ProxyCommand ssh -W %n:%p 1pi
,直到 Apple 替换 OpenSSH 版本。考虑到 Apple 是报告该错误的人(感谢 Pierre-Olivier),我假设它将在下一个 10.15.4 Beta 中更新。
如果您对源代码感兴趣,可以在此处找到该错误:https://github.com/openssh/openssh-portable/commit/fbe24b142915331ceb2a3a76be3dc5b6d204fddf#diff-5bfa45f3fb322e569a8101399c9c551cR1372
作为上述答案的替代,有一个可能更简单的答案可以解决您的问题,并且当 Apple 发布修复程序时不会让您更改任何内容。
只需将其添加2pi
到您的/etc/hosts
文件中raspi1
即可。例如{IP address of 2pi} 2pi
。假设您的 IP 地址是 192.168.1.10,则它将是:
echo "192.168.1.10 2pi" | sudo tee -a /etc/hosts