![如何使用 dhclient 释放和续订 DHCP 租约,而不丢失连接](https://linux22.com/image/203592/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20dhclient%20%E9%87%8A%E6%94%BE%E5%92%8C%E7%BB%AD%E8%AE%A2%20DHCP%20%E7%A7%9F%E7%BA%A6%EF%BC%8C%E8%80%8C%E4%B8%8D%E4%B8%A2%E5%A4%B1%E8%BF%9E%E6%8E%A5.png)
我想在尝试之前确定它是否有效,因为我正在处理一个只能通过 SSH 访问的无头 Pi(如果重要的话为零 W)。
我已经在我的路由器中为 Pi 设置了地址保留,这或多或少是必要的,既可以简化通过 Putty 的访问,也可以访问在 Pi 上运行的自定义服务器。
问题是,最初没有预留,所以它位于池中的其他随机地址,而不是我为其预留的“非池”区域中的固定地址。耐心并没有解决问题:几天来它一直坚定地保留该地址,而不是改变。我假设路由器中的 DHCP 服务器的租约长度合理,例如 12 或 24 小时。
显然,如果我只是用来dhclient -r
释放租约,我当前的 SSH 会话将中止,留下的状态不太有用。我还注意到,如果您dhclient -r
存在 WiFi 连接也会中断的风险:请参阅底部的警告这一页了解详情。
那么,在 root bash 会话中输入内容的可能性有多大:nohup (dhclient -r -d && dhclient) &
(a) 终止当前租约,然后 (b) 在需要时尝试重新打开 WiFi,最后 (c) 获得新的租约,希望使用正确的地址。
我的理由是,使用nohup
意味着当 SSH 会话出现问题时它不会收到 a SIGHUP
,而将其放在后台的子 shell 中意味着它有最高的机会执行这两个命令。
我考虑过的另一个选择是nohup (dhclient -r && reboot) &
在 root bash 会话中,其中的逻辑是重新启动系统应该重新建立 WiFi 连接,然后 ping DHCP 服务器以获取地址。希望能保留一份。
如果这两个都失败,我还有哪些其他选项可以释放和续订租约,并以在首选地址连接到 WiFi 的运行系统结束?作为最后的手段,我可以看看是否可以弄清楚如何连接屏幕和键盘,但我真的不想这样做,这将是一个相当大的痛苦。
答案1
免责声明:我无法测试它,但由于只有最后一个可选步骤会更改任何永久配置,因此可能发生的更糟糕的情况是必须重置系统。
为了便于说明,我们假设:
- 无线接口称为 wlan0
- 旧地址是192.168.1.242/24
- 新的保留是 192.168.1.2/24
一切都应该以 root 用户身份运行。方法是:
使用保留地址添加静态 IP 地址:既然它是保留的,谁在乎呢?
ip address add 192.168.1.2/24 dev wlan0
使能够
promote_secondaries
在接口上(否则,当删除 IP LAN 上配置的第一个地址时,同一 IP LAN 中的所有其他地址也会被删除:新地址也会被删除)sysctl -w net.ipv4.conf.wlan0.promote_secondaries=1
或者:
echo 1 > /proc/sys/net/ipv4/conf/wlan0/promote_secondaries
使用新地址连接
ssh [email protected]
并再次成为root。从现在开始,在 root shell 上从新连接继续。
SIGKILL DHCP 客户端,以确保它在被终止时无法执行任何操作(例如关闭接口)。
目前尚不清楚是否有
dhclient
其他DHCP 客户端正在使用,或者即使其中一个客户端仍在运行(某些最小配置可能只获取一次 IP 地址并退出,根本不处理租约续订或到期)。dhcpcd
udhcpc
pkill -e -KILL dhclient
或者
pkill -e -KILL dhcpcd
ETC。
或者如果没有
pkill
命令,找出要杀死的 PID(使用kill -KILL ...
)。重要的是要确保从现在开始不再有任何客户端在运行。
手动删除较旧的地址(这会将较新的地址提升为主要地址,而不是也将其删除)
ip address del 192.168.1.242/24 dev wlan0
可选:如果需要,将配置更新为静态地址,或者不执行任何操作
由于它与 RaspberryPi Zero W 相关,我不知道如何执行最后一步(它可以使用 Debian 的如果向上向下并具有配置
/etc/network/interfaces
或以不同方式配置)。但无论如何,在没有任何更改的情况下,在下次(重新)启动时,这将采用具有此新 IP 地址的新租约,或者如果确实存在错误,则恢复到旧版本。如果 DHCP 由 处理
dhclient
,则通过删除 中的相关文件来擦除租约内存/var/lib/dhcp/dhclient*.leases
应该会强制它下次请求新的租约。因为dhcpcd
这可能是/var/lib/dhcpcd/*.lease