有没有办法列出 ssh-keygen 支持哪些类型的密钥?

hug*_*omg 7 ssh ssh-keygen

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

\n
-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa\n         Specifies the type of key to create.  The possible values are\n         \xe2\x80\x9cdsa\xe2\x80\x9d, \xe2\x80\x9cecdsa\xe2\x80\x9d, \xe2\x80\x9cecdsa-sk\xe2\x80\x9d, \xe2\x80\x9ced25519\xe2\x80\x9d, \xe2\x80\x9ced25519-sk\xe2\x80\x9d, or \xe2\x80\x9crsa\xe2\x80\x9d.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Mar*_*ler 2

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

\n
        case KEY_DSA_CERT:\n        case KEY_DSA:\n            name = _PATH_SSH_CLIENT_ID_DSA;\n            break;\n#ifdef OPENSSL_HAS_ECC\n        case KEY_ECDSA_CERT:\n        case KEY_ECDSA:\n            name = _PATH_SSH_CLIENT_ID_ECDSA;\n            break;\n        case KEY_ECDSA_SK_CERT:\n        case KEY_ECDSA_SK:\n            name = _PATH_SSH_CLIENT_ID_ECDSA_SK;\n            break;\n#endif\n        case KEY_RSA_CERT:\n        case KEY_RSA:\n            name = _PATH_SSH_CLIENT_ID_RSA;\n            break;\n        case KEY_ED25519:\n        case KEY_ED25519_CERT:\n            name = _PATH_SSH_CLIENT_ID_ED25519;\n            break;\n        case KEY_ED25519_SK:\n        case KEY_ED25519_SK_CERT:\n            name = _PATH_SSH_CLIENT_ID_ED25519_SK;\n            break;\n        case KEY_XMSS:\n        case KEY_XMSS_CERT:\n            name = _PATH_SSH_CLIENT_ID_XMSS;\n
Run Code Online (Sandbox Code Playgroud)\n

没有办法查询这个。我可以理解为什么 \xe2\x80\x93 这在 C++ 或任何其他现代语言中很容易,但 C 不仅不在其标准库中引入任何“map<key, value>”类型,而且还这样做使得安全地建造或使用它们相对困难。

\n

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

\n