- Вопрос или проблема
- Unix puttygen и Windows puttygen имеют разные параметры командной строки
- Unix puttygen
- Windows puttygen.exe
- Другие параметры Windows
- –foo против -foo на Windows
- Некоторые параметры задокументированы
- Документация
- Ответ или решение
- Причина проблемы
- Варианты решения
- Рекомендации по работе с PuTTYgen
- Заключение
Вопрос или проблема
Я установил PuTTYgen на Windows, используя: putty-64bit-0.79-installer.msi
(который я скачал с официального сайта PuTTYgen).
Однако, когда я перехожу в cmd Windows и запускаю puttygen -V
, я получаю ошибку
неизвестный параметр ‘-V’
Худшее то, что это сообщение отображается независимо от введенного параметра.
Мне нужно использовать 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>
Документация
- Документация PuTTY и утилит PuTTY, ориентированная на Windows:
- Руководство пользователя PuTTY: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/index.html
- PSCP: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/Chapter5.html
- PSFTP: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/Chapter6.html
- Plink: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/Chapter7.html
- PuTTYgen: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/Chapter8.html
- Pageant: https://the.earth.li/~sgtatham/putty/0.81/htmldoc/Chapter9.html
Ответ или решение
При работе с PuTTYgen в Windows через командную строку могут возникнуть ситуации, когда возникает сообщение об ошибке «непризнанная опция». Это особенно актуально, если вы ожидаете, что поведение утилиты будет аналогично командной версии на Unix. В данной статье мы подробно разберем причины этой проблемы и предложим решения.
Причина проблемы
PuTTYgen, установленный на Windows, часто используется через графический интерфейс. Хотя во многих Unix-версиях утилита командной строки предоставляет обширные возможности с различными параметрами, версия для Windows имеет существенно ограниченный набор опций. Ошибка «непризнанная опция» возникает, когда вы пытаетесь использовать параметры, которые не поддерживаются версией PuTTYgen для Windows.
Например, когда вы выполняете команду puttygen -V
, вы ожидаете получения информации о версии. Однако версия PuTTYgen для Windows не поддерживает данной опции, что приводит к ошибке.
Варианты решения
Если вы намерены конвертировать ключи SSH из формата id_rsa
в id_rsa.ppk
, существует несколько эффективных способов обойти данную проблему:
-
Использование WinSCP:
WinSCP предоставляет командную строку (winscp.com), которая поддерживает некоторые функции из PuTTYgen. Для преобразования ключа выполните следующую команду:winscp.com /keygen id_rsa -o id_rsa.ppk
Обратите внимание, что WinSCP не поддерживает все возможные параметры, однако для базовых операций это решение будет идеальным.
-
Использование графического интерфейса PuTTYgen:
Если пропуск командной строки для вас является допустимым вариантом, вы можете открыть PuTTYgen через графический интерфейс, загрузитьid_rsa
и сохранить его какid_rsa.ppk
. -
Создание и использование PowerShell:
Если вы используете платформу Windows 10 или выше, попробуйте воспользоваться PowerShell для создания сценария, используя встроенные команды, для выполнения аналогичных задач.
Рекомендации по работе с PuTTYgen
-
Чтение документации: Ознакомьтесь с официальной документацией по PuTTY и PuTTYgen для Windows, чтобы лучше понимать доступные команды и их параметры. Вы можете найти полную документацию здесь.
-
Тестирование различных команд: Если возникает ошибка, попробуйте вводить другие доступные команды без параметров. Это поможет увидеть, какая базовая функциональность присутствует в вашей версии.
-
Обновление версий: Убедитесь, что вы используете последнюю версию PuTTY, так как обновления могут содержать исправления и новые возможности.
Заключение
Ошибка «непризнанная опция» при работе с PuTTYgen может быть связана с различиями в реализации утилит для Windows и Unix. Мы рекомендуем использовать WinSCP или другие подходы для достижения ваших целей. Не забывайте также обращаться к документации и следить за обновлениями, чтобы оставаться в курсе возможностей, доступных в вашей среде.