如何使用 Bash 编写设备发现工具

如何使用 Bash 编写设备发现工具

我有一台运行 Linux 服务器的嵌入式 PC 和一个用于农业行业的简单 Web 服务器,我的客户购买这些 PC 并将它们用于他们的田地。(他们将其安装在离地面 6 或 7 米的杆子上,很难访问)有时他们将这些 PC 的 IP 地址范围从原始范围更改为他们自己想要的 IP 范围。例如,我给它们发送的是 192.168.10.10/24,但他们可能会将其更改为 172.16.12.19/29 或 10.10.200.10/8 或...

问题是过了一段时间他们就忘记了 PC 的 IP 地址,我们想给他们一个工具来检测并显示当前的 IP 地址。

我认为使用广播 IP 地址并通过本地网络发送消息可能有助于解决此问题。但经过一番搜索后,我意识到我必须至少知道范围,例如(172.16.12.X 或 10.10.200.X),这对我来说是不可能的,因为农民也忘记了网络范围。Linux 中是否有类似“NC”的工具可以帮助我编写 bash 脚本来查找他们的 IP?我可以通过网络访问 PC,但无法将显示器连接到 PC,因此唯一的方法是使用本地网络查找 IP。

我想要这样的东西:

echo "What is your IP Address ? " | nc -w1 -u 4545

我在电脑上放了一些东西,每当他们收到确切的短语“你的 IP 地址是什么?”时,它就会回答此消息。

nc -l -u -p 4545

但是对于 nc,我必须指定一个我不可能做到的网络范围。

编辑:

如果您曾使用过 IP 摄像机的设备发现工具 (DDT),您就会知道它们会独立于安装了 DDT 的 PC 找到摄像机 IP。我想要一个与这些程序完全相同但使用 bash 命令的程序。

答案1

如果你使用阿瓦希在嵌入式 PC 上,您无需重新发明/重新实现服务发现

在嵌入式 PC 上:

apt-get install avahi-daemon
systemctl enable avahi-daemon --now
un-comment #publish-workstation=yes in /etc/avahi/avahi-daemon.conf
systemctl reload avahi-daemon

在用于发现嵌入式 PC 的机器上:

apt-get install avahi-utils
avahi-browse -atr #  will output names and ip:s of devices on network to terminal

答案2

正如所发布的,问题看起来太广泛了。据我了解,您有两个不同的问题:

  1. 生成一种方法来避免将来出现此类问题。
  2. 访问服务器现在有问题,实施解决方案1。

对于问题 #1,您可以让服务器将旧 IP 恢复为固定值,而不是找到了解新 IP 的方法。您可以设置一个 crontab 任务来检查当前 IP,并且每当它偏离设定值时,它都会将 IP 更改回目标。当然,您将有“网络盲区”的时间窗口,具体取决于 crontab 中设置的频率。

或者,crontab 任务可以广播/发送电子邮件/等。新 IP。正确的机制在很大程度上取决于您愿意操作什么,您如何访问服务器。

这一切似乎都是解决办法。如果配置正确,它们不应该“忘记 PC IP 地址”。我想这就是需要修复的问题。如果您可以提供更多有关当前配置的信息,这将缩小问题的范围。

对于问题 #2,如果这是您的目标,请提及。我有一个“类似”的问题。我远程访问的服务器偶尔会更改 IP,因为它是由 DHCP 分配的。每当我ssh访问服务器时遇到问题时,我都会执行一个小脚本,通过组合和pingssh在 IP 循环内)并检查响应,可以获取当前 IP。根据您网络配置的许多方面,这可能对您有用,也可能没用。

答案3

我猜农民们正在重新配置它,因为他们的本地网络地址发生了变化。在这种情况下,为什么不让服务器通过 DHCP 获取其地址,您可以记下 Mac 地址(不会改变),然后搜索 DHCP 服务器表,甚至尝试在 DNS 服务器上查找以找到 PC。从交换机末端拔下电缆并将其重新插入应该会启动 DHCP 配置会话。大多数 DHCP 服务器允许您根据 Mac 地址分配地址,因此您可以在 dhcp 服务器端对其进行一些控制。

答案4

netcat可以在“杆式服务器”上执行类似 cronjob 的操作,每隔 X 分钟执行一次如下操作:

#!/bin/bash

# replace eth0 with the name of your interface or get the IP via other means

ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ' ' -f 10)"
datum=$(date)
echo "This is my IP: "$ip | netcat -q 2 -b -u 255.255.255.255 12001

用户/农民只需要听这样的话:

echo | nc -ulp 12001

X 分钟后他们应该会得到如下结果:

This is my IP: 192.168.1.121

但是,只有当“农民 PC”和“杆式服务器”位于同一子网中时,这才有效。


解释

脚本将nc在有效负载(我们的echo命令)+ 2 秒后在端口 12001 上发送 UDP 广播并退出。显然,IP 不必通过ifconfig,但它很容易解析。

将其发送到 255.255.255.255 意味着广播到整个子网,无论大小。

所以我们不需要知道我们在哪个网络上。

在客户端,我们监听nc直到得到有效载荷。我发现nc 与换行符结合可以干净地终止(通过echo)。

相关内容