1.4 网络故障排查类命令
二维码视频
1.4.1 命令行下载工具wget命令
wget是一个Linux命令行下的文件下载工具。对于Linux运维人员来说,是必备的工具。wget工具体积虽小,但功能完善,它支持断点下载功能,同时支持FTP、HTTP和HTTPS下载方式,支持代理服务器,使用起来也很方便简单。其格式如下:
下面看几个wget使用例子。
1.使用wget下载单个文件
从网络下载一个linux-4.20.17版本内核,可以使用以下命令:
在下载的过程中会显示进度条,包含下载完成百分比、已经下载的字节、当前下载速度、剩余下载时间。
2.使用wget的-limit-rate参数进行限速下载
当执行wget的时候,它默认会占用全部可能的带宽下载。但是当准备在线上服务器下载一个大文件时,为了不让wget耗尽带宽影响业务,必须对wget进行限速。
这是限速1MB/s进行下载。
3.使用wget-c断点续传
当要下载的文件特别大,而所在的网络速度又特别慢的时候,可能会出现一个文件还没有下载完,网络就已经中断了的情况。此时如果没有断点续传功能,又要重新下载,这简直是噩梦。wget考虑到了这一点,它支持断点续传,并且wget的断点续传是自动的,只需要使用-c参数即可,如图1-2所示。
图1-2 wget断点续传过程
断点续传对于下载大文件时由于突然网络中断等原因非常有帮助,网络恢复可以继续接着下载而不是重新下载。
需要注意的是:使用断点续传要求服务器端也支持断点续传才行。如何测试服务器是否支持断点续传呢?接下来继续介绍。
4.测试服务器是否支持断点续传
通常情况下,Web服务器(如Apache、Nginx)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可实现断点续传。断点续传是在发起HTTP请求的时候加入Range头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块地拼接起来得到完整的资源。
输出结果中如果有Accept-Ranges:bytes,说明服务器支持按字节断点续传下载。
5.使用wget下载文件并以不同的文件名保存
要将wget下载的文件以不同的文件名保存要通过wget -O参数实现,wget默认会以URL最后一个符号/后面的字符来命名,这对于动态链接的下载文件名通常会不正确。例如,URL http://cn2.php.net/get/php-7.3.2.tar.bz2/from/this/mirror,通过wget会下载一个名为mirror的文件,为了解决这个问题,可以使用参数-O来指定一个文件名:
1.4.2 强大的HTTP命令行工具curl
顾名思义,curl(CommandLine URL)命令是在命令行方式下工作,利用URL的语法进行数据或者文件的传输。
curl的官方网站是https://curl.haxx.se/,可以通过该网站获取此工具的最新版本,还有最全面的使用方法。从官网可以知道,curl支持30多种类型的传输方式,如FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、Telnet and TFTP等,其中包含多种协议。最常使用的有FILE、FTP、HTTP、HTTPS等协议。
对于运维人员来说,在探测远程服务的时候,如HTTP传输,Socket连接时,这个工具能非常方便地作为验证工具和测试工具。下面看几个curl的典型应用实例。
1.通过curl显示网站的header信息
运维人员经常使用这个用法来探测一个网站的header信息,例如:
通过curl的-I(大写的i)参数可以获取指定网站的header头信息,可以发现上面这个网站可以正常访问(200状态码),同时此网站的Web服务器是nginx/1.13.9,并且还开启了keep-alive。这些信息都是Web运维必须要具备的。
2.显示网站的HTTP状态代码
HTTP状态码对Web运维来讲非常重要,在对Web页面进行监控的时候,会经常通过状态码来判断网页的状态,如果返回状态码为非200状态,那么则认为网页异常。要获取网页状态码,除了上面的-I参数外,还有更专业的方法,那就是使用-s和-o参数组合,最后使用-w参数,例如:
其中用到的几个参数如下。
➢ -s:表示安静模式,不输出错误或者进度条之类的信息。
➢ -o:表示指定输出结果到某个文件,不指定的话默认是输出到终端。这里是将结果写入空设备中。
➢ -w:表示输出一些定义的元数据。这里输出的是%{http_code},即HTTP状态码。除http_code外,还有http_connect、time_total、time_connect、time_appconnect、time_redirect、size_download、size_upload、content_type、ssl_verify_result等变量可供选择。输出变量需要按照%{variable_name}的格式。
➢ "\n":表示换行。
再来看个例子,通过HTTP协议访问一个网站,命令如下:
可以看到输出结果中有个301,这表示当通过HTTP访问此网站的时候,自动跳转到了HTTPS,执行了301定向操作,所以状态码变成了301;第二个输出0.141是变量"%{time_total}"解析出的结果,代表总时间,按秒计,精确到小数点后三位;最后的https://www.ixdba.net/是"%{redirect_url}"变量的输出结果,代表跳转后的URL。
3.使用curl实现URL地址重定向
默认情况下curl不会发送HTTP Location headers(重定向),但使用了-L选项后,当一个被请求页面移动到另一个站点时,就会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。例如,访问http://www.ixdba.net时,会自动将地址重定向到https://www.ixdba.net上,操作如下:
输出有两个部分,可以看到有自动的跳转,这是因为使用了-L参数,curl就会跳转到新的网址。
4.抓取网页内容并保存到本地
curl也能下载文件,达到跟wget相同的功能,例如,将一个URL文件保存到本地,保存原始文件名,可以通过-O参数实现:
但是有时候URL中的文件名不固定或者想下载后重命名,可以通过-o实现,例如,将URL中的文件下载到本地,并命名为test.html,命令如下:
这里面涉及两个curl参数,如下所述。
➢ -o/--output:将文件保存在命令行中指定文件名的文件中。
➢ -O/--remote-name:使用URL中默认的文件名保存文件到本地。
5.通过curl下载文件并开启断点续传
curl也可以下载大文件,并实现断点续传。先看下面这个例子,如图1-3所示。
图1-3 curl下载文件的过程
curl下载文件其实比wget更好用,可以看到下载文件时的各个属性,如数据大小、已下载大小、总共下载用时、已经用时、下载速度等。在下载一会后,按〈Ctrl+C〉组合键,中断下载,接着再次执行curl下载,看看是否能够实现断点续传功能,如图1-4所示。
图1-4 curl的断点续传功能
这里使用了3个参数,其中-C表示断点续转,要实现自动续传则使用-C-,否则需要手工指定断点的字节位置。
6.对curl的网络使用带宽进行限速
与wget类似,curl在下载文件时也会占满系统带宽,这样一来,可能会影响线上业务系统的正常运行,因此,限速也是要做的。可以通过--limit-rate选项实现对curl下载速度的限制。来看一个例子,如图1-5所示。
图1-5 对curl网络带宽进行限速
这里限制下载速度为2MB/S,图1-5最下面的下载速度刚好是2048KB/S,实现了带宽限速。
1.4.3 Linux系统之间文件传输工具scp命令
scp就是secure copy,用于将文件或者目录从一个Linux系统复制到另一个Linux系统下。scp传输数据用的是SSH协议,保证了数据传输的安全性。其格式如下:
scp使用第1种格式是将远程Linux系统上的某个文件或者目录复制到本地Linux系统上,使用第2种格式是将本地的某个文件或者目录复制到远程Linux系统的某个路径下。
下面来看几个scp命令最经常使用的例子。
1.scp复制本地文件到远程主机
目前处在IP为192.168.60.133的Linux系统下,计划将此系统下的/home/ixdba/etc.tar.gz文件复制到IP为192.168.60.168的远程Linux系统中root用户下的/tmp目录下,使用下面命令:
命令输入完毕,会要求输入192.168.60.168服务器root的密码,然后开始远程复制数据。如果目前处在192.168.60.168服务器上,也可以使用下面的命令传输数据。
命令输入完毕,此时会要求输入192.168.60.133服务器root的密码,然后开始远程复制数据。
2.scp复制本地目录到远程主机
将本地/etc目录中所有文件和子目录复制到IP为192.168.60.135的远程Linux系统root用户下的/opt目录中,使用以下命令:
这里的选项r与cp命令中的r选项含义相同。
3.scp指定连接端口
scp使用SSH命令在两个主机之间传输文件,因为SSH默认使用的是22端口号,所以scp默认也使用22端口号。如果希望改变这个端口号,可以使用-P(大写的P,因为小写的p用来保持文件的访问时间等)选项来指定所需的端口号。例如,如果想要使用2222端口号,可以使用如下的命令:
4.通过scp命令限速传输数据
scp命令也可以限制带宽,通过指定-l参数来指定scp命令所使用的带宽即可,注意-l参数的单位是Kbit/s,如图1-6所示
图1-6 scp命令限速传输数据
注意,这里-l参数的单位是Kbit/s,换算成KB的话,要除以8。
1.4.4 动态路由追踪及网络故障排查工具mtr命令
在网络出现问题的时候,大多数人都知道ping命令,它可以简单测试网络的连通性,但是却无法确定是在哪里出现了问题,于是有些人就会用traceroute命令来查看途经路由,或者用nslookup命令来查看DNS解析状态是否正常。这样一来,就用了三个命令,不但浪费时间,使用起来也很麻烦,但是如果只用其中一个命令,又不好排查,这时候就要用到mtr命令了。
mtr是Linux中有一个非常棒的网络连通性判断工具,它结合了ping、tracert、nslookup的相关特性。mtr安装很简单,直接在线安装即可:
安装完成后,就可以使用mtr命令了。
下面是mtr的一个跟踪8.8.8.8 IP的案例,如图1-7所示。
图1-7 mtr动态跟踪路由过程
mtr的输出是动态的,输出结果实时变化,这点非常有用,可以实时观察网络的运行状态。
mtr输出总体分为三个部分,如图1-7所示。
第一部分是Host列,主要显示的是从本机到指定主机经过的路由信息。接着是第二部分,第二部分又分为两列。
➢ 第1列是Loss%,显示路由到此IP的丢包率信息,需要注意的是有些丢包是由于ICMP的保护机制造成的,并不代表真的丢包。
➢ 第2列是Snt,表示已发送的数据包的数量。
最后是第三部分,这部分又分为5列,含义如下。
➢ 第1列Last,显示最后一个包的延时。
➢ 第2列Avg,显示发送ping包的平均延时。
➢ 第3列Best,显示ping的最低延时。
➢ 第4列Wrst,显示ping的最差延时。
➢ 第5列StDev,显示标准偏差,一种度量数据分布的分散程度标准,标准偏差越小,网络的稳定性越好。
一般情况下,mtr前几跳都是本地的ISP,后几跳属于服务商,如8.8.8.8是Google的数据中心,中间跳数则是中间节点,如果发现前几跳异常,需要联系本地ISP;如果后几跳出现问题,则需要联系服务商;如果中间几跳出现问题,则两边都无法完全解决问题。