我在家里的厨房中使用 Raspberry Pi 作为 Wifi 桥接器,为只有以太网的设备提供网络连接。
我使用了威尔·哈利的指南,效果很好。该部分已解决,但我还希望该设备能够无缝唤醒我的 NAS,但该功能在客户端设备上不可用。
etherwake
[NAS 的 MACADDRESS] 效果很好,可以使用终端从 Raspberry Pi 桥接器完美唤醒我的 NAS,所以我只想根据触发器自动执行此操作。
当媒体应用程序在客户端设备上加载时,当它尝试连接到 NAS(已关闭)时,会发生以下情况,我曾经pktstat
显示以下内容:
603.8 0% tcp 192.168.84.100:52787 <-> 192.168.84.2:21
192.168.84.2 是 NAS,.100 是客户端设备...我使用基本的 LAN ftp 服务器在房子周围共享媒体,因此使用端口 21。
如何创建一个持久脚本/服务来侦听该 TCP 流量,并在捕获该流量时启动辅助脚本(我已经有了 WOL)。
该脚本还需要仅在对 NAS 的 ping 响应失败时运行,以避免它不断尝试唤醒它?
如果我可以在 Pi 上运行它,这意味着每当有人在厨房打开媒体播放器时,如果我的 NAS 关闭,它也会唤醒它。这对我的家人非常有用。
如今,电价意味着在不需要时关闭我的 NAS,这样它就可以睡觉了,这真是太棒了。我的其他设备大部分都有 WOL 功能,所以我尝试在这里手动创建它。
答案1
以下全部归功于 Ljm Dullaart 的帮助,这是一个可以解决该问题的解决方案:
#!/bin/bash
interfacename=eth0
IPofNAS=192.168.84.2
MACADDRESSofNAS=AA:BB:CC:DD:EE:EE
timeout=300
while : ; do
tcpdump -nt -i $interfacename -c1 dst $IPofNAS and port ftp
if ! ping -c1 $IPofNAS ; then
etherwake -i wlan0 $MACADDRESSofNAS
fi
sleep $timeout
done
最初,该脚本会不断唤醒我的 NAS,因为 tcpdump 正在查找 NAS IP 的 ARP 请求,这些请求是在客户端设备关闭时发生的,并且它们仅发生在 Pi 上。我花了一段时间才发现这一点。此外,tcpdump 将端口 21 写入“ftp”,因此当我添加端口 21 来过滤脚本时,它会停止工作。在 tcpdump 原始输出中看到 ftp 是纯文本后,我像这样添加了它。
真是太感谢你了!
答案2
一种可能的方法是监控通过 Pi 并前往 NAS 的所有流量。如果有流量,则唤醒 NAS。在脚本中,类似于:
#!/bin/bash
interfacename=eth0
IPofNAS=192.168.84.2
MACADDRESSofNAS=00:11:22:etc
timeout=600
while : ; do
tcpdump -nt -i $interfacename" -c1 dst $IPofNAS
if ! ping -c1 $IPofNAS ; then
etherwake $MACADDRESSofNAS
fi
sleep $timout
done
说明: 转储发送至 NAS ( ) 的tcpdump -nt -i $interfacename -c1 dst $IPofNAS
单个数据包 ( ) 。无 DNS 解析,无时间戳 ( )。-c1
dst $IPofNAS
-nt
当收到这样的数据包时,会进行测试ping
以查看 NAS 是否做出反应;如果没有:etherwake
已启动。
然后我们会等待一段时间$timeout
再重新开始,以防止 ping 淹没 NAS。应该$timeout
是在 NAS 进入睡眠状态之前的超时时间附近。您可能想尝试一下。
您可以要求systemd
启动此脚本。/etc/systemd/system/wolNAS.service
用内容创建
[Unit]
Description=WOL of the NAS
[Service]
ExecStart=/bin/bash /usr/local/bin/the_script_above.sh
[Install]
WantedBy=multi-user.target
(免责声明:未经测试)