是的ssh -Q key

是的ssh -Q key

我的系统(Fedora 35)上 ssh-keygen 的手册页显示支持以下类型的密钥:

-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa
         Specifies the type of key to create.  The possible values are
         “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk”, or “rsa”.

有没有办法在运行时通过向脚本ssh-keygen或其他脚本传递一些特殊标志来查阅此列表?或者这个类型列表是硬编码的并且仅在此手册页中指定?我问这个问题的原因是我想教我的 shell 如何自动完成参数-t

答案1

我不认为有:关键类型需要在列表(切换到代表您正在使用的 openssh 版本的标签,而不是页面顶部的“V_8_9_P1”):

        case KEY_DSA_CERT:
        case KEY_DSA:
            name = _PATH_SSH_CLIENT_ID_DSA;
            break;
#ifdef OPENSSL_HAS_ECC
        case KEY_ECDSA_CERT:
        case KEY_ECDSA:
            name = _PATH_SSH_CLIENT_ID_ECDSA;
            break;
        case KEY_ECDSA_SK_CERT:
        case KEY_ECDSA_SK:
            name = _PATH_SSH_CLIENT_ID_ECDSA_SK;
            break;
#endif
        case KEY_RSA_CERT:
        case KEY_RSA:
            name = _PATH_SSH_CLIENT_ID_RSA;
            break;
        case KEY_ED25519:
        case KEY_ED25519_CERT:
            name = _PATH_SSH_CLIENT_ID_ED25519;
            break;
        case KEY_ED25519_SK:
        case KEY_ED25519_SK_CERT:
            name = _PATH_SSH_CLIENT_ID_ED25519_SK;
            break;
        case KEY_XMSS:
        case KEY_XMSS_CERT:
            name = _PATH_SSH_CLIENT_ID_XMSS;

没有办法查询这个。我可以理解为什么——这在 C++ 或任何其他现代语言中很容易,但 C 不仅不会在其标准库中引入任何“map<key, value>”类型,它也确实可以安全地进行构建,或者使用它们,相对困难。

因此,C 代码中充斥着switch/ case(或者,如果密钥无法转换为整数,if/则 else if`)链,并且打印接受的密钥列表只需要另一个密钥,这需要额外的维护工作来保存与实际逻辑同步:(

答案2

是的ssh -Q key

请注意,中的列表是硬编码的,并且将排除可能已编译以支持的--help实验密钥ssh-keygen像xmss。该命令ssh -Q key将显示所有有效参数ssh-keygen -t,假设它们都是用

  • 相同的选项
  • 相同的库

这个答案的灵感来自于评论斯蒂芬·查泽拉斯。他们提到“我不确定它是否能够为所有这些类型生成密钥。”我已经检查过它们都受支持,

for c in $(ssh -Q key); do ssh-keygen -t "$c"; done < /dev/null

相关内容