在 .ssh/config 中测试操作系统

在 .ssh/config 中测试操作系统

我有一个远程服务器,其身份验证需要很长时间。因此,我想保持与 的连接打开ControlMaster。但是,ControlMaster视窗。我想.ssh/config在 Windows 和 Linux 上使用相同的软件,我会定期复制它们。

因此,我只想在 Linux 上激活它。我可以使用 sshs Matchconfig 来做到这一点:

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/


我该怎么做才能忽略这些消息?

我不知道该如何回答。我一直想要这个功能。

相关内容