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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 861
    • Просмотр профиля
Добрый вечер!есть конфиг 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

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

Оффлайн djrust

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

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

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

Оффлайн Azure

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

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 861
    • Просмотр профиля
Есть готовый файл конфигурации,там должно изменяться только
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
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
djrust, какой-то сумбурный текст. 3 раза перечитал, ничего не понял, лягу спать, может завтра вечером (после 20:00) перечитаю и пойму. Вам готовый скрипт надо, тогда опишите всю задачу, а не кусочками, если функция вставки текста в какую-либо строку, то ответьте, как должен выбираться номер строки, по номеру или по маске предыдущей строки.

Оффлайн Azure

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

Оффлайн djrust

  • Автор темы
  • Активист
  • *
  • Сообщений: 861
    • Просмотр профиля
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

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

Оффлайн djrust

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

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

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


Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Так и работает (вы же по-частям хвост рубите):
Код: (bash) [Выделить]
#!/bin/bash
keydir=
keyname=

cat <<EOF> "$keydir"/${keyname}.ovpn
#адрес сервера
remote IP 1194

#указываем сертификаты
ca ca.crt
cert ${keyname}.crt
key ${keyname}.key

EOF
А третий вариант работает так же как и первый, только используется не замена в шаблонном файле, а просто подстановка переменной по образцу из шаблонного файла.
« Последнее редактирование: 18 Февраля 2014, 01:30:22 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн djrust

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


Оффлайн Azure

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

Оффлайн djrust

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

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

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
В конец каждой строки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.068 секунд. Запросов: 26.