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

Dar*_*ook 23 ssh shell-script ssh-agent

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

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

Lar*_*ach 27

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

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

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

假设这个指纹看起来像 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
Run Code Online (Sandbox Code Playgroud)

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

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个简化的单行代码更容易理解,而且更可取,因为它避免了`ssh-keygen`(毕竟,我不想生成任何密钥),而是使用密钥路径:`ssh-add -升 | grep -q 'path/to/key' || ssh-add /path/to/key` (2认同)

小智 9

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

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


slm*_*slm 5

没有直接的方法来检查使用 justssh-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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

输出的内容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)
Run Code Online (Sandbox Code Playgroud)

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

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c
Run Code Online (Sandbox Code Playgroud)

参考