Я пытаюсь записать открытый SSH-ключ, который у меня есть, в переменной и добавить его в SSH-файл author_keys (~/.ssh/authorized_keys
). Проблема в том, что он не добавляет его в новую строку.
Я получаю что-то вроде ниже из cat ~/.ssh/authorized_keys
, все в одной строке:
ssh-rsa ... original@hostssh-rsa ... root@anotherhost
Оболочка
sudo echo $SSH_KEY >> $SSH_AUTHORIZED_KEYS_FILE
Как я могу гарантировать, что это не сломает вещи?
Вы не можете использовать sudo
и echo
и >>
, так как >>
не будет выполняться с привилегиями суперпользователя. В вашем случае, если в '\n'
var нет $SSH_KEY
, просто используйте printf
, например. printf "%s\n" $SSH_KEY >> authorized_keys
ИЛИ если это отсутствие '\n'
в конце существующего authorized_keys
файла, то printf "\n%s\n" $SSH_KEY >> authorized_keys
Вы рассматривали возможность использования ssh-copy-id
?
В дополнение к тому, что сказал Гордон Дэвиссон: рекомендуется всегда следить за тем, чтобы текстовый файл заканчивался последним символом новой строки. Многие инструменты игнорируют последнюю «строку» файла, если она не завершена должным образом.
Используйте echo с опцией -e (которая позволяет интерпретировать экранирование обратной косой черты) и добавьте «\n» к тому, что вы пытаетесь добавить в файл. Это сначала записывает в файл символ новой строки, за которым следует значение вашей переменной.
echo -e "\n$SSH_KEY" >> $SSH_AUTHORIZED_KEYS_FILE
Обратите внимание, что запуск команды echo без опции -n автоматически добавит еще одну новую строку в конец вашего вывода. Если вы хотите предотвратить это, напишите:
echo -ne "\n$SSH_KEY" >> $SSH_AUTHORIZED_KEYS_FILE
Хотя echo -e
надежен, если вы уверены, что используете Bash, все же нет абсолютно никаких причин предпочитать его надежному стандарту POSIX, переносимому и универсальному printf
.
Вы никогда не должны захотеть не записывать последнюю новую строку при записи в текстовый файл, так как это делает его более недействительным текстовым файлом.
echo -e
даже не соответствует bash, это зависит от того, находится ли он в режиме POSIX (из-за установки set -o posix
или POSIXLY_CORRECT
, или эквивалентной опции времени компиляции, или...). Я настоятельно рекомендую вместо этого использовать printf
(как в printf '\n%s\n' "$SSH_KEY"
).
Похоже, что в исходном файле отсутствует новая строка, которая должна быть в конце. Если это проблема, см. «Добавить новую строку, только если она не существует».