Установите сохраненный статический IP-адрес, если DHCP не работает

Я пытаюсь реализовать следующую сцену на Raspberry Pi с wheezy в сценарии bash. Я делаю это, потому что я хочу, чтобы устройство всегда получало новый IP-адрес, если DHCP находится в сети, и в то же время я хочу, чтобы оно сохраняло последний использованный IP-адрес в случае, если DHCP отключен. Кроме того, IP-адрес может измениться, а у меня много устройств, поэтому просто настраивать статические IP-адреса — не мой выбор:

  • Загрузка (нет в сценарии ;))
  • Включите DHCP и попробуйте получить IP-адрес
  • Проверьте, есть ли у меня один

а) Получил IP (успешный DHCP)

-> Сохранить информацию об IP в файл

б) IP не получен (сбой DHCP)

-> Ничего не делать здесь

  • Установите фиксированный IP-адрес на основе информации в файле

Теперь дело в том, что это работает очень здорово, если я запускаю скрипт вручную, но если я позволю ему запускаться автоматически после запуска, DHCP не сработает, но все равно даст мне IP-адрес. Конечно мой скрипт думает, что DHCP получил ip адрес, но это не тот адрес!
sys.log говорит мне, что:

dhclient: No DHCPOFFERS received.
dhclient: Trying recorded lease 192.xxx.xx.xx
ifplugd(eth0)[1602]: client: Trying recorded lease 192.xxx.xx.xx

Теперь вопрос:

  • Могу ли я деактивировать клиентскую службу DHCP (я думаю, что это ifplugd с dhclient), дающую мне этот поддельный IP-адрес?
  • Или я могу определить, что запрос DHCP не был успешным (и аннулировать поддельный адрес)?

Скрипт:

#!/bin/bash

echo Switch off Ethernet >> log.log
ifconfig eth0 down
echo Set DHCP mode for Ethernet >> log.log
ifconfig eth0 up
dhclient -r eth0
dhclient eth0
echo Now check if we got ip address >> log.log
countLines=$(ifconfig eth0 | grep "inet addr" | wc -l)
if [ $countLines -ne 0 ]; then
  echo Found ip address via DHCP - Save it to ip.txt >> log.log
  ifconfig eth0 | grep "inet addr" > ip.txt
  echo Also save the resolv.conf - DNS settings >> log.log
  cp /etc/resolv.conf dns.txt
  #grep domain-name-servers /var/lib/dhcp/dhclient.eth0.leases | tail -1 > dns.txt
else
  echo No new ip address - no DHCP online! Use the old settings instead... >> log.log
fi
echo Switch off DHCP - and release the current lease >> log.log
dhclient -r eth0
ipaddress=$(<ip.txt)
ipaddress=${ipaddress#*addr:}
ipaddress=${ipaddress% Bcast*}
broadcast=$(<ip.txt)
broadcast=${broadcast#*Bcast:}
broadcast=${broadcast% Mask*}
netmask=$(<ip.txt)
netmask=${netmask#*Mask:}
dnsserver=$(<dns.txt)
dnsserver=${dnsserver#*servers }
dnsserver=${dnsserver%;*}
echo Set static ip address now ip: $ipaddress, broadcast: $broadcast, netmask: $netmask... >> log.log
ifconfig eth0 $ipaddress broadcast $broadcast netmask $netmask
echo Set the nameserver >> log.log
cp dns.txt /etc/resolv.conf

Меня очень озадачивает, что скрипт работает из-под bash, а не после того, как запускается автоматически при старте системы!


person Micky    schedule 28.01.2014    source источник
comment
Вы смотрели на этот ответ: stackoverflow.com/questions/12727175/?   -  person djondal    schedule 11.03.2014


Ответы (1)


Хорошо, приятель,

Ваша проблема в том, что ваш сценарий считает, что ifconfig не получит IP-адрес, если DHCP не найден.

Если dhclient не сможет обнаружить DHCP-сервер, eth0 получит 169.254.*.* адрес (самостоятельно назначенный)

Вам нужно сохранить то, что у вас есть, прежде чем запускать dhclient.

Eg. OLDIP=ifconfig eth0 | sed ... Inet ... #come with your SED statement

Затем вы продолжаете:

dhclient eth0
If [$? !=0];then
    Ifconfig eth0 $OLDIP $OLDMASK

Я пишу с телефона, поэтому очевидно, что синтаксис неверен.

Надеюсь, поможет

person Gian    schedule 02.02.2015