Похоже, ваш код ищет выражение 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
выйти с нулевым статусом выхода, когда требуемый текст был напечатан, что приводит к завершению цикла.
В качестве временного решения вы можете попробовать это на машине 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