Сценарий Bash: добавить текст в файл с новой строки?

Я пытаюсь записать открытый 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

Как я могу гарантировать, что это не сломает вещи?

Похоже, что в исходном файле отсутствует новая строка, которая должна быть в конце. Если это проблема, см. «Добавить новую строку, только если она не существует».

Gordon Davisson 02.04.2023 10:48

Вы не можете использовать 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

David C. Rankin 02.04.2023 11:12

Вы рассматривали возможность использования ssh-copy-id?

KamilCuk 02.04.2023 11:43

В дополнение к тому, что сказал Гордон Дэвиссон: рекомендуется всегда следить за тем, чтобы текстовый файл заканчивался последним символом новой строки. Многие инструменты игнорируют последнюю «строку» файла, если она не завершена должным образом.

user1934428 03.04.2023 08:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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.

tripleee 02.04.2023 12:58

Вы никогда не должны захотеть не записывать последнюю новую строку при записи в текстовый файл, так как это делает его более недействительным текстовым файлом.

tripleee 02.04.2023 12:59
echo -e даже не соответствует bash, это зависит от того, находится ли он в режиме POSIX (из-за установки set -o posix или POSIXLY_CORRECT, или эквивалентной опции времени компиляции, или...). Я настоятельно рекомендую вместо этого использовать printf (как в printf '\n%s\n' "$SSH_KEY").
Gordon Davisson 05.04.2023 02:50

Другие вопросы по теме