Why doesn't SSH client in second case offer the public key?
Открытый ключ предлагается клиентом, если он существует (т.е. файл существует и находится в той же папке, что и закрытый ключ с тем же именем + ".pub" ).
This is a mandatory step in key-based authentication, isn't it?
Нет, предлагать открытый ключ необязательно. Обязательным является только доказательство того, что клиент владеет закрытым ключом.
Дополнительные пояснения можно найти здесь :https://security.stackexchange.com/a/152638Чтобы проиллюстрировать оба случая:
- Предложение открытого ключа с последующим подтверждением наличия у клиента закрытого ключа
debug1: Authentications that can continue: publickey,password debug1: Offering public key: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM '.ssh/id_rsa' debug3: send_pubkey_test debug3: send packet: type 50 debug2: we sent a publickey packet, wait for reply debug3: receive packet: type 60 debug1: Server accepts key: pkalg ssh-rsa blen 535 debug2: input_userauth_pk_ok: fp SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM debug3: sign_and_send_pubkey: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM debug3: send packet: type 50 debug3: receive packet: type 52 debug1: Authentication succeeded (publickey).
- Только подтвержденный клиент имеет закрытый ключ
debug1: Authentications that can continue: publickey,password debug1: Trying private key: '.ssh/id_rsa' debug3: sign_and_send_pubkey: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM debug3: send packet: type 50 debug2: we sent a publickey packet, wait for reply debug3: receive packet: type 52 debug1: Authentication succeeded (publickey).
Обратите внимание, что если открытый ключ с именем
.ssh/SD.pub
существует и НЕ связан с закрытым ключом.ssh/SD
(из-за предыдущей генерации ключа, например ), соединение не будет установлено. Согласно журналу, предоставленному ОП, здесь это не так, но это проблема, с которой я столкнулся, когда дошел до этого вопроса. В этом случае журнал на стороне клиента выглядит следующим образом (и не содержит явных сведений о том, почему авторизация не удалась):debug1: Next authentication method: publickey debug1: Offering public key: RSA SHA256:p5eJ+CJ1aRR9xeEcQUDCkbnQ3VUxa8cxjlWUhsYfla4 '.ssh/id_rsa' debug3: send_pubkey_test debug3: send packet: type 50 debug2: we sent a publickey packet, wait for reply debug3: receive packet: type 51 debug1: Authentications that can continue: publickey,password
Если вы хотите изменить содержимое /tmp/file
, вместо того, чтобы просто отображать измененный вывод на стандартном выводе, вам нужно использовать параметр perl
's -i
для редактирования "в -месте" файл. См. man perlrun
и найдите -i
для получения подробной информации.
Кроме того, указывайте свои переменные в кавычках при их использовании (например.$host
).
Кстати, вы меняете два разных шаблона на одно и то же значение — пробел. Для этого не нужны две отдельные операции s///
.
ssh "root@$host" perl -p -i -e 's/value1|value2/ /' /tmp/file
Даже если вам нужны две разные операции, вы можете разделить их двоеточием -с запятой(;
).
ssh "root@$host" perl -p -i -e 's/value1/foo/;s/value2/bar/' /tmp/file
Если вы хотите сделать резервную копию исходного файла, -i
принимает необязательный суффикс. например.
ssh "root@$host" perl -p -i.bak -e 's/value1|value2/ /' /tmp/file
/tmp/file
будет скопировано в /tmp/file.bak
перед редактированием perl.
Вы могли бы сделать это так же легко и немного быстрее (, вероятно, незаметно, если не запускать много раз в цикле )с sed
, который также имеет эквивалентную опцию -i
.
Изman sed
:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
ssh "root@$host" sed -i -e 's/value1\|value2/ /' /tmp/file
или с опцией sed -E
для расширенных регулярных выражений (ERE)
ssh "root@$host" sed -i -E -e 's/value1|value2/ /' /tmp/file
Кстати, вы можете разделить несколько команд sed с помощью ;
, как и в perl.