使用Shell脚本检查是否连接到Internet

时间:2020-01-09 10:37:41  来源:igfitidea点击:

在本文中,我将分享多个命令和示例,以检查Linux计算机是否已连接到Internet。

在本文的结尾,我还将分享一些示例,以使用Shell脚本测试从Linux到外部网络的Internet连接。

但是在我们这样做之前,我们必须先做好某些事情,例如

  • 我们已将IP地址分配给网络接口(静态或者dhcp)

  • 网关可以从Linux系统访问

  • 如果我们在虚拟机上,请确保将VM配置为能够连接外部网络

  • DNS已正确配置

现在,Linux中提供了多个命令,可用于"检查是否已连接到互联网",我们将在此处尝试简要讨论其中的一些命令。

1. Ping测试

我用来检查是否已连接到Internet的第一个工具是通过ping实用程序。

但是我们知道如何检查ping或者执行ping检查以检查是否已连接到Internet吗? Ping是iputils rpm的一部分,因此请确保在设置中安装了iputils。

要执行ping检查,请尝试ping互联网上的任何页面,例如" google.com"

# ping -c 1 google.com
PING google.com (172.217.166.110) 56(84) bytes of data.
64 bytes from maa05s09-in-f14.1e100.net (172.217.166.110): icmp_seq=1 ttl=49 time=46.9 ms
--- google.com ping statistics --
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.923/46.923/46.923/0.000 ms

其中我们将-c 1与ping工具一起使用,仅发送一个数据包。现在检查统计信息部分,我们看到发送和接收了1个数据包,并且有" 0%数据包丢失",这意味着我们已连接到Internet。

说明:

如果执行不带-c参数的ping检查,则ping将继续传输数据包,按Ctrl + C可以随时停止传输并观察"数据包丢失"的统计信息

如果我们打算检查是否通过Shell脚本连接到Internet,则可以在下面使用,输出中除" 0"以外的任何内容均表示未连接到Internet。

# ping -c 1 -q google.com >&/dev/null; echo $?
0

重要的提示:

如果系统正在使用代理服务器连接到Internet,则无法执行ping检查。我们可以使用本文中的其他命令来检查是否已连接到Internet

2.使用cat,echo。检查端口可用性。

有多种工具可用于检查端口可用性,我将在本文中分享这些工具。但是默认情况下,其中许多未安装,因此我们可能必须手动安装它们。或者,我们可以使用以下命令检查是否已连接到互联网,而无需安装任何其他转速

# cat < /dev/null > /dev/tcp/8.8.8.8/53; echo $?
0

如果输出为0,则表示我们已连接到Internet,但是如果输出如下所示

# cat < /dev/null > /dev/tcp/8.8.8.8/53; echo $?
-bash: connect: Network is unreachable
-bash: /dev/tcp/8.8.8.8/53: Network is unreachable
1

然后,linux节点未连接到Internet。

或者,我们也可以使用

# echo -n >/dev/tcp/8.8.8.8/53; echo $?
0

3.使用nslookup,主机等进行DNS查找。

我们可以在任何网页地址上执行DNS查找,以检查是否已连接到Internet。通过成功的DNS查找,我们应该会收到类似以下的响应。

# nslookup google.com
Server:         192.168.0.10
Address:        192.168.0.10#53
Non-authoritative answer:
Name:   google.com
Address: 172.217.166.110
Name:   google.com
Address: 2404:6800:4007:811::200e

如果DNS查找失败,我们应该得到类似以下内容的信息

# nslookup google.com1
Server:         8.8.8.8
Address:        8.8.8.8#53
** server can't find google.com1: NXDOMAIN

说明:

现在,出现此错误服务器找不到XXXX:NXDOMAIN并不特别意味着该节点未连接到Internet,也可能意味着所提供的服务器XXX无效。因此,请尝试查找一个已知为UP的域,以免出现误报。

还有许多其他命令可以执行DNS查找,例如主机,挖掘等

# host www.google.com
www.google.com has address 216.58.196.164
www.google.com has IPv6 address 2404:6800:4007:812::2004

4.卷曲

curl是使用许多受支持的协议之一(例如HTTP,FTP等)从服务器传输数据或者向服务器传输数据的工具。我们还可以使用此工具在Linux中查询网页并测试Internet连接。

# curl -Is  http://www.google.com | head -n 1
HTTP/1.1 200 OK

其中如果我们收到的不是" 200 OK",则表示服务器无法连接到提供的页面。因此,除非我们提供无效的网页,否则节点已连接到Internet

说明:

确保我们是否卷曲了Linux节点上安装的rpm,以检查是否已连接到Internet

