Быстрое решение в Perl:
perl -lane '$a = -1; for(0..$#F) {$a = $_ + 1 if $F[$_] =~ /^ssh-|^ecdsa-/; };
die if $a == -1; $p = (4 - length($F[$a]) % 4) % 4;
$F[$a] .= "=" x $p; print join " ", @F' < authorized_keys > authorized_keys2
Для каждой строки (-n
) авторазделите (-a
) поля на @F
вдоль пробелов, затем найдите поле, содержащее тип ключа, следующее - ключ. Вычтите из 4 длину по модулю 4, чтобы получить количество знаков =
, которые нам нужно добавить, кроме того, возьмите еще один модуль, чтобы превратить 4 в 0 в случае, если поле уже имеет правильную длину.
В руководстве сказано, что
открытый ключ протокола 2 состоит из: options, keytype, base64-encoded key, comment. Поле options является необязательным; его наличие определяется тем, начинается ли строка с числа или нет
но это не совсем верно, поскольку типы ключей v2 также не начинаются с чисел. Поле options может содержать пробелы, поэтому позиция типа ключа может быть любой. На самом деле нам следует разобрать опции, чтобы найти любые строки с кавычками, но эвристический поиск известных типов ключей не помешает.