我已经有了ddclient
3.8.2 使用 OpenDNS。我在笔记本电脑上运行它。我可能会带着笔记本电脑旅行,所以如果我不在家,我不想更新 IP。
如何限制ddclient
仅在我使用家庭网络时才更新 IP?这必须有选择地实现自动化。
至少有两种方法可以定义我是否在家庭网络上:
假设我使用 wifi,并且我家wifi SSID 名称是
home-ssid
。假设我可以配置这个名字。或者,假设我的路由器的 MAC 地址是
F7:C1:A2:54:4F:71
(假的)。假设我可以配置这个值。这种方法适用于 wifi 和/或有线。
如果没有其他办法,可以使用use=cmd
而不是use=web
in /etc/ddclient.conf
。这样,如果我不在家,我就可以智能地让外部命令失败或返回未更改的 IP。为此,请注意/var/cache/ddclient/ddclient.cache
缓存最后一个已知 IP。
请提供完整的工作解决方案。
答案1
我有两个自定义解决方案供您使用。一个仅使用 Wifi SSID,另一个使用 MAC 地址确定。
这两个版本的先决条件是您拥有可运行的ddclient
OpenDNS 配置。
两者的第 1 步:禁用ddclient
自动执行。
我知道你使用的设置指南已经将它设置为守护进程,但我们将禁用自动ddclient
更新过程。
编辑/etc/default/ddclient
。我们将首先禁用守护进程模式,并禁用dhclient
和ipup
集成。这应该看起来类似于此:
# Configuration for ddclient scripts
# generated from debconf on Tue Jun 26 12:45:45 EDT 2018
#
# /etc/default/ddclient
# Set to "true" if ddclient should be run every time DHCP client ('dhclient'
# from package isc-dhcp-client) updates the systems IP address.
run_dhclient="false"
# Set to "true" if ddclient should be run every time a new ppp connection is
# established. This might be useful, if you are using dial-on-demand.
run_ipup="false"
# Set to "true" if ddclient should run in daemon mode
# If this is changed to true, run_ipup and run_dhclient must be set to false.
run_daemon="false"
# Set the time interval between the updates of the dynamic DNS name in seconds.
# This option only takes effect if the ddclient runs in daemon mode.
daemon_interval="300"
现在,禁用该ddclient
服务,这样它就不会自动运行。我只有 16.04 及更高版本的语法来禁用该服务,但还有其他关于“如何禁用服务”的帖子。
sudo systemctl disable ddclient
完成此操作后,您可以使用以下两个选项之一及其说明来设置自定义的自动化流程。
第 2 步:确定要使用的方法:仅 Wifi 的 SSID 检测或 MAC 地址检测。根据您想要采用的解决方案,请按照以下特定部分进行操作。
仅限 Wifi:SSID 检测
这是用于基于 SSID 检测的 Python 代码本身。将正确的 Wifi SSID 输入到 中存储的值中WIFI_NETWORK_NAME
。
#!/usr/bin/python3
import shlex
import subprocess as sp
# Replace 'FillMeIn' in this line with the actual network name.
WIFI_NETWORK_NAME = "FillMeIn"
proc = sp.getoutput(shlex.split('iwconfig'))
if WIFI_NETWORK_NAME in proc:
sp.call(shlex.split('ddclient -file /etc/ddclient.conf'))
将此代码存储在 中/opt/py-selective-ddclient.py
。您可能必须将其存储在主目录中,然后将其复制到/opt/
中sudo
。
Wifi 和以太网:MAC 地址检测
这是该解决方案的 Python 代码;相应更新值MAC_ADDRESS_ROUTER
:
#!/usr/bin/python3
import shlex
import subprocess as sp
# Replace the fake MAC address below with the MAC address of your router.
# Make sure to use **uppercase letters** if you have letters present.
MAC_ADDRESS_ROUTER = "01:23:45:67:89:AB"
if MAC_ADDRESS_ROUTER in sp.getoutput(shlex.split('iwgetid -ra')).upper():
sp.call(shlex.split('ddclient -file /etc/ddclient.conf'))
将此代码存储在 中/opt/py-selective-ddclient.py
。您可能必须将其存储在主目录中,然后将其复制到/opt/
中sudo
。
步骤3:自动化Python代码调用。
现在,我们必须自动运行ddclient
,或者更具体地说是自动运行 Python 脚本。默认ddclient
设置更新检查间隔 300 秒(5 分钟)。
首先我们需要使 Python 脚本可执行。
sudo chmod +x /opt/py-selective-ddclient.py
然后,开始创建一个/etc/cron.d/
包含以下内容的文件。请注意,您需要使用 来sudo
创建该文件。
*/5 * * * * root /opt/py-selective-ddclient.py
这将ddclient
每 5 分钟手动执行一次。您可以更改该*/5
部分以使其以不同的间隔执行,但我ddclient
在这里模拟的设置。
现在,每 5 分钟ddclient
就会使用我们的“包装器”脚本进行选择性判断。
答案2
这些脚本需要 OpenDNS 的工作ddclient
配置。
这是一个检查家庭 wifi 网络名称的 bash 版本
#!/bin/bash
# Read the name of the Wi-Fi network the computer is conneted to
# If not connected to wifi echo message and quit
# If home network run ddclient
# If any other network quit
# Change FillMeIn to your WiFi network name
HOMEWIFI= FillMeIn
# Get the current WiFi network name
SSID=$(iwgetid -r)
if [[ ! $SSID ]]; then # Not on WiFi
echo "Could not find any WiFi, exiting..."
elif [[ $SSID == $HOMEWIFI ]]; then
echo "We are home! Running ddclient now."
/usr/sbin/ddclient -file /etc/ddclient.conf
else
echo "This WiFi is not home! Exiting..."
fi
如果您想要不太冗长的最少代码,请使用以下几行:
#!/bin/bash
# Change FillMeIn to your WiFi network name
HOMEWIFI= FillMeIn
SSID=$(iwgetid -r) # -r for SSID
if [[ $SSID == $HOMEWIFI ]]; then
/usr/sbin/ddclient -file /etc/ddclient.conf
fi
这是一个检查家用路由器 MAC 地址的 bash 版本
#!/bin/bash
# Change FillMeIn to your router's MAC address
ROUTERMAC= FillMeIn
$MACA=$(iwgetid -ra) # -ra for MAC address
if [[ $MACA == $ROUTERMAC ]]; then
/usr/sbin/ddclient -file /etc/ddclient.conf
fi
您只需要其中之一。将三个脚本之一存储起来/opt/home_wifi_ddclient.sh
并使脚本可执行:
sudo chmod +x /opt/home_wifi_ddclient.sh
要创建 cron 条目,我建议使用crontab
:
sudo crontab -e
如果存在文件,此命令将为crontab
root 用户打开该文件,否则创建一个空白的新文件。在文件末尾添加以下行:
*/5 * * * * root /opt/home_wifi_ddclient.sh
该*/5
部分表示该脚本将每 5 分钟运行一次。
如果您使用 nano 作为文本文件编辑器,请按Ctrl+退出编辑器X。编辑器将提示您保存更改。按Y然后Enter按 选择默认文件名。
希望这可以帮助