5. Telnet

Telnet是另一个检查端口连接性的工具,因此我们可以从Linux节点检查任何网页的端口可用性,以检查是否已连接到Internet。

我们可以尝试连接Google DNS的端口53来检查互联网连接。

# telnet 8.8.8.8 53
Trying 8.8.8.8...
Connected to 8.8.8.8.
Escape character is '^]'.
Connection closed by foreign host.

如我们所见,会话已连接。如果我们得到如下输出

# telnet 8.8.8.8 53
Trying 8.8.8.8...
telnet: connect to address 8.8.8.8: Network is unreachable

则表示互联网连接存在问题。

6. Nmap

nmap通常是一个端口扫描程序,用于检查系统上打开的端口列表。我们将使用它来连接到外部网络以扫描端口。如果它能够连接到外部网络进行端口扫描,那么我们可以检查是否连接到互联网。

# nmap -p 443 google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2019-11-19 07:40 IST
Nmap scan report for google.com (172.217.166.110)
Host is up (0.054s latency).
Other addresses for google.com (not scanned): 2404:6800:4007:811::200e
DNS record for 172.217.166.110: maa05s09-in-f14.1e100.net
PORT    STATE SERVICE
443/tcp open  https
Nmap done: 1 IP address (1 host up) scanned in 0.77 seconds

其中我正在端口443上扫描google.com。如我们所看到的突出显示的部分所示,nmap能够与google.com建立连接

7. netcat或者nc

在某些Linux变体中,我们会发现netcat,而在其他nc中,则可以使用这两种工具进行端口扫描。 nc或者ncat是nmap-ncat rpm的一部分。其中我们使用" nc"命令检查端口443上google.com的连接

# nc -vz google.com 443
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 172.217.166.110:443.
Ncat: 0 bytes sent, 0 bytes received in 0.07 seconds.

8. wget

GNU Wget是一个免费实用程序,用于从Web上非交互式下载文件。但是我们也可以使用它来检查是否已连接到互联网。

# wget -q --spider http://google.com ; echo $?
0

其中使用--spider命令,Wget会像一个Web蜘蛛一样工作,这意味着它不会下载页面,只需检查它们是否在页面中即可。使用echo $?命令,我们检查退出状态,而不是0。输出表明系统未连接到互联网

9. Traceroute

traceroute命令显示从机器到指定主机的路由所采取的每个步骤。假设我们在连接到www.google.com时遇到问题,因此可以使用traceroute检查所有到达目标服务器的集线器。这还将测试互联网连接。

# traceroute www.google.com
traceroute to www.google.com (216.58.196.164), 30 hops max, 60 byte packets
 1  _gateway (192.168.0.1)  3.046 ms  2.873 ms  3.291 ms
 2  10.249.0.1 (10.249.0.1)  4.148 ms  4.676 ms  4.678 ms
 3  broadband.actcorp.in (202.83.20.173)  5.153 ms  5.445 ms  6.305 ms
 4  broadband.actcorp.in (202.83.20.181)  4.952 ms  6.212 ms  6.195 ms
 5  * * *
 6  72.14.194.18 (72.14.194.18)  48.202 ms  49.669 ms  49.504 ms
 7  108.170.253.113 (108.170.253.113)  50.061 ms 108.170.253.97 (108.170.253.97)  48.480 ms  48.512 ms
 8  216.239.43.239 (216.239.43.239)  49.911 ms  56.915 ms 216.239.43.235 (216.239.43.235)  57.610 ms
 9  * * *
10  * * *
11  * * *
12  * * *

其中我们可以一直追踪到google.com的路线。

"那些* * *是什么意思?"?

每一跳表示该跳的五秒钟超时。有时,这可能表示机器由于错误而根本不了解如何处理该跟踪路由数据包,但是一致的*表示216.239.43.239传递数据包的路由器存在问题。

在没有互联网连接的Linux系统上,我们将面临DNS解析本身的问题

# traceroute www.google.com
www.google.com: Name or service not known
Cannot handle "host" cmdline arg `www.google.com' on position 1 (argc 1)

提示:

我们必须安装tracerouterpm才能使用此工具

如何使用Shell脚本检查是否已连接到Internet?

我们可以轻松地使用上述任何或者所有命令/方法来检查是否已使用bash/shell脚本连接到Internet。

例如,使用wget,我们可以在下面的shell脚本中测试Internet连接:

#!/bin/bash
wget -q --spider https://google.com
if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

其中此脚本将打印Internet的状态,对于其他脚本,我们可以检查退出状态并相应地执行任务。