如何编写Linux bash脚本,告诉我局域网中哪些计算机处于打开状态?

愚蠢的发问者:

如何编写Linux Bash脚本,告诉我局域网中哪些计算机处于打开状态?

如果我可以给它一个IP地址范围作为输入,那将会有所帮助。

dbr:

我建议使用nmap的ping-scan标志,

$ nmap -sn 192.168.1.60-70

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-04-09 20:13 BST
Host machine1.home (192.168.1.64) appears to be up.
Host machine2.home (192.168.1.65) appears to be up.
Nmap finished: 11 IP addresses (2 hosts up) scanned in 0.235 seconds

就是说,如果您想自己编写(足够公平),这就是我的做法:

for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done

..以及以上命令各部分的说明:

生成IP地址列表

例如,您可以使用{1..10}语法生成数字列表。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

(它对于类似mkdir {dir1,dir2}/{sub1,sub2}-之类的东西也很有用-使得dir1and dir2,每个包含sub1and sub2

因此,要生成IP列表,我们将执行以下操作

$ echo 192.168.1.{1..10}
192.168.1.1 192.168.1.2 [...] 192.168.1.10

循环

要在bash中循环播放某些内容,请使用for

$ for thingy in 1 2 3; do echo $thingy; done
1
2
3

接下来,执行ping操作。ping命令会因不同的操作系统,不同的发行版/版本而有所不同(我目前正在使用OS X)

默认情况下(同样,在OS X版本上ping),它将一直ping直到被中断为止,这将无法正常工作,因此ping -c 1将仅尝试发送一个数据包,这应该足以确定计算机是否已启动。

另一个问题是超时值,在此版本的ping上它似乎是11秒。使用-t标志进行了更改一秒钟应该足以查看本地网络上的计算机是否处于活动状态。

因此,我们将使用ping命令。

$ ping -c 1 -t 1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

检查ping结果

接下来,我们需要知道机器是否答复。

&&如果第一个成功,我们可以使用运算符来运行命令,例如:

$ echo && echo "It works"

It works
$ nonexistantcommand && echo "This should not echo"
-bash: nonexistantcommand: command not found

好,所以我们可以做..

ping -c 1 -t 1 192.168.1.1 &&回显“ 192.168.1.1已启动!”

另一种方法是使用ping的退出代码。ping命令将以退出代码0(成功)退出(如果成功),并以非零代码退出(如果失败)。在bash中,您可以获得带有变量的最后一个命令退出代码$?

因此,要检查该命令是否有效,我们可以这样做。

ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi

隐藏ping输出

最后一件事,我们不需要看平输出,所以我们可以重定向stdout/dev/null>重定向,例如:

$ ping -c 1 -t 1 192.168.1.1 > /dev/null && echo "IP is up"
IP is up

要重定向stderr(丢弃ping: sendto: Host is down消息),请使用2>-例如:

$ errorcausingcommand
-bash: errorcausingcommand: command not found
$ errorcausingcommand 2> /dev/null
$

剧本

所以,要结合所有这些。

for ip in 192.168.1.{1..10}; do  # for loop and the {} operator
    ping -c 1 -t 1 192.168.1.1 > /dev/null 2> /dev/null  # ping and discard output
    if [ $? -eq 0 ]; then  # check the exit code
        echo "${ip} is up" # display the output
        # you could send this to a log file by using the >>pinglog.txt redirect
    else
        echo "${ip} is down"
    fi
done

或者,使用该&&方法,在一种情况下:

for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done

问题

速度很慢。每个ping命令大约需要1秒(因为我们将-t timeout标志设置为1秒)。它一次只能运行一个ping命令。解决此问题的明显方法是使用线程,因此您可以运行并发命令,但这超出了应使用bash的范围。

“ Python线程-第一个示例”介绍了如何使用Python线程模块编写多线程Ping'er。尽管在这一点上,我还是建议再次使用nmap -sn..

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在其局域网中是否可以找到私有Linux计算机的名称?

如何将UDP消息发送到局域网中的每台计算机

如何在局域网中同时在多台计算机上安装Ubuntu OS

如何通过局域网在两台Linux计算机之间共享文件?

如何查找同一局域网中其他计算机的主机名?

Ubuntu 16.04,如何与同一局域网中的Windows计算机共享卸载的磁盘/分区?

如何在同一局域网中的两台计算机之间传输文件?

如何使用主机名从局域网访问计算机

如何在所有局域网计算机上远程运行“ winrm quickconfig”

如何保护从局域网访问AWS经典EC2计算机的安全

如何访问局域网之外的另一台计算机的终端?

如何通过(SoftEther)VPN连接到局域网计算机?

如何发现局域网中所有计算机的主机名?

如何在两台计算机之间通过局域网发送文件

如果没有局域网连接,如何关闭计算机

通过局域网从另一台计算机访问本地主机(xampp)-如何?

如何从另一台位于局域网的计算机连接到NAT背后的VMware?

我如何为Redhat Linux bash shell编写shell脚本

如何在Linux脚本中编写条件分配?

如何编写bash脚本来报告计算机状态并有条件地对其进行ping操作?

如何ping我局域网中的所有IP

如何编写适用于Linux管道的Python脚本?

在Linux中如何使用C语言编写“写”系统调用?

如何在Linux中编写文本模式gui?

我如何编写bash脚本来告诉我从23:43到02:10有多少小时?

在Linux上,如何判断该计算机有多少个核心处于活动状态?

如何在局域网中备份?

bash脚本告诉我新计算机何时通过smbclient加入LAN

请告诉我如何编写nuxt插件'printd'