1

Составляю скрипт, переписывающий 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 - оба подлежат замене

2

Полагаю,

grep ^external | сut -d" " -f2-
Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

3

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: команда не найдена

4

Разобрался

5

Cewrio пишет:

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

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

Cewrio пишет:

bash: сut: команда не найдена

ai coreutils на месте?

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

6

Можно так:

$ awk '/external/ {print $2}' /usr/local/3proxy/3proxy.cfg
Был, был и весь вышел...

7 (30.01.2013 10:46:55 отредактировано Cewrio)

yars пишет:

ai 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?

8

Cewrio пишет:

Полагаю, с помощью sed?

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

9 (30.01.2013 10:58:54 отредактировано Lupo Alberto)

Cewrio пишет:

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

 Консоль:
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

Был, был и весь вышел...

10

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

Cewrio пишет:

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

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

ip addr list ppp0 | awk '/inet/ {print $2}'
Был, был и весь вышел...

11 (30.01.2013 12:23:39 отредактировано Cewrio)

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

12 (30.01.2013 14:30:31 отредактировано Lupo Alberto)

+ ...не успел

Если я вас правильно понял — значение переменной не должно равняться какому-то определённому значению или быть пустым?

 Консоль:

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

Был, был и весь вышел...

13

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

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

14

Cewrio пишет:

и в скобках сработает, только если $ppp1 не пустое

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

Был, был и весь вышел...

15

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