如果密钥已存在,请让 ssh-add 保持安静

如果密钥已存在,请让 ssh-add 保持安静

我想放在ssh-add /path/to/special_key脚本的顶部。这工作正常,但它总是提示输入密码。这很奇怪,而且有点烦人,因为即使ssh-add -l显示密钥已经添加,它仍然要求输入密码。

有没有办法告诉它:“添加此密钥并询问密码(如果尚未添加),否则什么都不做”?

答案1

我没有看到任何 ssh-add 选项可以帮助实现您想要的结果,但是考虑到您特别关心一个密钥,解决这个问题非常容易。

首先,获取您的special_key的指纹:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

假设这个指纹看起来像 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25

然后,在脚本的顶部,用来ssh-add -l检查该键是否已加载,然后提示添加它:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

如果您愿意,您可以将所有这些折叠成一行:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

答案2

您可能有特殊的原因要ssh-add显式使用,但如果您只想“我想在第一次使用密钥时提示输入密码,但之后不再提示”,openssh 有一个更简单的解决方案:

放入你的文件AddKeysToAgent yes中。.ssh/config

答案3

没有直接的方法来检查,ssh-add但您可以使用ssh-keygen一些脚本来检查。

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

yes如果文件所表示的指纹/path/to/special_key出现在ssh-add -l的输出中,则将打印上面的内容。

例子

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

输出的内容ssh-keygen -lf /path/to/special_key如下所示:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

我们使用“awk '{print $2}”仅选择包含指纹的第二列,即:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

参考

答案4

ssh-add --apple-use-keychain FILE在 Mac 上对我来说工作得很好。
它仍然显示“已添加身份:”行,但不要求输入密码。

从手册页:

--apple-use-keychain 添加身份时,每个密码也将存储在用户的钥匙串中。当使用 删除身份时-d,每个密码都将从其中删除。

相关内容