Чтобы установить маршрутизацию между подсетями, необходимо объявить эти подсети. Попробуйте использовать опцию push "route 192.168.1.0 255.255.255.0"
. См. документацию OpenVPN, особенноhttps://community.openvpn.net/openvpn/wiki/BridgingAndRouting.
IP-адреса, используемые клиентским и серверным интерфейсами OpenVPN tun на сайте -на -сайт Туннель OpenVPN (= точка -на -точка с маршрутизацией )вы объявляете их таковыми.
Вы все усложняете гораздо больше, чем нужно. Вместо того, чтобы пытаться сделать все это в одну длинную, сложную и трудную для чтения строку, разбейте ее на шаги и выполняйте их последовательно.
Этот скрипт должен делать две вещи
moscow
из psql (с использованием регистрозависимого соответствия -без учета регистра)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")"'"