大家好,我是小林。
服務(wù)器一般都是命令頁面,不像 windows 有圖形頁面點(diǎn)點(diǎn)鼠標(biāo)就好,所以掌握些基本的 Linux 命令是很有必要的,不然就無法操作 Linux,更體會(huì)不到 Linux 的精髓。
這次,我們就來看看關(guān)于網(wǎng)絡(luò)相關(guān)的命令。
學(xué)習(xí)網(wǎng)絡(luò)不應(yīng)該只局限于理論,作為工程師的我們,掌握一些基本的網(wǎng)絡(luò)命令對(duì)我們幫助會(huì)很大,因?yàn)槠綍r(shí)在遠(yuǎn)程操作、開發(fā)、調(diào)試、排查線上問題的時(shí)候,會(huì)常常用到。
Linux 為我們提供了很多網(wǎng)絡(luò)相關(guān)的命令,我們這次就來看看 Linux 系統(tǒng)里有哪些常用的網(wǎng)絡(luò)命令。
遠(yuǎn)程連接命令
如果我們要想操作 Linux 服務(wù)器,不可能說拿個(gè)顯示器、鼠標(biāo)和鍵盤接到服務(wù)器上,服務(wù)器一般都是放在機(jī)房里的,只需讓服務(wù)器把網(wǎng)絡(luò)接通,我們?cè)谧约旱碾娔X就可以使用 ssh 命令遠(yuǎn)程登錄服務(wù)器,進(jìn)而操作和管理服務(wù)器。
還有一個(gè)很常用的遠(yuǎn)程命令是 scp,它可以幫助我們傳輸文件到服務(wù)器上。
ssh
在需要遠(yuǎn)程登錄 Linux 系統(tǒng),可以使用 ssh 命令,比如你想遠(yuǎn)程登錄一臺(tái)服務(wù)器,可以使用 ssh user@ip
的方式,如下圖:
接著,會(huì)有輸入密碼的提示,輸入正確的密碼后,就進(jìn)入到了服務(wù)器的終端頁面,之后你操作的命令就是控制服務(wù)器的了。
scp
當(dāng)我們需要把一臺(tái)機(jī)器上的文件傳輸給另一臺(tái)機(jī)器時(shí),使用 scp 命令就可以。
如下圖,我使用 scp 命令將本地 test.txt 文件傳輸給了 IP 地址為 192.168.12.35 機(jī)器的 /home 目錄。
輸入 scp 命令后,會(huì)彈出需要輸入對(duì)方密碼的提示,輸入完成后,輸入回車即可,如果密碼驗(yàn)證通過后,就進(jìn)行文件的傳輸。
查看本地網(wǎng)絡(luò)狀態(tài)
要想知道本地機(jī)器的網(wǎng)絡(luò)狀態(tài),比較常用的網(wǎng)絡(luò)命令是 ifconfig 和 netstat。
ifconfig
當(dāng)你想知道機(jī)器上有哪些網(wǎng)口,和網(wǎng)口對(duì)應(yīng)的狀態(tài)信息時(shí),使用 ifconfig 就可以,狀態(tài)信息包含 IP 地址、子網(wǎng)掩碼、MAC 地址等。
如下圖,是在我設(shè)備上的 ifconfig 信息。
可以看到,這臺(tái)機(jī)器一共有 3 個(gè)網(wǎng)口,分別是 eth0、eth1、lo。其中 lo 是本地回路,發(fā)送給 lo 就相當(dāng)于發(fā)送給自己,eth0 和 eth1 都是真實(shí)的網(wǎng)口。
netstat
netstat 命令主要用于查看目前本機(jī)的網(wǎng)絡(luò)使用情況。
查看所有 socket
如果只是單純執(zhí)行 netstat 命令,則查詢的是本地所有 socket,如下圖:
上圖中,我們看到的都是 socket 文件,socket 負(fù)責(zé)在客戶端與服務(wù)端之間收發(fā)數(shù)據(jù),當(dāng)客戶端和服務(wù)端建立連接時(shí),各自同時(shí)都會(huì)生成一個(gè) socket 文件,用于管理這個(gè)連接。
查看 TCP/UDP 連接
如果只想看 TCP 連接的網(wǎng)絡(luò)信息,可以使用 netstat -t。
比如下面我通過 netstat -t 看 tcp 協(xié)議的網(wǎng)絡(luò)情況:
上圖的末尾的 state 描述的是當(dāng)前 TCP 連接處于的狀態(tài)。
另外,如果要想看 UDP 的網(wǎng)絡(luò)信息,可以使用 netstat -u。
查看端口占用
如果你想知道某個(gè)端口是哪個(gè)進(jìn)程在占用,比如我想查 80 端口被哪個(gè)進(jìn)程占用了,如下圖:
可以看到,80 端口被 http 進(jìn)程占用了,最末尾的信息也能看到這個(gè)進(jìn)程對(duì)應(yīng)的 pid。
網(wǎng)絡(luò)測(cè)試
當(dāng)我們想確認(rèn)網(wǎng)絡(luò)的延時(shí)情況,以及與服務(wù)器網(wǎng)絡(luò)是否暢通,則可以使用 ping 和 telnet 命令。
ping
想知道本機(jī)到目標(biāo)網(wǎng)頁的網(wǎng)絡(luò)延時(shí),可以使用 ping 命令,如下圖所示:
ping 是基于 ICMP 協(xié)議的,所以對(duì)方防火墻如果屏蔽了 ICMP 協(xié)議,那么我們就無法與它 ping 通,但這并不代表網(wǎng)絡(luò)是不通的。
每一個(gè) ICMP 包都有序號(hào),所以你可以看到上圖中 icmp 序號(hào),如果序號(hào)是斷斷續(xù)續(xù)的,那么可能出現(xiàn)了丟包現(xiàn)象。
time 顯示了網(wǎng)絡(luò)包到達(dá)遠(yuǎn)程主機(jī)后返回的時(shí)間,單位是毫秒。time 的時(shí)間越小,說明網(wǎng)絡(luò)延遲越低,如果你看到 time 的時(shí)間變化很大,這種現(xiàn)象叫做網(wǎng)絡(luò)抖動(dòng),這說明客戶端與服務(wù)器之間的網(wǎng)絡(luò)狀態(tài)不佳。
ttl 全稱叫 time to live,指定網(wǎng)絡(luò)包被路由器丟棄之前允許通過的網(wǎng)段數(shù)量,說白了就是定義了網(wǎng)絡(luò)包最大經(jīng)過路由器的數(shù)量,這個(gè)目的是防止網(wǎng)絡(luò)包在網(wǎng)絡(luò)中被無限轉(zhuǎn)發(fā),永不停止。當(dāng)網(wǎng)絡(luò)包在網(wǎng)絡(luò)中被傳輸時(shí),ttl 的值通過一個(gè)路由器時(shí)會(huì)遞減1,當(dāng) ttl 遞減到 0 時(shí),網(wǎng)絡(luò)包就會(huì)被路由器拋棄。
另外,ping 不單單只能輸入 ip 地址,也能輸入域名地址,如果輸入的是域名地址,會(huì)先通過 DNS 查詢?cè)撚蛎?ip 地址,再進(jìn)行通信。
telnet
有時(shí)候,我們想知道本機(jī)到某個(gè) IP + 端口的網(wǎng)絡(luò)是否通暢,也就是想知道對(duì)方服務(wù)器是否有對(duì)應(yīng)該端口的進(jìn)程,于是就可以使用 telnet 命令,如下所示:
telnet 192.168.0.5
telnet 執(zhí)行后會(huì)進(jìn)入一個(gè)交互式的頁面,這時(shí)就可以填寫你將要發(fā)送給對(duì)方的信息,比如你想發(fā) HTTP 請(qǐng)求給服務(wù)器,那么你就可以寫出 HTTP 請(qǐng)求 的格式信息,但是手寫 HTTP 報(bào)文太累人吧,后面會(huì)介紹專門用于 HTTP 的網(wǎng)絡(luò)工具。
DNS 查詢
如果想知道 DNS 解析域名的過程,可以使用 host 和 dig 命令。
host
host 就是一個(gè) DNS 查詢命令,比如我們要查百度的 DNS,如下圖所示:
可以看到,www.baidu.com 只是個(gè)別名,原名是 www.a.shifen.com,且對(duì)應(yīng)了 2 條 IPv4 地址。
如果想追查某種類型的記錄,可以加個(gè) -t 參數(shù),比如下圖我們追查百度的 AAAA 記錄,也就是查詢域名對(duì)應(yīng)的 IPv6 地址,由于百度還沒部署 IPv6 地址,所以沒有查詢到 :
dig
dig 同樣也是做 DNS 查詢的,區(qū)別在于,dig 顯示的內(nèi)容更加詳細(xì),比如下圖是 dig 百度的結(jié)果:
也可以看到 www.baiu.com 的別名(CNAME)為 www.a.shifen.com,然后共有 2 條 A 記錄,也就是 IPv4 地址的記錄,通常對(duì)應(yīng)多個(gè)是為了負(fù)載均衡或分發(fā)內(nèi)容。
HTTP
在電腦桌面我們常使用瀏覽器去請(qǐng)求網(wǎng)頁,而在服務(wù)器一般是沒有可視化頁面的,也就沒有瀏覽器,這時(shí)如果想要 HTTP 訪問,就需要網(wǎng)絡(luò)相關(guān)的命令。
curl
如果要在命令行請(qǐng)求網(wǎng)頁或者接口,可以使用 curl 命令,curl 支持很多應(yīng)用協(xié)議,比如 HTTP、FTP、SMTP 等,實(shí)際運(yùn)用中最常用還是 HTTP。
比如,我用 curl 訪問了百度網(wǎng)頁,如下圖:
如果不想看 HTTP 數(shù)據(jù)部分,只想看 HTTP GET 返回頭,可以在加個(gè) -I 參數(shù),如 curl -I,如下圖所示:
上面演示的 HTTP GET 請(qǐng)求,如果想使用 POST 請(qǐng)求,命令如下:
curl 向 http://localhost/myapi 接口發(fā)送 POST 請(qǐng)求,各參數(shù)的說明:
-d 后面是要發(fā)送的數(shù)據(jù),例子中發(fā)送的是 JSON 格式的數(shù)據(jù);
-X 后面是指定 HTTP 的方法,例子中指定的是 POST 方法;
-H 是指定自定義的請(qǐng)求頭,例子中由于發(fā)送的是 JSON 數(shù)據(jù),所以內(nèi)容類型指定了 JSON;
總結(jié)
最后,列一下本次提到的 Linux 下常用的網(wǎng)絡(luò)命令:
遠(yuǎn)程登錄的 ssh 指令;
遠(yuǎn)程傳輸文件的 scp 指令;
查看網(wǎng)絡(luò)接口的 ifconfig 指令;
查看網(wǎng)絡(luò)狀態(tài)的 netstat 指令;
測(cè)試網(wǎng)絡(luò)延遲的 ping 指令;
可以交互式調(diào)試和服務(wù)端的 telnet 指令;
兩個(gè) DNS 查詢指令 host 和 dig;
可以發(fā)送各種請(qǐng)求包括 HTTPS 的 curl 指令。