我可以忽略 ssh 配置中的错误吗?

MEH*_*man 11 ssh openssh

我在 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

您可以Matchssh 配置文件中使用关键字来限制部分配置仅在特定条件下应用。对于问题中的摘录,类似于以下内容的内容应该有效:

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块被下一个终止MatchHost或文件的末尾。

请注意,这AddKeysToAgent不是特定于平台的,而是自 7.2 版以来在 OpenSSH 中可用,因此大概您在 Ubuntu 容器中使用的是较旧版本的 OpenSSH,但不在 Mac 主机上。


mos*_*svy 8

您应该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)