设置保存的静态IP地址,如果DHCP失败



我正在尝试在带有bash脚本的带有wheezy的覆盆子pi上实现以下场景。我之所以这样做,是因为如果DHCP在线,我希望设备始终获得新的IP,与此同时,我希望在DHCP离线的情况下保留最后一个使用的IP。最重要的是,IP地址可能会更改,我有很多设备,因此仅设置静态IP并不是我的选择:

  • 引导(不在脚本中;))
  • 在DHCP上开关并尝试获取IP地址
  • 检查我是否有一个

    a)获得IP(DHCP成功)

        ->将IP Infos保存到文件

    b)没有获得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客户端服务(我认为是dhclient的ifplugd)给我假的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中奏效,但是在系统启动时不会自动启动!

ok Mate,

您的问题是您的脚本认为,如果找不到DHCP,IFConfig将没有IP地址。

如果DHCLIENT未能发现DHCP服务器,则eth0将获得169.254.*.*地址(自分配)

您需要在运行DHClient之前保存所获得的东西。

例如。OLDIP=ifconfig eth0 | sed ... Inet ... #come with your SED statement

然后您继续:

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

我正在用手机写作,所以显然语法是不正确的。

希望它有帮助

相关内容

  • 没有找到相关文章

最新更新