Неопознанный параметр при использовании puttygen в командной строке Windows

Вопрос или проблема

Я установил PuTTYgen на Windows, используя: putty-64bit-0.79-installer.msi (который я скачал с официального сайта PuTTYgen).

Однако, когда я перехожу в cmd Windows и запускаю puttygen -V, я получаю ошибку

неизвестный параметр ‘-V’

Ошибка командной строки PuTTYgen

Худшее то, что это сообщение отображается независимо от введенного параметра.

Мне нужно использовать PuTTYgen как пакетный скрипт без перехода через интерфейс, чтобы преобразовать файл id_rsa в id_rsa.ppk.

Windows PuTTYgen в основном работает только с графическим интерфейсом. Похоже, что вы ожидаете, что он поддерживает те параметры командной строки, которые поддерживает консоль puttygen в Linux. Это не так.

Вместо этого вы можете использовать консоль WinSCP (winscp.com.exe), которая поддерживает некоторые функции консольного puttygen:

winscp.com /keygen id_rsa -o id_rsa.ppk

WinSCP не поддерживает переключатель -O, но -O private является значением по умолчанию (и единственным) преобразованием, которое он поддерживает.

(Я автор WinSCP)

Для других параметров см.:
Как преобразовать закрытый ключ SSH в .ppk в командной строке Windows?

Unix puttygen и Windows puttygen имеют разные параметры командной строки

Windows-версии имеют те же имена, что и их Unix-аналоги, но совершенно разную реализацию и разные параметры командной строки.

(Это довольно запутанно. Мне бы хотелось, чтобы существовал puttygen-unix и puttygen-windows.exe.)

Вот немного исходного кода. Без гарантий правильности.

$ git clone https://git.tartarus.org/simon/putty.git
Клонирование в 'putty'...
remote: Подсчет объектов: 40290, завершено.
remote: Обработка объектов: 100% (40290/40290), завершено.
remote: Сжатие объектов: 100% (13162/13162), завершено.
remote: Всего 40290 (delta 29618), повторно использовано 37730 (delta 27075)
Получение объектов: 100% (40290/40290), 83.29 MiB | 10.32 MiB/s, завершено.
Решение делт: 100% (29618/29618), завершено.

$ cd putty/

Парсинг командной строки кажется долгим и ручным.

Unix puttygen

Unix puttygen имеет следующие параметры:

