OpenSSH多平台配置-如何避免匹配EXEC错误消息?

人气:1,067 发布:2022-10-16 标签: windows cross-platform windows-subsystem-for-linux openssh

问题描述

我开始在Windows、WSL2和Git for Windows中使用具有相同配置的OpenSSH客户端。

在配置的某些位置,我需要基于平台的条件配置。目前我在~/.ssh/config中使用这样的部件:

# Identity agent socket override for Windows
Match !exec "uname -o | grep -qE 'Linux|Msys'"
    IdentityAgent \.pipeopenssh-ssh-agent
Match exec "uname -o | grep -q 'Msys'"
    IdentityAgent /c/Users/username/tmp/cyglockfile
在具有unamegrep命令的类Unix环境中,它可以完美地工作。在Windows上它可以工作(就像现有命令返回假状态一样),但我收到关于不存在的命令的恼人的错误消息:

PS C:Usersusername> ssh machine
'uname' is not recognized as an internal or external command,
operable program or batch file.
'uname' is not recognized as an internal or external command,
operable program or batch file.
'uname' is not recognized as an internal or external command,
operable program or batch file.
...

是否有为不存在的命令隐藏Match exec错误消息的选项?

我知道我可以创建自己的平台测试脚本,但我不想在所有环境中维护它。

推荐答案

解决方案(我一直在使用的解决方案)

警告:请参阅下面的说明,包括要求

Match exec "dir c: 1>/dev/null 2>&1"
  IdentityFile c:/Users/YOURUSERNAMEDIR/.ssh/id_rsa
Match exec "dir /etc 1>/dev/null 2>&1"  
  IdentityFile /mnt/c/Users/YOURUSERNAMEDIR/.ssh/id_rsa

注意事项:

要求:要完成此工作,您必须创建文件夹";C:dev";,因为默认情况下Windows上不存在";/dev/null";。每次在Windows上使用ssh时,";空";文件都将随环境一起重写。我通常通过文件资源管理器在属性中将此文件夹设置为&Hidden&Quot;,这样它就不会显示。 此设计基于Match Exec的局限性(&Q;): 所有匹配EXEC";命令将始终执行,而与操作系统平台无关,如果返回0,则将使用任何缩进配置。因此它只允许两个执行路径(返回值0和返回值非0) &Match exec";使用cmd外壳作为Windows 10上的默认外壳。我不确定是否有办法更改这一点,因为我们可以在Linux(Bash Via Env)和Windows(默认情况下是PowerShell)中执行类似的操作 在cmd和bash之间没有重定向到";/dev/ull";或";/tmp";的通用方法 考虑到前面两个事实,我们要运行两个匹配执行检查。在本例中: 以前的匹配执行在Windows上将返回0,在Linux上将返回1 后一个匹配执行将在Linux上返回0,在Windows上返回1 匹配指令可以采用任意顺序

替代解决方案

如果您为了智能而牺牲清晰度,那么还有其他可能的解决方案。这些解决方案提供卓越的性能,并且没有文件系统副产品。从理论上讲,这将允许您支持更多操作系统(通过支持更多外壳程序),但这不太可能,因为这些外壳程序之间缺乏通用语法和不可预测的返回代码。

例如,您可以按照存在默认条件的方式对语句进行排序,并利用&q;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/

是否有为不存在的命令隐藏Match EXEC错误消息的选项?

我对此没有答案。我想要这个特殊功能已经有一段时间了。

顺便说一句,我认为您要做的事情通常是由ssh-agent处理的。如中所示:默认情况下,您在每个Unix/Windows系统上分别配置ssh-agent以使用一个或多个SSH密钥,因此在";.ssh/config";中不需要引用。但是,当要求比您的问题更复杂时(这可能是您的情况),这不适用。

165