Bash-通过ARP表循环并将IP存储在变量中
因此,如果我想通过SSH连接到网络上的所有设备,使用ARP表精确地知道连接的位置,我该怎么办 代码如下所示:Bash-通过ARP表循环并将IP存储在变量中,bash,ssh,network-programming,arp,Bash,Ssh,Network Programming,Arp,因此,如果我想通过SSH连接到网络上的所有设备,使用ARP表精确地知道连接的位置,我该怎么办 代码如下所示: #!/bin/bash for a in $([ARP Table here?]) do ssh user@$a true echo "Connected to $a" done 我不确定如何将dinamic IP存储在a变量中。另外,我不确定是否可以在事后使用该变量通过ssh进行连接,因为IP不是int,更可能是字符串 编辑:在Andrew让我注意到并非我网络上的所
#!/bin/bash
for a in $([ARP Table here?])
do
ssh user@$a true
echo "Connected to $a"
done
我不确定如何将dinamic IP存储在a变量中。另外,我不确定是否可以在事后使用该变量通过ssh进行连接,因为IP不是int,更可能是字符串
编辑:在Andrew让我注意到并非我网络上的所有设备都可以在我的ARP表中之后,我想知道:
从0开始到当前网络掩码的最大值或在ARP表中搜索是否更好
以下是两种情况:
#!/bin/bash
for a in $(seq 255)
do
ssh user@172.18.10.$a true
echo "Connected to 172.18.10.$a"
done
或
我将回答您最初的问题(标题中介绍的问题) 要读取arp表并遍历其中的每个IP地址,可以执行以下操作
#!/bin/bash
for a in $(arp -n | tail -n+2 | cut -d' ' -f1)
do
ssh user@$a true
echo "Connected to $a"
done
命令输出arp缓存以及一些信息 关于每个条目arp
用于删除第一行 包含的输出的不同列的标题tail
arp
删除所有传统信息,只留下 IP地址,每行一个cut
$ fping -g 10.1.1.0/29
10.1.1.1 is alive
10.1.1.2 is alive
10.1.1.5 is alive
10.1.1.3 is unreachable
10.1.1.4 is unreachable
10.1.1.6 is unreachable
fping
命令仅为ICMP——它发送ping。如果您的目标不仅仅是确定存在哪些设备,而且还要确定它们是否在SSH端口(22)上应答,那么您可以使用SSH端口或其他等效端口
for ip in $(seq -f "10.1.1.%g" 1 9); do
if tcping -u 200 -q $ip 22; then
echo "yes: $ip"
fi
done
另一个对脚本来说可能有点棘手的选项是使用实际的扫描工具,如(如中所示)
如果您使用的是网络监控系统,请检查是否内置了网络扫描工具,例如,有一个。有。可能不是一个好方法。无法保证任何给定的本地设备在任何给定的时间都会在您的ARP缓存中。@AndrewMedico您是说网络上可能有一些分区,但我的ARP表中没有。然后我将编辑我的问题。而且,“所有的设备”并没有告诉我们足够的信息。什么样的设备?思科IOS?朱诺斯?FreeBSD还是Linux?如果您谈论的是特定主机上的arp缓存,那么您可以在大多数操作系统中解析
arp-an
的输出。但听安德鲁说,他说的是实话;您的arp缓存是短暂的,并且依赖于网络活动。ARP是一种允许您的设备相互使用以太网的工具,它不是一种网络管理策略。@ghoti我是否可以刷新ARP缓存,向网络上连接的每个设备发送ARP请求(如广播中的设备),然后使用它进行连接?我所说的设备是运行linuxSure的PC。当然,你可以做很多事情。但是如果你已经有了一个设备列表,为什么不使用它来代替arp缓存呢?SSH将连接到主机名或IP地址,而不是以太网地址。启动这些连接的系统上的arp缓存只是一个允许IP和其他更高级别协议运行的工具。不幸的是,/proc文件系统是一个Linux系统。其他操作系统也有它的版本,但默认情况下它们通常不挂载,而且据我所知,它们不包括/proc/net扩展。OP没有明确说明这里使用的是什么操作系统,所以让你的答案便于携带是很重要的
for ip in $(seq -f "10.1.1.%g" 1 9); do
if tcping -u 200 -q $ip 22; then
echo "yes: $ip"
fi
done