我在 docker 容器中运行一个 ubuntu 镜像,我的 .ssh 目录是从我的原生 MacOs 环境安装的。
我的 .ssh/config 文件包含
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519_common
Run Code Online (Sandbox Code Playgroud)
这在 mac 上工作正常,但 AddKeysToAgent 和 UseKeychain 对 linux 无效,并且使用 openssh-client 包的任何东西(例如 git)不仅会忽略无法识别的指令,还会失败并退出。
有什么办法可以让我在 mac 和 linux 之间共享 .ssh/config 文件?
use*_*274 12
您可以Match在ssh 配置文件中使用关键字来限制部分配置仅在特定条件下应用。对于问题中的摘录,类似于以下内容的内容应该有效:
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519_common
Match exec "uname -s | grep Darwin"
UseKeychain yes
Run Code Online (Sandbox Code Playgroud)
在 linux 系统上,grep将返回失败 (1),因此将忽略以下行;在 Mac 主机上,grep 将返回成功 (0) 并应用该UseKeychain yes行。
的Match块被下一个终止Match,Host或文件的末尾。
请注意,这AddKeysToAgent不是特定于平台的,而是自 7.2 版以来在 OpenSSH 中可用,因此大概您在 Ubuntu 容器中使用的是较旧版本的 OpenSSH,但不在 Mac 主机上。
您应该IgnoreUnknown在您的早期使用该指令~/.ssh/config:
IgnoreUnknown UseKeychain,AddKeysToAgent
Run Code Online (Sandbox Code Playgroud)
从ssh_config(5)联机帮助页:
IgnoreUnknown指定在配置解析中遇到未知选项时要忽略的模式列表。如果
ssh_config包含无法识别的选项,这可用于抑制错误ssh(1)。建议IgnoreUnknown在配置文件的早期列出,因为它不会应用于出现在它之前的未知选项。
在openssh我可以测试的所有版本上,失败的Match条件不会阻止ssh在它未知的任何以下指令上出错:
$ cat ~/.ssh/config
Match !all
Foobar yes
$ ssh localhost
/home2/ahq/.ssh/config: line 2: Bad configuration option: foobar
/home2/ahq/.ssh/config: terminating, 1 bad configuration options
Run Code Online (Sandbox Code Playgroud)