LinuxForum.Fans
Тема

Скрипт, переписывающий ip в конфиге, если адрес поменялся

Автор: Cewrio 15 сообщений 5039 просмотров
#299514

Составляю скрипт, переписывающий ip в конфиге, в случае, если адрес поменялся.

Решение, как получить адрес из интерфейса, было найдено:
ppp0=`ip addr list ppp0 | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1`
Но как выдернуть из конфига ip для сравнения, а потом заменить?

Конфиг выглядит примерно так:

daemon
log /usr/local/3proxy/logs/3proxy.log Drotate 1
external x.x.x.x
internal x.x.x.x
users login:CL:Password
auth strong
socks -p1080

external, internal - оба подлежат замене

#299515

Полагаю,

text
grep ^external | сut -d" " -f2-
#299603

grep ^external выводит строку, содержащую external
-d" " символ разделитель между полями, в моем случае пробел между external и x.x.x.x
-f2 порядковый номер выводимого поля

Правильно понял? Но почему после -f2 идет "-"?

root@debian:~# grep ^external /usr/local/3proxy/3proxy.cfg | сut -d" " -f2-
-bash: сut: команда не найдена

#299604

Разобрался

#299605
"Cewrio" написал:
Правильно понял? Но почему после -f2 идет "-"?

Правильно. А -f2- означает "взять часть строки от второго поля до конца строки.

"Cewrio" написал:
bash: сut: команда не найдена

o_O coreutils на месте?

#299607

Можно так:

text
$ awk '/external/ {print $2}' /usr/local/3proxy/3proxy.cfg
#299609
yars написал:
o_O coreutils на месте?

cut начинался с русской "с"


ppp0=`ip addr list ppp0 | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1`
oppp0=`grep ^external /usr/local/3proxy/3proxy.cfg | cut -d" " -f2-`
[ "$ppp0" != "$oppp0" ] && ( ... )

Осталось разобраться, как записывать в конфиг новый ip вместо старого. Полагаю, с помощью sed?

#299610
"Cewrio" написал:
Полагаю, с помощью sed?

Да, тоже так думаю, но я плоховато sed знаю.

#299611
"Cewrio" написал:
Осталось разобраться, как записывать в конфиг новый ip вместо старого.

[console]lupo@gentoo-laptop /tmp $ cat test.txt
daemon
log /usr/local/3proxy/logs/3proxy.log Drotate 1
external x.x.x.x
internal x.x.x.x
users login:CL:Password
auth strong
socks -p1080
lupo@gentoo-laptop /tmp $ sed -i '/external/s/x\.x\.x\.x/Y\.Y\.Y\.Y/' test.txt
lupo@gentoo-laptop /tmp $ cat test.txt
daemon
log /usr/local/3proxy/logs/3proxy.log Drotate 1
external Y.Y.Y.Y
internal x.x.x.x
users login:CL:Password
auth strong
socks -p1080[/console]

#299614

Ещё, к слову...

"Cewrio" написал:
Решение, как получить адрес из интерфейса, было найдено:
ppp0=`ip addr list ppp0 | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1`

Так, на мой взгляд, проще:

text

ip addr list ppp0 | awk '/inet/ {print $2}'
#299643

Спасибо, разобрался
P.S. за упрощение тоже спасибо :)

#299675
"...не успел"

Если я вас правильно понял — значение переменной не должно равняться какому-то определённому значению или быть пустым?
[console]
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ a=abc
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ [[ $a != "abc" || -z $a ]] && echo OK || echo NO
NO
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ a=cba
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ [[ $a != "abc" || -z $a ]] && echo OK || echo NO
OK
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ a=""
lupo@gentoo-laptop ~/Desktop/temp/tvheadend/channeltags $ [[ $a != "abc" || -z $a ]] && echo OK || echo NO
OK
[/console]
#299678

Не должно быть пустым. Сделал вот такую проверку if ! [ -z $ppp1 ]; then ... fi

Но на сколько вас понял, можно упростить: [[ "$ppp1" != "$ext1" || -z $ppp1 ]] && ( ... ) и в скобках сработает, только если $ppp1 не пустое

#299682
"Cewrio" написал:
и в скобках сработает, только если $ppp1 не пустое

...или не равно значению переменной $ext1.

#299699

От чего то не сработала проверка, возможно не хватает "!" в каком то месте?
[[ "$ppp1" != "$ext1" || ! -z $ppp1 ]] не правильно

Войдите или зарегистрируйтесь, чтобы ответить.