$ grep -nE "strcmp.opt|case '.':" cmdgen.c
297:                  case '-': {
311:                    if (!strcmp(opt, "-help")) {
320:                    } else if (!strcmp(opt, "-version")) {
329:                    } else if (!strcmp(opt, "-pgpfp")) {
339:                    } else if (!strcmp(opt, "-old-passphrase")) {
351:                    } else if (!strcmp(opt, "-new-passphrase")) {
363:                    } else if (!strcmp(opt, "-random-device")) {
373:                    } else if (!strcmp(opt, "-dump")) {
375:                    } else if (!strcmp(opt, "-cert-info") ||
376:                               !strcmp(opt, "-certinfo") ||
377:                               !strcmp(opt, "-cert_info")) {
379:                    } else if (!strcmp(opt, "-primes")) {
405:                    } else if (!strcmp(opt, "-strong-rsa")) {
407:                    } else if (!strcmp(opt, "-certificate")) {
417:                    } else if (!strcmp(opt, "-remove-certificate")) {
419:                    } else if (!strcmp(opt, "-reencrypt")) {
421:                    } else if (!strcmp(opt, "-ppk-param") ||
422:                               !strcmp(opt, "-ppk-params")) {
447:                                    if (!strcmp(optvalue, "Argon2id") ||
448:                                        !strcmp(optvalue, "argon2id")) {
450:                                    } else if (!strcmp(optvalue, "Argon2i") ||
451:                                               !strcmp(optvalue, "argon2i")) {
453:                                    } else if (!strcmp(optvalue, "Argon2d") ||
454:                                               !strcmp(optvalue, "argon2d")) {
504:                  case 'h':
505:                  case 'V':
506:                  case 'P':
507:                  case 'l':
508:                  case 'L':
509:                  case 'p':
510:                  case 'q':
515:                      case 'h':
519:                      case 'V':
523:                      case 'P':
526:                      case 'l':
529:                      case 'L':
532:                      case 'p':
535:                      case 'q':
540:                  case 't':
541:                  case 'b':
542:                  case 'C':
543:                  case 'O':
544:                  case 'o':
545:                  case 'E':
561:                      case 't':
582:                      case 'b':
585:                      case 'C':
588:                      case 'O':
613:                      case 'o':
616:                      case 'E':

Windows puttygen.exe

Windows puttygen.exe имеет следующие параметры (и -V не является одним из них):

$ grep -n "match_opt" windows/puttygen.c
2417:    AuxMatchOpt amo = aux_match_opt_init(opt_error);
2420:        #define match_opt(...) aux_match_opt( \
2422:        #define match_optval(...) aux_match_opt( \
2437:        } else if (match_opt("-pgpfp")) {
2440:        } else if (match_opt("-restrict-acl", "-restrict_acl",
2443:        } else if (match_optval("-t")) {
2464:        } else if (match_optval("-b")) {
2466:        } else if (match_optval("-E")) {
2474:        } else if (match_optval("-primes")) {
2493:        } else if (match_opt("-strong-rsa")) {
2495:        } else if (match_optval("-ppk-param", "-ppk-params")) {
2550:        } else if (match_optval("-demo-screenshot")) {

Другие параметры Windows

Вот все параметры (по моему мнению) для Windows-версий:

$ ag "match_opt|strcmp.p," windows/
windows/CMakeLists.txt
7:  utils/aux_match_opt.c

windows/platform.h
856:AuxMatchOpt aux_match_opt_init(aux_opt_error_fn_t opt_error);
858:bool aux_match_opt(AuxMatchOpt *amo, CmdlineArg **val,

windows/pageant.c
1600:    AuxMatchOpt amo = aux_match_opt_init(opt_error);
1603:        #define match_opt(...) aux_match_opt( \
1605:        #define match_optval(...) aux_match_opt( \
1617:        } else if (match_opt("-pgpfp")) {
1620:        } else if (match_opt("-restrict-acl", "-restrict_acl",
1623:        } else if (match_opt("-restrict-putty-acl", "-restrict_putty_acl")) {
1625:        } else if (match_opt("-no-decrypt", "-no_decrypt",
1628:        } else if (match_opt("-keylist")) {
1630:        } else if (match_optval("-openssh-config", "-openssh_config")) {
1632:        } else if (match_optval("-unix")) {
1637:        } else if (match_opt("-c")) {

windows/plink.c
345:        } else if (!strcmp(p, "-s")) {
348:        } else if (!strcmp(p, "-V") || !strcmp(p, "--version")) {
350:        } else if (!strcmp(p, "--help")) {
353:        } else if (!strcmp(p, "-pgpfp")) {
356:        } else if (!strcmp(p, "-shareexists")) {
358:        } else if (!strcmp(p, "-sanitise-stdout") ||
359:                   !strcmp(p, "-sanitize-stdout")) {
361:        } else if (!strcmp(p, "-no-sanitise-stdout") ||
362:                   !strcmp(p, "-no-sanitize-stdout")) {
364:        } else if (!strcmp(p, "-sanitise-stderr") ||
365:                   !strcmp(p, "-sanitize-stderr")) {
367:        } else if (!strcmp(p, "-no-sanitise-stderr") ||
368:                   !strcmp(p, "-no-sanitize-stderr")) {
370:        } else if (!strcmp(p, "-no-antispoof")) {

windows/putty.c
64:            } else if (!strcmp(p, "-cleanup")) {
88:            } else if (!strcmp(p, "-pgpfp")) {
92:                       (!strcmp(p, "-host-ca") || !strcmp(p, "--host-ca") ||
93:                        !strcmp(p, "-host_ca") || !strcmp(p, "--host_ca"))) {
96:            } else if (!strcmp(p, "-demo-config-box")) {
104:            } else if (!strcmp(p, "-demo-terminal")) {

windows/puttygen.c
2417:    AuxMatchOpt amo = aux_match_opt_init(opt_error);
2420:        #define match_opt(...) aux_match_opt( \
2422:        #define match_optval(...) aux_match_opt( \
2437:        } else if (match_opt("-pgpfp")) {
2440:        } else if (match_opt("-restrict-acl", "-restrict_acl",
2443:        } else if (match_optval("-t")) {
2464:        } else if (match_optval("-b")) {
2466:        } else if (match_optval("-E")) {
2474:        } else if (match_optval("-primes")) {
2493:        } else if (match_opt("-strong-rsa")) {
2495:        } else if (match_optval("-ppk-param", "-ppk-params")) {
2550:        } else if (match_optval("-demo-screenshot")) {

windows/test/test_screenshot.c
20:    AuxMatchOpt amo = aux_match_opt_init(fatal_error);
23:        #define match_opt(...) aux_match_opt( \
25:        #define match_optval(...) aux_match_opt( \
30:        } else if (match_optval("-o", "--output")) {

windows/utils/aux_match_opt.c
16:AuxMatchOpt aux_match_opt_init(aux_opt_error_fn_t opt_error)
33:bool aux_match_opt(AuxMatchOpt *amo, CmdlineArg **val,

–foo против -foo на Windows

Кстати, -foo и --foo считаются эквивалентными:

$ head windows/utils/aux_match_opt.c
/*
 * Вспомогательная функция для сопоставления параметров командной строки в
 * вспомогательных утилитах Windows (PuTTYgen и Pageant).
 *
 * Основным образом поддерживает обычные варианты параметров, включая GNU-подобные
 * длинные параметры --foo и простые короткие параметры -f. Но исторически
 * эти инструменты также поддерживают длинные параметры с одним дефисом, так что
 * мы не придерживаемся полного GNU и не рассматриваем их как синтаксические ошибки.
 */

Некоторые параметры задокументированы

Некоторые, но не все (например, -demo-screenshot отсутствует), параметры задокументированы. Вот индекс из документации:

$ curl https://the.earth.li/~sgtatham/putty/latest/htmldoc/IndexPage.html --location 2>&1 | grep -i command.line.option | sed 's_ _\t_' | expand --tabs 30 | sed 's_: _:\t_' | expand --tabs 10 | sort
<code>-1</code>               параметр командной строки:          <a href="Chapter3.html#i187">Раздел 3.11.3.16</a><br>
<code>-2</code>               параметр командной строки:          <a href="Chapter3.html#i188">Раздел 3.11.3.16</a><br>
<code>-A</code>               параметр командной строки:          <a href="Chapter3.html#i171">Раздел 3.11.3.10</a><br>
<code>-a</code>               параметр командной строки:          <a href="Chapter3.html#i172">Раздел 3.11.3.10</a><br>
<code>-b</code>               параметр командной строки PSFTP:    <a href="Chapter6.html#i6">Раздел 6.1.1</a><br>
<code>-batch</code>           параметр командной строки Plink:    <a href="Chapter7.html#i10">Раздел 7.2.3.1</a><br>
<code>-batch</code>           параметр командной строки PSCP:     <a href="Chapter5.html#i27">Раздел 5.2.2.5</a><br>
<code>-batch</code>           параметр командной строки PSFTP:    <a href="Chapter6.html#i10">Раздел 6.1.4</a><br>
<code>-bc</code>              параметр командной строки PSFTP:    <a href="Chapter6.html#i8">Раздел 6.1.2</a><br>
<code>-be</code>              параметр командной строки PSFTP:    <a href="Chapter6.html#i9">Раздел 6.1.3</a><br>
<code>-C</code>               параметр командной строки:          <a href="Chapter3.html#i185">Раздел 3.11.3.15</a><br>
<code>-c</code>               параметр командной строки Pageant:  <a href="Chapter9.html#i12">Раздел 9.3.2</a><br>
<code>-cleanup</code>         параметр командной строки:          <a href="Chapter3.html#i130">Раздел 3.11.2</a><br>
<code>-D</code>               параметр командной строки:          <a href="Chapter3.html#i152">Раздел 3.11.3.5</a><br>
<code>-i</code>               параметр командной строки:          <a href="Chapter3.html#i197">Раздел 3.11.3.18</a><br>
<code>--keylist</code>        параметр командной строки Pageant:  <a href="Chapter9.html#i15">Раздел 9.3.5</a><br>
<code>-l</code>               параметр командной строки:          <a href="Chapter3.html#i148">Раздел 3.11.3.4</a><br>
<code>-L</code>               параметр командной строки:          <a href="Chapter3.html#i150">Раздел 3.11.3.5</a><br>
<code>-load</code>            параметр командной строки:          <a href="Chapter3.html#i134">Раздел 3.11.3.1</a><br>
<code>-ls</code>              параметр командной строки PSCP:     <a href="Chapter5.html#i18">Раздел 5.2.2.1</a><br>
<code>-m</code>               параметр командной строки:          <a href="Chapter3.html#i158">Раздел 3.11.3.6</a>, <a href="Chapter3.html#i160">Раздел 3.11.3.6</a><br>
<code>-N</code>               параметр командной строки:          <a href="Chapter3.html#i181">Раздел 3.11.3.13</a><br>
<code>--openssh-config</code> параметр командной строки Pageant:  <a href="Chapter9.html#i14">Раздел 9.3.3</a><br>
<code>-P</code>               параметр командной строки:          <a href="Chapter3.html#i163">Раздел 3.11.3.7</a><br>
<code>-p</code>               параметр командной строки PSCP:     <a href="Chapter5.html#i20">Раздел 5.2.2.2</a><br>
<code>-pgpfp</code>           параметр командной строки:          <a href="Chapter3.html#i210">Раздел 3.11.3.23</a>, <a href="AppendixF.html#i2">Приложение F</a><br>
<code>-pw</code>              параметр командной строки:          <a href="Chapter3.html#i166">Раздел 3.11.3.8</a><br>
<code>-pwfile</code>          параметр командной строки:          <a href="Chapter3.html#i165">Раздел 3.11.3.8</a><br>
<code>-q</code>               параметр командной строки PSCP:     <a href="Chapter5.html#i23">Раздел 5.2.2.3</a><br>
<code>-R</code>               параметр командной строки:          <a href="Chapter3.html#i151">Раздел 3.11.3.5</a><br>
<code>-r</code>               параметр командной строки PSCP:     <a href="Chapter5.html#i25">Раздел 5.2.2.4</a><br>
<code>-raw</code>             параметр командной строки:          <a href="Chapter3.html#i125">Раздел 3.11.1</a>, <a href="Chapter3.html#i143">Раздел 3.11.3.2</a><br>
<code>-rlogin</code>          параметр командной строки:          <a href="Chapter3.html#i123">Раздел 3.11.1</a>, <a href="Chapter3.html#i141">Раздел 3.11.3.2</a><br>
<code>-s</code>               параметр командной строки Plink:    <a href="Chapter7.html#i11">Раздел 7.2.3.2</a><br>
<code>-scp</code>             параметр командной строки PSCP:     <a href="Chapter5.html#i29">Раздел 5.2.2.6</a><br>
<code>-sercfg</code>          параметр командной строки:          <a href="Chapter3.html#i213">Раздел 3.11.3.24</a><br>
<code>-serial</code>          параметр командной строки:          <a href="Chapter3.html#i126">Раздел 3.11.1</a>, <a href="Chapter3.html#i144">Раздел 3.11.3.2</a><br>
<code>-sftp</code>            параметр командной строки PSCP:     <a href="Chapter5.html#i28">Раздел 5.2.2.6</a><br>
<code>-shareexists</code>     параметр командной строки Plink:    <a href="Chapter7.html#i14">Раздел 7.2.3.4</a><br>
<code>-ssh</code>             параметр командной строки:          <a href="Chapter3.html#i120">Раздел 3.11.1</a>, <a href="Chapter3.html#i138">Раздел 3.11.3.2</a><br>
<code>-ssh-connection</code>  параметр командной строки:          <a href="Chapter3.html#i121">Раздел 3.11.1</a>, <a href="Chapter3.html#i139">Раздел 3.11.3.2</a><br>
<code>-supdup</code>          параметр командной строки:          <a href="Chapter3.html#i124">Раздел 3.11.1</a>, <a href="Chapter3.html#i142">Раздел 3.11.3.2</a><br>
<code>-t</code>               параметр командной строки:          <a href="Chapter3.html#i178">Раздел 3.11.3.12</a><br>
<code>-T</code>               параметр командной строки:          <a href="Chapter3.html#i179">Раздел 3.11.3.12</a><br>
<code>-telnet</code>          параметр командной строки:          <a href="Chapter3.html#i122">Раздел 3.11.1</a>, <a href="Chapter3.html#i140">Раздел 3.11.3.2</a><br>
<code>-unsafe</code>          параметр командной строки PSCP:     <a href="Chapter5.html#i13">Раздел 5.2.1</a><br>
<code>-v</code>               параметр командной строки:          <a href="Chapter3.html#i146">Раздел 3.11.3.3</a><br>
<code>-X</code>               параметр командной строки:          <a href="Chapter3.html#i175">Раздел 3.11.3.11</a><br>
<code>-x</code>               параметр командной строки:          <a href="Chapter3.html#i176">Раздел 3.11.3.11</a><br>

Документация

Ответ или решение

При работе с PuTTYgen в Windows через командную строку могут возникнуть ситуации, когда возникает сообщение об ошибке «непризнанная опция». Это особенно актуально, если вы ожидаете, что поведение утилиты будет аналогично командной версии на Unix. В данной статье мы подробно разберем причины этой проблемы и предложим решения.

Причина проблемы

PuTTYgen, установленный на Windows, часто используется через графический интерфейс. Хотя во многих Unix-версиях утилита командной строки предоставляет обширные возможности с различными параметрами, версия для Windows имеет существенно ограниченный набор опций. Ошибка «непризнанная опция» возникает, когда вы пытаетесь использовать параметры, которые не поддерживаются версией PuTTYgen для Windows.

Например, когда вы выполняете команду puttygen -V, вы ожидаете получения информации о версии. Однако версия PuTTYgen для Windows не поддерживает данной опции, что приводит к ошибке.

Варианты решения

Если вы намерены конвертировать ключи SSH из формата id_rsa в id_rsa.ppk, существует несколько эффективных способов обойти данную проблему:

  1. Использование WinSCP:
    WinSCP предоставляет командную строку (winscp.com), которая поддерживает некоторые функции из PuTTYgen. Для преобразования ключа выполните следующую команду:

    winscp.com /keygen id_rsa -o id_rsa.ppk

    Обратите внимание, что WinSCP не поддерживает все возможные параметры, однако для базовых операций это решение будет идеальным.

  2. Использование графического интерфейса PuTTYgen:
    Если пропуск командной строки для вас является допустимым вариантом, вы можете открыть PuTTYgen через графический интерфейс, загрузить id_rsa и сохранить его как id_rsa.ppk.

  3. Создание и использование PowerShell:
    Если вы используете платформу Windows 10 или выше, попробуйте воспользоваться PowerShell для создания сценария, используя встроенные команды, для выполнения аналогичных задач.

Рекомендации по работе с PuTTYgen

  1. Чтение документации: Ознакомьтесь с официальной документацией по PuTTY и PuTTYgen для Windows, чтобы лучше понимать доступные команды и их параметры. Вы можете найти полную документацию здесь.

  2. Тестирование различных команд: Если возникает ошибка, попробуйте вводить другие доступные команды без параметров. Это поможет увидеть, какая базовая функциональность присутствует в вашей версии.

  3. Обновление версий: Убедитесь, что вы используете последнюю версию PuTTY, так как обновления могут содержать исправления и новые возможности.

Заключение

Ошибка «непризнанная опция» при работе с PuTTYgen может быть связана с различиями в реализации утилит для Windows и Unix. Мы рекомендуем использовать WinSCP или другие подходы для достижения ваших целей. Не забывайте также обращаться к документации и следить за обновлениями, чтобы оставаться в курсе возможностей, доступных в вашей среде.

Оцените материал
Добавить комментарий

Капча загружается...