Вопрос Есть ли безопасный способ отключить DHCP из командной строки?


Укороченная версия

Я знаю, что этот вопрос очень похож на других, и я действительно искал в Интернете ответы, но кажется, что ни один подход не работает, или решения, похоже, «сложны, чтобы быть лучшей практикой» (я попытаюсь объяснить). Я ищу безопасный способ как отключить DHCP из командной строки (для использования в скриптах).

Задний план

Я пытаюсь создать «Live-Cd» с Ubuntu Server 12.04 и remastersys (хорошо работает). По умолчанию система настроена на получение IP-адреса с помощью DHCP во время загрузки. Это нормально - важно то, что скрипт (который запускается после загрузки) способен (в некоторых конкретных случаях) устанавливать статический IP-адрес, используя ifconfig (нет / etc / network / interfaces ):

ifconfig eth0 192.168.0.1

На самом деле это также работает, но IP-адрес сохраняется только до тех пор, пока время аренды DHCP в ранее полученном лизинге не закончится. Новый IP будет присвоен eth0, который (короче говоря) разрывает систему. Я подумал: «Ничего страшного, наверняка что-то типа:»

ifconfig eth0 dhcpdisabled

Но я понял, что это не так просто. Редактирование /etc/network/interfaces немного сложнее, потому что он генерируется remastersys (на самом деле это 23-сетевой скрипт casper).

Я мог бы переписать его и перезапустить сетевое взаимодействие, но что произойдет с активными dhclient.leases? Будет ли DHClient работать в фоновом режиме (это не должно некоторые должности предполагают, что это будет мои тесты показали, что он перезапускается «случайно», если dhclient убит), мне нужно удалить или удалить файлы dhclient.leases, а что же с resolv.conf?

отчаиваться

Подводя итог - по-моему, на самом деле это не так «прямолинейно» и несколько не «стабильно». Этот вопрос (156183)  предложил удалить пакет dhclient, но: будет ли это решить проблему? Будет ли это нарушать другие вещи?

Неужели для этого нет никакой команды? Надеюсь, я просто забыл об этом.


4
2017-08-01 13:22


происхождения


Для посетителей вам не нужно ничего пилить или удалять. Лучший ответ можно найти Вот. - John
Джон, мне нужны были эти дни для сценария. Как это будет работать здесь? Выполнить файл и заменить строку? Не кажется мне зрелым. - Mister Henson


ответы:


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

Во-первых, давайте сделаем некоторые предположения, чтобы сделать этот случай более простым:

  1. Вы не используете сетевой менеджер
  2. Вы не используете resolvconf, но статический файл /etc/resolv.conf
  3. Файл интерфейсов не содержит allow-hotplug линии для перенастройки, если кабель отсоединен / подключен.

Давайте настроим нашу вспомогательную переменную DEV

## your device is eth0
# stop /etc/interface control of the eth0 device, should also stop/kill dhcp for that device
ifdown eth0
## stop dhclient to be sure, don't worry about leases files etc
pkill dhclient
## ubuntu precise calls dhclient with dhclient3
pkill dhclient3
# set ip manually: (NETMASK is quite often 24 == 255.255.255.0) 
ifconfig eth0 up 192.168.0.1/NETMASK
# do you need default gw? (for this example it's 192.168.0.254)
route add default gw  192.168.0.254

## if your /etc/resolv.conf is incorrect add correct nameserver like this:
### 8.8.8.8 = goole open dns
echo 'nameserver 8.8.8.8' > /etc/resolv.conf

Теперь, если предположение 1) является ложным do (stop network-manager):

stop network-manager

Для предположения 2) либо удалить resolvconf или удалить /etc/resolv.conf если это символическая ссылка и заменить ее статическим файлом

[ -h /etc/resolv.conf ] && rm /etc/resolv.conf

И для предположения 3): Это должно комментировать строки hotplug .. и я надеюсь, что этого достаточно

perl -i -pe 's/^(\s*allow-hotplug)/# $1/g' /etc/network/interfaces

3
2017-08-08 12:51



Я предполагаю, что вам не нужно использовать pkill дважды - pkill dhclient должен убить как dhclient, так и dhclient3 - он использует регулярное выражение. Может быть, вместо этого использовать killall? - scdmb


Вы можете использовать «systemctl», если это доступно для вашего дистрибутива. Он доступен для моего дистрибутива openSUSE, и я использую его для отключения служб следующим образом.

systemctl disable wickedd-dhcp4.service

где wickedd-dhcp4 является именем службы обработки DHCP-клиента в моей системе. Существует также служба для конфигурации IPv6 dhcp, вы тоже можете отключить ее.

systemctl disable wickedd-dhcp6.service

1
2017-09-11 03:46



Thx, но Ubuntu был использован ... - Mister Henson
Чтобы добавить, если вы хотите освободить адрес, полученный dhcp, после запуска dhcp вы можете выполнить «dhclient -r eth0». Не ответ на главный вопрос, но он может помочь. - Sahil Singh


Самый простой стандартный способ исправить это просто: просто сообщите DHCP-серверу, какие IP-адреса должны предоставляться определенным MAC-адресам. Каждый маршрутизатор, который я когда-либо касался, имел эту функцию, и если вы используете dhcp3-server, его так же просто,


0
2017-08-01 13:42



Но на самом деле ваш ответ отсутствует. Я предполагаю, что мой вопрос не был четко написан, но я его модифицировал. - Mister Henson


Как насчет просто остановки dhcp-клиента с pkill dhclient?


0
2017-08-06 07:12



Спасибо, я попробовал это и удалил файлы аренды, но почему-то это не работает (dhclient, похоже, перезагружен) ... - Mister Henson
Итак, мы ищем процесс, который перезапускает dhclient, правильно? Просто чтобы удвоить, не могли бы вы убедиться, что у вас нет сетевого менеджера? И, пожалуйста, опубликуйте содержимое / etc / network / interfaces. Спасибо! - Clausi


Я использую следующую команду для отключения DHCP на моем сервере.

sudo update-rc.d -f dhcp3-server remove

Что он делает, это удалить любые ссылки для запуска системы для /etc/init.d/dhcp3-server,

Так что при следующей перезагрузке DHCP не врывается.

Вот и все, просто, чисто, легко и безопасно.


0
2017-10-07 21:17