首页 文章

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

提问于
浏览
1

我正试图在bash脚本中使用wheezy在Raspberry Pi上实现以下场景 . 我这样做是因为我希望设备在DHCP处于联机状态时始终获得新的IP,同时我希望在DHCP脱机的情况下保留最后使用的IP . 最重要的是,IP地址可能会改变,我有很多设备,所以简单地设置静态IP不是我的选择:

启动(不在脚本中;))打开DHCP并尝试获取IP地址检查我是否有一个a)获得IP(DHCP成功) - >将IP信息保存到文件b)没有获得IP(DHCP失败) - >此处不执行任何操作根据文件中的信息设置固定IP地址

现在重点是,如果我手动运行脚本,这非常棒,但如果我让它在启动后自动运行,则DHCP将失败 but will still give me an IP address . 当然我的脚本认为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客户端服务(我认为是dpclient的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中运行,但是在系统启动后自动启动!

1 回答

  • 1

    好伙伴,

    您的问题是您的脚本认为如果找不到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
    

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

    希望能帮助到你

相关问题