这是一个检查家庭 wifi 网络名称的 bash 版本

这是一个检查家庭 wifi 网络名称的 bash 版本

我已经有了ddclient3.8.2 使用 OpenDNS。我在笔记本电脑上运行它。我可能会带着笔记本电脑旅行,所以如果我不在家,我不想更新 IP。

如何限制ddclient仅在我使用家庭网络时才更新 IP?这必须有选择地实现自动化。

至少有两种方法可以定义我是否在家庭网络上:

  • 假设我使用 wifi,并且我家wifi SSID 名称home-ssid。假设我可以配置这个名字。

  • 或者,假设我的路由器的 MAC 地址F7:C1:A2:54:4F:71(假的)。假设我可以配置这个值。这种方法适用于 wifi 和/或有线。

如果没有其他办法,可以使用use=cmd而不是use=webin /etc/ddclient.conf。这样,如果我不在家,我就可以智能地让外部命令失败或返回未更改的 IP。为此,请注意/var/cache/ddclient/ddclient.cache缓存最后一个已知 IP。

请提供完整的工作解决方案。

答案1

我有两个自定义解决方案供您使用。一个仅使用 Wifi SSID,另一个使用 MAC 地址确定。

这两个版本的先决条件是您拥有可运行的ddclientOpenDNS 配置。


两者的第 1 步:禁用ddclient自动执行。

我知道你使用的设置指南已经将它设置为守护进程,但我们将禁用自动ddclient更新过程。

编辑/etc/default/ddclient。我​​们将首先禁用守护进程模式,并禁用dhclientipup集成。这应该看起来类似于此:

# 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

如果存在文件,此命令将为crontabroot 用户打开该文件,否则创建一个空白的新文件。在文件末尾添加以下行:

*/5 * * * *  root  /opt/home_wifi_ddclient.sh

*/5部分表示该脚本将每 5 分钟运行一次。

如果您使用 nano 作为文本文件编辑器,请按Ctrl+退出编辑器X。编辑器将提示您保存更改。按Y然后Enter按 选择默认文件名。

希望这可以帮助

相关内容