Если работать только средствами sh (не говоря о языках более низкого
уровня), то получаеться громоздкий, ресурсоемкий и сложный для
написания и отладки код.
Ниже предлагаю "простенькие" скрипты на sed'е, для типичных операций:
Удаление интерфеса.
sed скрипт в одну строку в теле sh скрипта (имя интерфейса передается
в параметре):
1. #!/bin/sed -nf
2. # удаляю интерфейс из автоподнимаемых (ищу строку начинающуюся со
# слова auto, в ней ищу имя интерфейса (с пробелом или без) и
# вырезаю его):
3. /auto/s/eth0 ?//
4. #### далее удаление интерфейса и его параметров ####
5. #если строка содержит имя интерфейса, выполняю группу действий:
6. /iface eth1/{
7. #метка:
8. :x
9. #беру на анализ следующую строку (тем самым пропуская вывод этой):
10. n
11. #если начался следующий интерфейс, значит достигнут конец этого
интерфейса - перехожу на метку "y":
12. /iface/by
13. #перехожу на метку "x" (для удаления остальных параметров этого
интерфейса):
14. bx
15. }
16. #метка:
17. :y
18. #вывожу текущую строку на печать:
19. p
Еще вариант, хоть и более медленный и более сложный для понимания, но
отображает другой подход:
1. #!/bin/sed -f
2. #прерываю анализ строки, пока не найду строку содержащей имя интерфейса
3. /^iface eth0/!b
4. #удаляю iface чтобы не мешался:
5. s/iface //g
6. #метка:
7. :x
8. #если еще не дошел до следующего интерфейса, то:
9. /iface/!{
10. #прилепляю следующую строку к концу этой:
11. N
12. #перехожу на метку "x":
13. bx
14. }
15. #удаляю все остатки про этот интерфейс:
16. s/^eth1 .*iface/iface/
Удаление параметра интерфеса.
sed скрипт в одну строку в теле sh скрипта (имя интерфейса и удаляемый
параметр передаются параметрами):
1. #!/bin/sed -f
2. #пока не найду нужный интерфейс прерываю обработку:
3. /iface eth0/!b
4. #метка:
5. :x
6. #беру на анализ следующую строку:
7. n
8. #ищу параметр и в случае успеха удаляю строку:
9. /address/d
10. #если дошел до следующего интерфейса, значит такого параметра нет
- прерываю обработку:
11. /iface/b
12. #перехожу на метку "x" (пока не найду нужный параметр):
13. bx
Еще вариант, хоть и более медленный и более сложный для понимания, но
отображает другой подход:
1. #!/bin/sed -nf
2. #если строка содержит имя интерфейса, выполняю группу действий:
3. /iface eth0/{
4. #метка:
5. :x
6. #вывожу текущую строку на печать:
7. p
8. #беру на анализ следующую строку:
9. n
10. #если это строка с параметром, то прерываю анализ строки - тем
#самым не выводя на печать искомый параметр
11. /address/b
12. # если начался следующий интерфейс, значит такого параметра нет -
# перехожу на метку "y":
13. /iface/by
14. #перехожу на метку "x" (для удаления остальных параметров этого интерфейса):
15. bx
16. }
17. #метка:
18. :y
19. #вывожу текущую строку на печать:
20. p
Если скрипту передать имя интерфейса как eth, то удалиться заданный
параметр у всех интерфейсов eth (eth0, eth1 и т.д.). Пригодиться, к
примеру, для удаления шлюза по умолчанию (gateway).
1. #!/bin/sed -f
2. #пока не найду нужный интерфейс прерываю обработку:
3. /iface eth0/!b
4. #метка:
5. :x
6. #беру на анализ следующую строку:
7. n
8. #ищу в строке нужный параметр и заменяю его
9. s/netmask.*/netmask 255.255.255.0/
10. # в случае успешного выполнения предыдушей операции прерываю обработку:
11. t
12. #если дошел до следующего интерфейса, значит такого параметра нет
- прерываю обработку:
13. /iface/b
14. #перехожу на метку "x" (пока не найду нужный параметр):
15. bx
1. #!/bin/sed -f
2. #пока не найду нужный интерфейс прерываю обработку:
3. /iface eth1/!b
4. #метка:
5. :x
6. #беру на анализ следующую строку:
7. n
8. #если нашел параметр, то заменяю его значение:
9. s/address.*/address 123.123.123.123/
10. #в случае успешной предыдущей операции прервыю обработку:
11. t
12. #если пустая строка
13. /^[[:space:]]*$/{
14. #прилепляю конец следующей к этой
15. N
16. #удаляю n
17. s/n//
18. }
19. #если дошел до следующего интерфейса, значит такого параметра нет
- добавляю параметр и значение:
20. /iface/s/^/taddress 123.123.123.123nn/
21. #в случае успешной предыдущей операции прервыю обработку:
22. t
23. #перехожу на метку "x" (пока не найду нужный параметр):
24. bx
Еще вариант. Мне он нравится больше:
1. #!/bin/sed -nf
2. #пока не найду нужный интерфейс перехожу на метку "y":
3. /iface eth1/!by
4. #метка:
5. :x
6. #вывожу текущую строку на печать:
7. :p
8. #беру на анализ следующую строку:
9. n
10. #если нашел параметр, то заменяю его значение:
11. s/address.*/address 123.123.123.123/
12. #в случае успешной предыдущей операции перехожу на метку "y":
13. ty
14. #если пустая строка, то пропускаю ее вывод
15. /^[[:space:]]*$/n
16. #если дошел до следующего интерфейса, значит такого параметра нет
- добавляю параметр и значение:
17. /iface/s/^/taddress 123.123.123.123nn/
18. #в случае успешной предыдущей операции перехожу на метку "y":
19. ty
20. #перехожу на метку "x" (пока не найду нужный параметр):
21. bx
22. #метка:
23. :y
24. #вывожу текущую строку на печать:
25. :p