如何使用 ssh-add 列出添加到 ssh-agent 的密钥?

Pat*_*ryk 311 ssh key-authentication ssh-agent

如何以及在哪里可以检查已将哪些密钥添加ssh-add到我的ssh-agent?

ger*_*ijk 389

使用-l选项ssh-add按指纹列出它们。

$ ssh-add -l
2048 72:...:eb /home/gert/.ssh/mykey (RSA)
Run Code Online (Sandbox Code Playgroud)

或者使用-L以获取 OpenSSH 格式的完整密钥。

$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc[...]B63SQ== /home/gert/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

后一种格式与您将它们放入~/.ssh/authorized_keys文件中的格式相同。

  • 我认为“ssh-agent”可以选择执行此操作。 (5认同)
  • @gertvdijk 我实际上是在谈论命名。从名称`ssh-add` 听起来这个命令应该只向代理添加密钥。然后`ssh-agent` 应该知道它持有什么密钥。我的观点是不同的。 (5认同)
  • 如果启用了密钥代理转发,您可以在远程主机上运行此命令。 (4认同)
  • 示例:`ssh-agent sh -c 'ssh-add; ssh-add -l'` (3认同)
  • [rahul@srv1~]$ ssh-add -l 无法打开与您的身份验证代理的连接。 (2认同)

slm*_*slm 12

令人惊讶的是,MacOS 版本ssh-add在某些时候停止显示与 Linux 变体一样的文件名。我写了这个脚本,它对在~/.ssh/.

我调用函数ssh-add_wf, wf = with file. 该功能的详细信息如下:

$ type ssh-add_wf
ssh-add_wf is a function
ssh-add_wf ()
{
    while read -r line; do
        for file in ~/.ssh/*.pub;
        do
            printf "%s %s\n" "$(ssh-keygen -lf "$file" | awk '{$1=""}1')" "$file";
        done | column -t | grep --color=auto "$line" || echo "$line";
    done < <(ssh-add -l | awk '{print $2}')
}
Run Code Online (Sandbox Code Playgroud)

例子

$  ssh-add_wf
 SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  myuser@mydom.lan  (RSA)  /Users/myuser/.ssh/ssh_myuser@mydom.lan_id_rsa.pub
 SHA256:qInIrnKcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  myuser@mydom.com  (RSA)  /Users/myuser/.ssh/github_myuser@mydom.com_id_rsa.pub
 SHA256:tX+AAJA0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 SHA256:EyNkhTLQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  myuser@mydom.com  (RSA)  /Users/myuser/.ssh/ssh_myuser@mydom.com_id_rsa.pub
 SHA256:KKKVwtvFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 SHA256:tr0hZP52XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

上面,ssh-add~/.ssh/目录中文件匹配的 's 输出中的任何键都将在第 4 列的输出中包含文件名。任何没有该列的键都将是空的。在此输出中,我们有 3 个具有匹配文件的键。

功能力学

该脚本使用 2 个循环。外部循环是 a while,它接受 的输出ssh-add。此输出是加载到ssh-agent.

内部循环是一个for循环,它遍历与此模式匹配的所有文件的内容,~/.ssh/*.pub. 对于每个文件,我们对其进行查询ssh-keygen -lf <file>,然后删除此输出的第一列:

...前...

4096 SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

...后...

SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX myuser@mydom.lan

然后将此字符串与文件名一起打印:

printf "%s %s\n" "$(ssh-keygen -lf "$file" | awk '{$1=""}1')" "$file"

在这个循环的执行结束时如下:

| 列 -t | grep "$line" || 回声“$行”

这会格式化输出,使其为列格式 ( column -t)。

在这一点上,我们ssh-add通过grep "$line". 如果发现匹配,我们打印我们的printf输出,否则我们退回到刚刚打印从原来的指纹ssh-add$line

参考

  • 所发生的事情是,OpenSSH 采用了一种新的私钥存储格式,该格式支持私钥内的注释,如果您没有密码短语,当然无法更改私钥。如果私钥以这种新文件格式存储(您可以通过文件顶部的“BEGIN OPENSSH PRIVATE KEY”识别),则“ssh-add -l”将显示它;如果没有,它会显示加载密钥的文件的名称。 (4认同)