Я СИЛЬНО подозреваю, что вам вообще не следует запускать скрипт для обновления вашего скрипта. Вместо этого вы должны просто вызвать awk
из исходного сценария и получить таким образом нужные вам данные. Затем saker.txt
можно было бы просто использовать как файл конфигурации (который и есть) для изменения поведения вашего скрипта (вместо того, чтобы использовать его для изменения вывода вашего скрипта создания скрипта).
Очевидно, у меня очень ограниченные данные о вашем скрипте, но похоже, что вы используете saker.txt
в качестве таблицы поиска для установки переменной в вашем скрипте.
В частности, фрагмент сценария:
if [ "$STATUS" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$STATUS" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$STATUS" == "12398123.123912" ]
then
vem="Ad"
fi
может быть функционально воспроизведен с помощью встроенного сценария awk следующим образом:
vem=$( awk -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
Это отвечает: «Как я могу установить переменную в bash
на основе поиска другой переменной значение в файле? " Кажется, именно этого вы и пытаетесь достичь, запустив свой скрипт для обновления вашего скрипта.
Конечно, есть предостережения, например: «Что, если значение $ STATUS
вообще не указано в saker.txt
?» "Что, если он будет указан дважды?" "Как я могу установить значение по умолчанию для vem
?" Но у вас все еще есть все эти предостережения, и даже более того, со сценарием обновления сценария.
РЕДАКТИРОВАТЬ: Если вы хотите разрешить пробелы в значении vem
, как указано в saker.txt
, вам лучше использовать что-нибудь другое для разделителя, например табуляцию:
$ cat saker.txt
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
Затем используйте следующую версию однострочника awk
:
vem=$( awk -Ft -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
Предупреждение о разделители табуляции: убедитесь, что вы не используете более одной табуляции. В отличие от обработки по умолчанию в awk
«разделенных пробелами», когда вы явно устанавливаете разделитель только как TAB, каждая вкладка считается разделителем независимо от того, есть ли текст между вкладки. Итак, 10000
будет рассматриваться как ТРИ поля: «10000», «» (пустое поле) и «Джон».
Это очень простая вещь для работы в сети. :Если вы хотите соединить разные сегменты локальной сети, вам понадобится маршрутизатор . Вам не нужен NAT, вам не нужен iptables
, вы просто маршрутизируете, просто и понятно.
По какой-то причине люди думают, что для маршрутизации нужен как минимум NAT или iptables
, и в Интернете полно советов на этот счет. Это на самом деле не нужно, и моя любимая мозоль.
Все, что вам нужно сделать, это
1 )Включить переадресацию на сервер #2. Это уже было описано (добавить файл в /etc/sysctl.d/
, перезагрузиться и посмотреть, отображается ли cat /proc/sys/net/ipv4/ip_forward
1
, или включить его напрямую с помощью echo 1 > /proc/sys/net/ipv4/ip_forward
).
2)Установите маршрут для всех хостов, которые хотят использовать шлюз . Это то, что большинство людей забывают. Итак, на сервере #1,вам нужно что-то вроде
ip route add 10.8.0.0/24 dev enp0s17 via 192.168.56.120
ip route add 10.0.4.0/24 dev enp0s17 via 192.168.56.120
и то же самое на всех других хостах в LAN A и B, которые хотят получить доступ к LAN C и D. На сервере #3 (и всех других хостах, к которым он относится ), вам нужно
ip route add 192.168.56.0/24 dev tun0 via 10.8.0.1
Это говорит каждому хосту, что когда он хочет получить доступ к удаленной локальной сети, он должен пройти через сервер #2 с соответствующим IP-адресом сервера #2 в локальной локальной сети.
Вы можете проверить, что маршрутизация работает с ip route get a.b.c.d
на сервере #1 и сервере #3. Теперь проверьте с помощью ping
. Если что-то по-прежнему не так, выполните отладку с помощью tcpdump
. Если на пути стоит брандмауэр, отключите его при необходимости.
Когда все заработает, используйте какой-либо способ сделать маршруты постоянными, например, распределите их по DHCP или добавьте в подходящий файл конфигурации.