Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Как вставить новую строку в существующий файл?  (Прочитано 1297 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
Добрый вечер!есть конфиг openvpn файла клиента

#указываем сертификаты
ca ca.crt
cert client.crt
key client.key

надо добавить заместо client.crt и client.key новые имена rust.crt и rust.key
Т.е после строки ca ca.crt добавить две новые с rust.crt и rust.key
Возможно строки cert и key я просто уберу,надо только после ca ca.crt добавить две новые

имя будет определяться $keyname

читал про echo только не понял как добавлять после определенной сроки


P.S: скрипт должен взять существующий файл и добавить новые строки после ca ca.crt. Строки cert $keyname.crt и key $keyname.key
« Последнее редактирование: 16 Февраль 2014, 23:59:12 от djrust »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
sed -ie "s/^\(сert\).*$/\1 ${keyname}.crt/" -e "s/^\(key\).*$/\1 ${keyname}.key/" имя_файла
« Последнее редактирование: 17 Февраль 2014, 00:09:53 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
Спасибо!

А как потом этот же файл чистить?
Т.е скрипт отрабатывает и мы получаем архив с ключами и файлом конфигурации openvpn

Т.е файл берется добавляется инфа,архивируется...потом этот файл должен остаться прежним
можно конечно удалять и копировать такой же,но не красиво!
« Последнее редактирование: 17 Февраль 2014, 00:14:01 от djrust »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Подробнее можно? Что значит "чистить" | "должен остаться прежним" ?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
Есть готовый файл конфигурации,там должно изменяться только
cert client.crt
key client.key
потом этот файл должен архивироваться

Потом при создании нового ключа берется новый $keyname и новый файл $keyname.ovpn

Т.е берем готовый файл добавляем туда две строки с $keyname
потом sudo cp shablon.ovpn $keyname.ovpn

потом shablon должен остаться прежним


Или вариант два..

Создавать новый файл $keyname.ovpn из шаблона shablon.ovpn ,и добавлять туда две строки после ca ca.crt
cert $keyname.crt
key
$keyname.key
« Последнее редактирование: 17 Февраль 2014, 00:35:52 от djrust »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7080
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
djrust, какой-то сумбурный текст. 3 раза перечитал, ничего не понял, лягу спать, может завтра вечером (после 20:00) перечитаю и пойму. Вам готовый скрипт надо, тогда опишите всю задачу, а не кусочками, если функция вставки текста в какую-либо строку, то ответьте, как должен выбираться номер строки, по номеру или по маске предыдущей строки.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Вариант 1 (замена):
Код: Bash
  1. sed "s/^\(cert\|key\) .*\(\....\)$/\1 ${keyname}\2/" shablon.ovpn > ${keyname}.ovpn
Но можно и короче
Код: Bash
  1. sed "/^cert\|^key/s/ .*\./ ${keyname}./" shablon.ovpn > ${keyname}.ovpn
Хотя "из-за двух строк городить огород" … —>
Вариант 2 (создание файла):
Код: Bash
  1. cat <<EOF> ${keyname}.ovpn
  2. #указываем сертификаты
  3. ca ca.crt
  4. cert ${keyname}.crt
  5. key ${keyname}.key
  6. EOF
Вариант 3 (подстановка):
Но наиболее верным мне кажется сохранение самого файла shablon.ovpn с переменными в виде
Код: Bash
  1. "#указываем сертификаты"
  2. ca ca.crt
  3. cert ${keyname}.crt
  4. key ${keyname}.key
и объявив переменную keyname выполнить
Код: Bash
  1. while read line
  2. do
  3.     eval echo $line
  4. done < shablon.ovpn > ${keyname}.ovpn
« Последнее редактирование: 17 Февраль 2014, 19:20:59 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
peregrine,
Вроде довольно понятно!

Есть готовый файл клиента openvpn.Они идентичные между собой и различаются только двумя строками
cert $keyname.crt
key $keyname.key

У меня есть скрипт которые определяет $keyname и создает сертификаты,архивирует их и кладет в определенный каталог...
В этом скрипте не хватает только создание файла конфигурации клиента openvpn.
Мне надо его создать на основе готового шаблона(или на основе определенных строк) и чтобы при создании добавлялись строки на основе $keynamecert $keyname.crt
key $keyname.key
Вроде понятно.Я по крайней мере бы понял!

Цитировать
Хотя "из-за двух строк городить огород" …
А как по другому?Мне главное получить готовый ovpn файл с нужными строками на основе $keyname
« Последнее редактирование: 17 Февраль 2014, 13:48:22 от djrust »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
А как по другому?Мне главное получить готовый ovpn файл с нужными строками на основе $keyname
Я Вам 3 возможных варианта предложил.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
Azure,
Спасибо вам за ваш труд!
первый вариант понравился,но вот как работает 2 и 3 не понял!

Сделал вот так

echo "#адрес сервера" > $keydir/$keyname.ovpn
echo "remote IP 1194" >> $keydir/$keyname.ovpn
итд


Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Так и работает (вы же по-частям хвост рубите):
Код: Bash
  1. #!/bin/bash
  2. keydir=
  3. keyname=
  4. cat <<EOF> "$keydir"/${keyname}.ovpn
  5. #адрес сервера
  6. remote IP 1194
  7. #указываем сертификаты
  8. ca ca.crt
  9. cert ${keyname}.crt
  10. key ${keyname}.key
  11. EOF
  12.  
А третий вариант работает так же как и первый, только используется не замена в шаблонном файле, а просто подстановка переменной по образцу из шаблонного файла.
« Последнее редактирование: 18 Февраль 2014, 01:30:22 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
А почему в третьем варианте,убираются #из файла(комментарии)?
И как сделать чтобы при перемещении в windows файл был читабельным?А то там все в одну строчку(т.е строки сливаются...


Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
А почему в третьем варианте,убираются #из файла(комментарии)?
Команда env (== результат), ну а комментарии пропускаются при выполнении. Именно поэтому я и предлагал в шаблонном файле брать комментарии ещё и в кавычки ("").
И как сделать чтобы при перемещении в windows файл был читабельным?А то там все в одну строчку(т.е строки сливаются...
Тут дело в обозначении окончания строк. В линуксе это один символ \n (перевод строки ^J), а в Windows два — перевод строки и возврат каретки (\r ^M). Добавьте и будет Вам счастье.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 851
    • Просмотр профиля
Цитировать
Именно поэтому я и предлагал в шаблонном файле брать комментарии ещё и в кавычки ("").
Я и внимания не обратил!

Спасибо,буду пробовать!

А куда добавить то?Вы уж пишите для блондинок)))) :) открываю блокнотом!
« Последнее редактирование: 19 Февраль 2014, 01:11:55 от djrust »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
В конец каждой строкиsed -i s/$/\\r/ имя_файла
Пользователь решил продолжить мысль 19 Февраль 2014, 19:35:43:
Для каждой задачи давайте брать подходящий инструмент, а не валить всё в кучу. sed применяют для уже готовых файлов в которых надо что-то изменить. Это и выполняет опция -i(работать "внутри" файла т.е. взять, сделать изменения и сохранить в нем же). Без этой опции файл с внесенными изменениями будет выводится на терминал.
Если Вы хотите изменять передаваемую строку (например от команды echo ) достаточно сделать "конвейер" (по английски pipe - труба), когда выход одной команды подается на вход другой. Это делают с помощью знака «|» (вертикальная черта). Напримерecho "#адрес сервера" | sed s/$/\\r/Полученный результат будет опять же выводится на терминал.
Если мы хотим, чтоб результат наших действий попал в файл, а не на терминал, то надо его (вывод команды) "перенаправить" или с заменой файла на новый с нашим выводом (знак «>»), или с дополнением (знак «>>»). Во-втором случае новый вывод будет "дописываться" после последней строчки существующего файла.
В данном конкреном случае нет смысла что-то исправлять когда можно сразу правильно строить строки. Напримерecho -e "#адрес сервера\r" > $keydir/$keyname.ovpn
echo -e "remote IP 1194\r" >> $keydir/$keyname.ovpn
И опять повторю: нет нужды использовать echo внутри скрипта (особенно когда много строк). Для этого существует конструкция cat << СЛОВО которая копирует ввод на терминал (или в файл, если назначить такую трансляцию с помощью  «>» ), пока во вводе не окажется зарезервированное СЛОВО.
« Последнее редактирование: 19 Февраль 2014, 23:31:06 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.096 секунд. Запросов: 24.