如果密钥已经在那里,请让ssh-add安静


16

我想放在ssh-add /path/to/special_key脚本的顶部。这可以正常工作,但始终提示您输入密码。这很奇怪,有点令人讨厌,因为即使ssh-add -l显示密钥已经被添加,它仍然要求输入密码。

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


Answers:


20

我看不到任何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

单线工作很好,谢谢!
达伦·库克

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

1
ssh-keygen在答案中不会生成密钥-与ssh-add -l您的示例相同,实际上不会添加任何内容。标志会修改命令的行为,因此它与名称不完全匹配。请注意,这些版本在功能上有所不同-如果按路径检查并且该路径上的键发生更改,则您的版本将不会使用它。答案中的版本也将检测现有密钥,无论它从何处加载。
Richlv

5

没有直接检查方法,只能使用,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

参考文献


3

您可能有ssh-add明确使用的特殊原因,但是如果您只想“我想在我第一次使用密钥时提示我输入密码短语,但此后不希望这样做,” openssh有一个更简单的解决方案:

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


谢谢。这显然是在ssh 7.2中添加的(Ubuntu 18似乎在7.6版中)。
达伦·库克

是的,“我的openssh版本不支持AddKeysToAgent”是明确使用ssh-add的一个很好的理由;-)
Nate

0

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

从手册页:

-K添加身份时,每个密码短语也将存储在用户的钥匙串中。当使用-d删除身份时,将从中删除每个密码短语。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.