NAT через VPN

Похоже, ваш код ищет выражение domain.http.listener.port=в нескольких файлах с grep, и ваша команда awkнапечатает последнее=-поле с разделителями из первой строки этого результата (только ), а затем вы удаляете любой возврат каретки в результате этого.

lsне требуется. Похоже, вы используете его, чтобы проверить, соответствует ли шаблон подстановки имени файла $directory/*.domain.*.propertiesчему-либо (, а также, возможно, разделить значение $directoryна пробелы и выполнить подстановку имени файла для этих битов ).

Чтобы проверить, соответствует ли шаблон подстановки имени файла какому-либо имени файла, вы можете использовать

set -- "$directory"/*.domain.*.properties

(Я процитировал расширение переменной directory, потому что я предполагаю, что она должна содержать имя или путь только одного каталога ), за которым следует

if [ "$#" -gt 1 ] || [ -e "$1" ]; then...; fi

Команда setустанавливает позиционные параметры ($1, $2, $3и т. д. ), и если мы получаем более одного из них($#больше 1 ), тогда шаблон соответствует более чем одной вещи. Также, если шаблон соответствует какой-то одной вещи, мы проверяем существование этой вещи с помощью -e. Этот последний тест будет различать одно совпадение и отсутствие совпадения (, шаблон останется нераскрытым ).

awkможет выполнять работу grepи tr, поэтому на самом деле нет необходимости в конвейере, который у вас есть:

awk -F '=' '/domain\.http\.listener\.port=/ { sub("\r","", $NF); print $NF; exit }'

Я пропускаю точки в регулярном выражении, поскольку в противном случае они соответствовали бы любому символу. Я использую здесь только sub(), а не gsub(), так как я предполагаю, что вы хотите удалить возврат каретки в конце строки и больше нигде.

Все вместе:

#!/bin/sh

set -- "$directory"/*.domain.*.properties

if [ "$#" -gt 1 ] || [ -f "$1" ]; then
    awk -F '=' '/domain\.http\.listener\.port=/ { sub("\r","", $NF); print $NF; exit }' "$@"
fi

Я заменил тест -eна тест -f, так как более целесообразно запускать awkна обычном файле (или символической ссылке на него ), чем на чем-то другом (но я не проверяю типы файлов любого из файлов, если есть несколько совпадений ).

"$@"будет расширен до всех имен (, отдельно цитируемых ), которым удалось сопоставить шаблон в команде set.

Если вам нужен путь к файлу, содержащему первое совпадение, вы можете изменить awkна то, что также выводит специальную переменную FILENAME(, например.print FILENAME, $NF). Вы хотите все совпадения (, а не только первое в первом файле ), затем удалите exit.

Обратите внимание, что это решение потерпит неудачу, если есть много сотен или тысяч файлов, соответствующих шаблону подстановки имен файлов (, как у вас ). В этом случае вы бы сделали цикл оболочки:

for pathname in "$directory"/*.domain.*.properties; do
    if [ -f "$pathname" ]; then
        awk -F '=' '
            /domain\.http\.listener\.port=/ {
                sub("\r","", $NF); print $NF; found=1; exit
            }
            END { exit !found }' "$pathname" && break
    fi
done

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

0
06.12.2020, 11:45
1 ответ

В качестве временного решения вы можете попробовать это на машине Debian:

iptables -A POSTROUTING -t nat -p TCP -s 192.168.1.6/32 -d 10.0.0.200/32 --dport 1521 -o eth0 -j SNAT --- -источник 10.1.0.51

если хост 192.168.1.6 или маршрутизатор знают, как направлять пакеты на хост debian. затем хост debian перезапишет источник на свой собственный IP-адрес и направит пакеты на сервер 10.0.0.200 :1521. Таким образом, сервер 10.0.0.200 :1521 будет видеть соединения только с IP-адреса 10.1.0.51 вместо реального источника 192.168.1.6

.

Править :И еще одно. Включена ли переадресация на машине Debian? проверить с помощью :cat /proc/sys/net/ipv4/ip _переслать результат должен быть 1

0
18.03.2021, 22:45

Теги

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