Нежелательные повторяющиеся строки -sed

Чтобы установить маршрутизацию между подсетями, необходимо объявить эти подсети. Попробуйте использовать опцию push "route 192.168.1.0 255.255.255.0". См. документацию OpenVPN, особенноhttps://community.openvpn.net/openvpn/wiki/BridgingAndRouting.

IP-адреса, используемые клиентским и серверным интерфейсами OpenVPN tun на сайте -на -сайт Туннель OpenVPN (= точка -на -точка с маршрутизацией )вы объявляете их таковыми.

1
01.07.2021, 00:49
1 ответ

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

Этот скрипт должен делать две вещи

  1. получить список IP-адресов, где поле имени похоже на moscowиз psql (с использованием регистрозависимого соответствия -без учета регистра)
  2. соедините с каждым из них с помощью sshи вставьте hostname: Sheglinaв /root/config.cfgсразу после строки, содержащей hostname: andrew.

Например:

#!/bin/bash

city='moscow'
sql="SELECT DISTINCT ip_address FROM servers WHERE name ILIKE '$city'"

# get the query output into an array called 'hosts'
hosts=( $(psql -U postgres name_db -t --csv -c "$sql") )

for host in "${hosts[@]}"; do
  ssh "$host" "sed -i -e 's/^hostname: andrew/&\nhostname: Sheglina/i' /root/config.cfg"
done

При этом используются встроенные -параметры psql для извлечения необходимых данных в правильном формате. -tподавляет вывод заголовка и нижнего колонтитула, а --csvзапрашивает формат, разделенный запятыми -. SQL-запрос выбирает только совпадающие значения -, нет необходимости передавать их в grep или awk -, а в запросе используется «DISTINCT» для предотвращения дублирования.

Затем sshиспользуется для подключения к каждому хосту, а sed используется для поиска hostname: andrewи добавления после него hostname: Sheglina.


ПРИМЕЧАНИЕ. :цитирование в оболочке может быть очень трудным, особенно если вам нужно передать значения в кавычках другим программам, (таким как psql или ssh ), которые также нуждаются в собственном цитировании. Вы можете использовать printf '%q'для преобразования строк в правильный формат -в кавычках, который можно использовать с такими командами, но postgres использует свой собственный стиль цитирования/экранирования, если вы не скажете ему использовать стиль, подобный posix -, добавив префикс цитата с E. Это сообщает poostgres, что строка в кавычках может содержать escape-символы строки в стиле posix -.

т.е. E'quoted-string'вместо просто 'quoted-string'.

напр. если $city содержит какие-либо символы, которые должны быть экранированы оболочкой и postgres, используйте что-то вроде:

sql="SELECT DISTINCT ip_address FROM servers WHERE name ILIKE E'%"$(printf "%q" "$city")"'"
2
28.07.2021, 11:21

Теги

Похожие вопросы