我对 Ubuntu 还不熟悉,刚刚安装了 Ubuntu-server 14.04.3 LTS。我已经注册了动态 DNS,并选择使用 bash 脚本,通过简单的 wget 命令在动态 DNS 网站公开的 REST API 上更新我的 IP 地址。我计划在 dhclient (DHCP) 续订后执行 bash 脚本,但我不知道如何配置 dhclient 来执行这样的操作。
谢谢,
答案1
我找到了解决问题的方法。 man dhclient
指出脚本在dhclient
获得租约时被调用。进一步阅读和实际脚本本身描述了根据 dhcp 过程的阶段执行的man dhclient-script
脚本的位置。dhclient
钩子位于和/etc/dhcp/dhclient-enter-hooks.d
目录中/etc/dhcp/dhclient-exit-hooks.d
,用于执行前后操作dhclient
。由于我对成功续订后执行脚本感兴趣,因此我将脚本放在目录中...-enter-hooks.d
。
这是脚本,在执行动态 DNS 脚本之前检查表示新的 dhcp ip 地址的特定阶段:
case "$reason" in
BOUND|RENEW|REBIND|REBOOT)
sh /etc/network/rinker.sh
;;
esac
我rinker.sh
从http://www.changeip.com/accounts/downloads.php?action=displaycat&catid=4,这只是对网站更新 URL 进行简单的 wget 调用。
答案2
我想跟进 Poly Bug 的回答。
我发现,在调用外部脚本时,如果在调用脚本之前使用“sh”和“source”,dhclient 会将其视为“其钩子的一部分”。因此,它会给出如下错误:
[[: not found 如果在调用的脚本中包含 if / then 语句,则您打算运行的钩子脚本将失败。
相反,删除 sh 并运行 dhclient-exit-hook 脚本,如下所示:
#!/bin/bash
# dhclient is picky about how it runs sub-scripts.
# using this way allows divorces it from the hook itself so it runs independently of the hook
/SM/data-drive/sm_scripts/network/dhclient-resolv-set $0 $BASH_SOURCE $reason &
这将以异步方式运行您调用的脚本而不会出现错误。
我还根据这篇文章制作了后续视频: