LINUX.ORG.RU

помогите со скриптом

 


0

1

Нужно чтобы найденный ip по команде, заменялся в строках файла (from: 192.168.3.2)

host 1tv.ru | grep address | awk '{ print $4 }'

файл /home/user/testfile:

client pass {
        from: 192.168.3.2/24 to: 0.0.0.0/0
        log: error connect disconnect
}

socks pass {
        from: 192.168.3.2/24 to: 0.0.0.0/0
        log: error connect disconnect
}

Подскажите пожалуйста как поменять Ip в строках (без маски)

как поменять Ip в строках (без маски)

$ echo 'from: 192.168.3.2/24 to: 0.0.0.0/0' | awk '{$2="kuku"; print}'
from: kuku to: 0.0.0.0/0
futurama ★★★★★
()
IP1=192.168.3.2 IP2=127.0.0.1 perl -pe 's/\Q$ENV{IP1}\E/$ENV{IP2}/' /home/user/testfile
client pass {
        from: 127.0.0.1/24 to: 0.0.0.0/0
        log: error connect disconnect
}

socks pass {
        from: 127.0.0.1/24 to: 0.0.0.0/0
        log: error connect disconnect
}

Или вот так, покороче, но менее читаемо:

IP1=192.168.3.2 IP2=127.0.0.1 perl -pe 's/\Q'$IP1'\E/'$IP2'/' /home/user/testfile
annulen ★★★★★
()
dig 1tv.ru +short | xargs -I{} sed "s/192\.168\.3\.2\/24/{}/" -i /home/user/testfile
kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

Ip в строках (без маски)

Адрес 178.248.233.188/24 будет некорректным.

Корректным будет либо совсем без маски, либо с маской /32.

Если тебе нужно без маски - поправь в sed команду.

kostik87 ★★★★★
()
$ echo "     from: 192.168.3.2/24 to: 0.0.0.0/0" | sed -E 's#(.*from: )(\S+)#\1192.168.0.1/24#g'
     from: 192.168.0.1/24 to: 0.0.0.0/0
iron ★★★★★
()
Ответ на: комментарий от kostik87

Не ври, это вполне корректный адрес, означает «узел 188 в сети 178.248.233.0/24». Другое дело, что не весь софт поддерживает такой синтаксис, а куда автор его собрался сувать он не сказал, какой-то testfile только.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не ври, костя все верно написал, с точки зрения нотации. А твое дополнение - очевидный надмозг, имеющий место быть для удобства.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Пиши по-русски плз, а то у тебя хоть слова и русские но совершенно непонятно что ты хотел сказать.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Ок. Нотация ip адреса состоит из четырех байт в цифровом выражении, разделенных точкой. Маска - адресное пространство, в котором существует адрес, все с той же нотацией. Это разные сущности их комбинирование не является стандартом, хоть и повсеместно используется.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

А, так бы и сказал: в каком-то стандарте, который никто не читает, такая запись не предусмотрена. А то нотации какие-то, дополнения.

Ну, пусть не предусмотрена, всем плевать. Как ты сам написал, все используют, значит такой формат записи реально (а не в бумажках) существует и, следовательно, корректен.

firkax ★★★★★
()
Ответ на: комментарий от Anoxemian

Он не сказал «в некоем стандарте не предусмотрено», он сказал что запись некорректная. Это разные вещи.

В одном стандарте не предусмотрено, в другом предусмотрено, стандартов можно наплодить хоть 100 разных с разными правилами записи адресов. Критерий же другой - запись всем понятна и помогает коммуникациям.

firkax ★★★★★
()
Ответ на: комментарий от Anoxemian

Да нет, не один. Ты можешь хоть сам придумать ещё один и опубликовать у себя в блоге. Хотя, конечно, rfc будет популярнее.

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

Согласен, ровно как и нет причин обвинять костю в собственной некомпетентности.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

формат записи

from: 192.168.3.2/24 to: 0.0.0.0/0

Указывает правило прохождения трафика на маршрут по умолчанию.

По сути это маршрут. И в этом случае здесь должна быть указана либо сеть, 192.168.3.0/24 или адрес 192.168.3.2/32 или адрес 178.248.233.188/32. Заметь в случае указания маршрутизации или правила для одного адреса маска должна быть /32 или вообще её не должно быть.

И если ты уж пишешь - соблюдай нормы русского языка и минимальное уважение на форуме. Личные имена пишутся с заглавной буквы.

kostik87 ★★★★★
()
Ответ на: комментарий от iron

Уточнение к скрипту

Короче, есть testfile с текстом

client pass
        from: 192.168.3.2/24 to: 0.0.0.0/0
server pass
        from: 192.168.3.2/24 to: 0.0.0.0/0

Надо, чтобы как-то, например sed’ом в строке, содержащей "from: менялось from с ip из команды, до первого знака «/» (from и «/» типа ориентиры):

host 1tv.ru | grep address | awk ‘{ print $4 }’

Типа такого (тут не правильно, просто пример):

cat testfile | sed -i ‘s/from: и всё до знака дроби / from: $(host 1tv.ru | grep address | awk ‘{ print $4 }’)/’

