从脚本中查找 LAN 上的服务器 IP

从脚本中查找 LAN 上的服务器 IP

我正在寻找一种方法,让客户端计算机上的脚本自动查找同一网络上的服务器 IP。

我有几个运行 ubuntu 14.04.1 的媒体扩展器客户端和一个在单个 LAN 上运行相同的服务器。我希望客户端在启动时在网络中搜索服务器。设置静态 IP 不是我可以从服务器或 dhcp 中使用的解决方案。

按主机名搜索可能是有用的,但我真的很希望服务器上有一些东西可以广播并允许客户端以这种方式找到它,以防两个设备具有相同的主机名(不太可能但可能),或者主机名发生变化。而且 LAN 可能并不总是同一个以太网。 (例如,192.168.1。,10.0.0。, ETC)

客户端最终会寻找在服务器上运行的 mysql 服务器,但我实际上只需要 IP,以便脚本可以配置软件以使用服务器上的数据库。

预先感谢您的任何帮助。

编辑:第三方程序很好。客户端可以随时连接到任何子网上的任何服务器。当我有东西要找到服务器时,一旦与服务器的连接丢失,我可能会使用某种保活来重新启动搜索。保留 MAC 或其他硬件标识符的列表不是一种选择。

答案1

根据您的要求,我认为这正是Multicast DNS (i.e. Bonjour)定义的目的。如果您使用 Ubuntu 系统,很可能您已经拥有阿瓦希已经安装了服务器avahi-daemon和客户端avahi-discover

基本上你可以将其设置如下:

  • 如果您想要为服务器起一个奇特的名称(而不是默认的主机名),您只需在 Avahi 守护程序中正确配置其名称即可。此配置可以通过桌面或通过修改/etc/avahi/avahi-daemon.conf配置文件并确保其定义了以下内容来完成:

    [server]
    host-name=database
    domain-name=local
    


  • 客户端只需解析该名称的IP地址database.local即可获得IP地址。例如运行ping database.local或使用 Avahi 工具:avahi-resolve -4 -n database.local

这是可行的,因为本地 DNS 域被定义为多播域。客户端将向 LAN 发送多播查询,该查询将到达所有连接的系统。服务器中的 Avahi 守护进程将回答该查询并提供其 IP 地址。

您将能够找到有关的更多信息如何在这里设置 ZeroConf

如果您想修改mDNS,也可以同时安装客户端,avahi 工具MDNS 扫描。第一个可用于宣传服务,其他可用于在网络中查找该服务。例如:

要在服务器中运行服务来注册与 MySQL 数据库关联的新名称:

    $ mzclient -p "_sql._tcp 3306 database"
    *** Registering name = 'database', type = '_sql._tcp', domain = 'local.'
    *** Registered name = 'database'
    (...)

要尝试使用 Avahi 一次性查找服务:

$ avahi-browse -t _sql._tcp 
+   eth0 IPv4 database    _sql._tcp            local

或者通过不断扫描网络尝试查找可用的 mDN 服务:

    $ mdns-scan 
    + server [xx:xx:xx:xx:xx:xx]._workstation._tcp.local
    + database._sql._tcp.local
    Browsing ... \           
[ interrupt with Ctrl+Z]


请注意,在此配置中您没有使用中央 DNS 服务器,这不是必需的。所有查询都是使用多播流量在本地 LAN 中完成的。

答案2

我猜服务器的 MAC 不会改变,至少不会频繁改变,所以我会用它来识别服务器的 IP。我会使用类似的方法arpwatch来监视网络,直到识别出服务器 IP/MAC 对,从而获得服务器 IP。

答案3

使用 nmap 进行网络扫描应该可以。更简单的第一步是运行命令arp -a,它可以为您提供广播网络上的所有 mac 和 IP(如果 ICMP 请求未被阻止)。

接下来,尝试 ping 您所在的广播地址(要求 ICMP 请求未被阻止)。例如,如果您的服务器是 192.168.1.10,网络掩码是 255.255.255.0,那么ping -b 192.168.1.255(在 Windows 上ping -a 192.168.1.255)应该调用网络上所有其他设备(服务器、路由器、瘦客户端等)的响应。

当然,这只会为您提供子网内的设备。如果您的“网络”有更多子网,您ping 也可以运行到这些其他网络的广播地址,并从每个网络中生成类似的设备列表。

答案4

编辑2(根据我们的对话):

看看这是否更适合您(包含更多信息):

  nmap -p 22 --open -sV 192.168.1.0/24

awk像以前一样,如果您只想要 IP,请添加:

  nmap -p 22 --open -sV 192.168.1.0/24 | 
        awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'

在哪里:

nmap : the executable name
-p 22 : specifies the port to test
--open : suppress output for clients that are not listening
-sV : display the version string reported by the scanned server

编辑:

如果您尝试获取本地计算机可以与之通信的网络上的所有 IP 地址,请尝试nmap

nmap -sP -PA21,22,25,3389 192.168.1.1-254 | 
    awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'

我尝试点击自定义范围的端口来测试服务器是否已启动-PA21,22,25,3389(在广播网络上192.168.1.1-254),如果您有一个您可能知道要尝试点击的特定端口,则可以更改此设置。awk如果您想要的不仅仅是 IP 地址,您可以删除,它还会打印出主机名等。


如果您只想要来自 的服务器的 IP 地址ifconfig,您可以运行:

ifconfig | awk '/inet addr/{print substr($2,6)}'
[OR]
/sbin/ifconfig | awk '/inet addr/{print substr($2,6)}'

这将打印如下结果:

10.0.0.XX1
10.0.0.XX2
10.0.0.XX3
127.0.0.1

localhost - 127.0.0.1要从结果中删除,请使用:

ifconfig | awk '/inet addr/{print substr($2,6)}' | awk '!/127.0.0.1/'

Result:
192.168.1.XXX

您可以将该行按原样放入脚本中,并在本地计算机上运行它以获取 IP 地址,或者也可以放入 shell 脚本中以获取远程地址,如下所示ssh

#!/bin/sh
#getremoteips.sh
#chmod 700 getremoteips.sh ##Root should only be running this

ssh $1 "/sbin/ifconfig |
awk '/inet addr/{print substr(\$2,6)}' |
awk '!/127.0.0.1/'"

并运行脚本:./getremoteips.sh <enter hostname or ip>

相关内容