Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-通过ARP表循环并将IP存储在变量中_Bash_Ssh_Network Programming_Arp - Fatal编程技术网

Bash-通过ARP表循环并将IP存储在变量中

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让我注意到并非我网络上的所

因此,如果我想通过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让我注意到并非我网络上的所有设备都可以在我的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
  • cut
    删除所有传统信息,只留下 IP地址,每行一个

比开发自己的扫描工具更好的解决方案可能是使用已经存在的工具

要查看哪些IP地址是可访问的(作为副作用将填充ARP缓存),您可以使用。它可能适用于您的操作系统或发行版。我的本地网络中的一个示例:

$ 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