Ожидаемый Результат команды

client pass
        from: 178.248.233.188/24 to: 0.0.0.0/0
server pass
        from: 178.248.233.188/24 to: 0.0.0.0/0
chart41
() автор топика
Ответ на: комментарий от chart41

менялось from с ip из команды, до первого знака «/» (

$ echo "     from: 192.168.3.2/24 to: 0.0.0.0/0" | sed -E 's#(.*from: )(\S+/)#\1192.168.0.1/#g'
     from: 192.168.0.1/24 to: 0.0.0.0/0
iron ★★★★★
()
Ответ на: комментарий от iron
$ cat test.txt
client pass
        from: 192.168.3.2/24 to: 0.0.0.0/0
server pass
        from: 192.168.3.2/24 to: 0.0.0.0/0
$ cat test.txt | sed -E 's#(.*from: )(\S+/)#\1178.248.233.188/#g'
client pass
        from: 178.248.233.188/24 to: 0.0.0.0/0
server pass
        from: 178.248.233.188/24 to: 0.0.0.0/0
iron ★★★★★
()
Ответ на: комментарий от iron

Можно тоже самое, только чтобы айпишник был не вручную вписан, а брался из команды?

host 1tv.ru | grep address | awk ‘{ print $4 }’
chart41
() автор топика
Ответ на: комментарий от chart41

а брался из команды?

Загони вывод этой команды в переменную:

IP=`host 1tv.ru | grep address | awk ‘{ print $4 }’`

И потом примерно вот так:

$ export IP=192.168.0.1 && echo "     from: 192.168.3.2/24 to: 0.0.0.0/0" | sed -E "s#(.*from: )(\S+/)#\1$IP/#g"
     from: 192.168.0.1/24 to: 0.0.0.0/0
iron ★★★★★
()
Последнее исправление: iron (всего исправлений: 1)
Ответ на: комментарий от chart41

Тебе уже написано выше

dig 1tv.tu +short

Возвращает ip адрес сразу, без всяких grep, awk и прочего.

Читай комментарии и пробуй.

А не филонь и не ковыряйся в носу.

kostik87 ★★★★★
()

Я б вообще с другой стороны зашёл. Вместо возни с регулярными выражениями и sed|grep|awk|tr, взял бы образец и наполнял его нужными данными. Получается чуть более многословно, но зато гораздо гибче. При изменении формата данных придётся всего один файл поправить, а не всю эту дристню с регекспами обратно разгребать.

Вариант решение на babashka (потому что лисп рулит, а bash — отстой).

➜  /tmp cat routes.tpl         
client pass {
        from: {{from}}/32 to: {{to}}
        log: error connect disconnect
}

socks pass {
        from: {{from}}/32 to: {{to}}
        log: error connect disconnect
}
#!/usr/bin/env bb

(require '[selmer.parser :as parser]
         '[babashka.process :refer [shell]])

(def template-dir "/tmp")
(def template-file "routes.tpl")

(defn validate-ip [ip]
  (if (empty? ip)
    (throw (Throwable. "Не могу определить IP!"))
    ip))

(defn resolve-ip
  [domain]
  (->> (str "dig " domain " +short")
       (shell {:out :string})
       :out
       str/trim
       validate-ip))

(defn render [template-file ip ]
  (selmer.parser/set-resource-path! template-dir)
  (parser/render-file template-file
                      {:from ip
                       :to "0.0.0.0/0"}))

(->> (first *command-line-args*)
     resolve-ip
     (render template-file)
     println)

успех:

➜  /tmp ./populate-ip.bb 1tv.ru 
client pass {
        from: 178.248.233.188/32 to: 0.0.0.0/0
        log: error connect disconnect
}

socks pass {
        from: 178.248.233.188/32 to: 0.0.0.0/0
        log: error connect disconnect
}

ошибка:

➜  /tmp ./populate-ip.bb a1tv.ru
----- Error --------------------------------------------------------------------
Type:     java.lang.Throwable
Message:  Не могу определить IP!
Location: /tmp/./populate-ip.bb:11:5

----- Context ------------------------------------------------------------------
 7: (def template-file "routes.tpl")
 8: 
 9: (defn validate-ip [ip]
10:   (if (empty? ip)
11:     (throw (Throwable. "Не могу определить IP!"))
        ^--- Не могу определить IP!
12:     ip))
13: 
14: (defn resolve-ip
15:   [domain]
16:   (->> (str "dig " domain " +short")

----- Stack trace --------------------------------------------------------------
user/validate-ip     - /tmp/./populate-ip.bb:11:5
user/validate-ip     - /tmp/./populate-ip.bb:9:1
user/resolve-ip      - /tmp/./populate-ip.bb:16:3
user/resolve-ip      - /tmp/./populate-ip.bb:14:1
user/render          - /tmp/./populate-ip.bb:22:1
user                 - /tmp/./populate-ip.bb:30:6
clojure.core/println - <built-in>
user                 - /tmp/./populate-ip.bb:28:1

ugoday ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.