我有一个远程服务器,其身份验证需要很长时间。因此,我想保持与 的连接打开ControlMaster
。但是,ControlMaster
在视窗。我想.ssh/config
在 Windows 和 Linux 上使用相同的软件,我会定期复制它们。
因此,我只想在 Linux 上激活它。我可以使用 sshs Match
config 来做到这一点:
Host jumphost-opn1
HostName 10.129.120.68
User kuga2
Match exec "test `uname -o` = GNU/Linux"
ControlMaster auto
ControlPath ~/.ssh/.sockets_%r@%h-%p
ControlPersist 600
这在 Linux(ControlMaster 处于活动状态)和 Windows(ControlMaster 处于非活动状态)上均按预期工作。但是在 Windows 上它会打印:
C:\WINDOWS\system32>ssh jumphost-opn2 uname
Der Befehl "test" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "test" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Linux
(命令“test”错误或未找到)
我该怎么做才能忽略这些消息?有没有一种独立于操作系统的方法来检查操作系统?还有其他 ssh-config 选项吗?
答案1
解决方案(我一直在使用的方法)
警告:请参阅下面的说明,包括要求
# Matches Windows
Match exec "dir c: 1>/dev/null 2>&1"
IdentityFile c:/Users/YOURUSERNAMEDIR/.ssh/id_rsa
# Matches linux and other similar unix-like systems
Match exec "dir /etc 1>/dev/null 2>&1"
ControlMaster auto
ControlPath ~/.ssh/.sockets_%r@%h-%p
ControlPersist 600
Host jumphost-opn1
HostName 10.129.120.68
User kuga2
几点说明:
- 要求:要使上述 Windows 版“Match Exec”正常工作,您必须创建文件夹“C:\dev”,因为默认情况下 Windows 上不存在“/dev/null”。每次在 Windows 上使用 ssh 时,“null”文件都会被重写为“dir c:”的输出。我通常通过文件资源管理器在属性中将此文件夹设置为“隐藏”,这样它就不会显示出来。
- 这个设计是基于“Match exec”的限制:
- 所有“Match exec”命令将始终执行,无论操作系统平台如何,并且如果返回 0,将使用任何缩进配置。因此它只允许两个“执行路径”(返回值 0 和返回值非 0)
- “Match exec” 使用 cmd shell 作为 Windows 10 上的默认 shell。我不确定是否有办法改变这种情况,因为我们可以在 Linux(通过 env 的 bash)和 Windows(默认为 powershell)中执行类似“> $null”的操作
- 在 cmd 和 bash 之间没有通用的方法重定向到“/dev/null”或“/tmp”
- 考虑到前两个事实,我们想要运行两次“Match exec”检查。在本例中:
- 前者“Match exec”在 Windows 上将返回 0,在 Linux 上将返回 1
- 后者“Match exec”在 Linux 上将返回 0,在 Windows 上将返回 1
- “匹配”指令可以按任意顺序排列
替代解决方案
如果您为了“智能”而牺牲清晰度,还有其他可能的解决方案。这些解决方案提供卓越的性能,并且没有文件系统副产品。从理论上讲,这将允许您支持更多操作系统(通过支持更多 shell),但由于这些 shell 之间缺乏通用语法和不可预测的返回代码,这不太可能。
例如,您可以按照存在“默认”条件的方式对语句进行排序,并利用“bashism”:
IdentityFile c:/Users/YOURUSERNAMEDIR/.ssh/id_rsa
Match exec "exit ${ONWINDOWS:=1}"
IdentityFile /mnt/c/Users/YOURUSERNAMEDIR/.ssh/id_rsa
我以前曾经使用过类似的东西,但是我用它换取了阅读时对我来说更清晰的解决方案。
我在我的配置文件的注释中有以下链接作为来源:https://creechy.wordpress.com/2021/02/03/quest-for-a-multi-platform-ssh-config/
我该怎么做才能忽略这些消息?
我不知道该如何回答。我一直想要这个功能。