예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스크립트나 다른 스크립트에 특수 플래그를 전달하여 런타임에 이 목록을 참조할 수 있는 방법이 있습니까 ? 아니면 이 유형 목록이 하드코딩되어 있고 이 매뉴얼 페이지에만 지정되어 있습니까? 내가 이 질문을 하는 이유는 쉘에게 인수를 자동 완성하는 방법을 가르치고 싶기 때문입니다 -t.

답변1

나는 :key 유형이 있어야 한다고 생각하지 않습니다.이것목록(페이지 상단의 "V_8_9_P1"이 아닌 사용 중인 openssh 버전을 나타내는 레이블로 전환):

        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/) 체인으로 가득 차 있으며 허용되는 키 목록을 인쇄하려면 또 다른 키가 필요하므로 실제 논리 동기화와 동일하게 저장하려면 추가 유지 관리가 필요합니다. :(

답변2

ssh -Q key

의 목록은 하드코딩되어 있으며 지원하기 위해 컴파일되었을 수 있는 --help실험적 키를 제외합니다.ssh-keygenxmss처럼. 이 명령은 ssh -Q key유효한 모든 매개변수를 표시합니다 ssh-keygen -t.

  • 동일한 옵션
  • 같은 도서관

이 답변은 의견에서 영감을 얻었습니다스티븐 차제라스. 그들이 언급한"이러한 모든 유형에 대한 키를 생성할 수 있는지 잘 모르겠습니다."둘 다 지원되는 것을 확인했습니다.

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

관련 정보