我的系统(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`)链,并且打印接受的密钥列表只需要另一个密钥,这需要额外的维护工作来保存与实际逻辑同步:(