Linux下容易被忽視的那些命令用法
本文適合在linux下開發(fā)的同學(xué)閱讀,需要具備基本的linux操作命令。
一、前言
工作中發(fā)現(xiàn)很多同學(xué)對(duì)于Linux下的命令不太熟悉,尤其是一些功能強(qiáng)大的工具,使用者很少。正所謂工欲善其事,必先利其器。本文總結(jié)了Linux下常用命令的用法,希望能夠幫助大家提升日常開發(fā)的效率。
二、命令
1.strace
strace用于跟蹤程序執(zhí)行過程中的系統(tǒng)調(diào)用,如跟蹤test進(jìn)程,只需要:
- strace -p [test_pid] 或直接strace ./test
但如果需要:
- 跟蹤進(jìn)程內(nèi)的線程: -f 選項(xiàng)
- 統(tǒng)計(jì)時(shí)間段內(nèi)的各個(gè)系統(tǒng)調(diào)用次數(shù)分布:-C 選項(xiàng)
- 過濾某些系統(tǒng)調(diào)用:-e trace選項(xiàng),如-e trace=network只顯示網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用,-e trace=open,close,read,write只顯示這4個(gè)系統(tǒng)調(diào)用,常用于只獲取某些特定的系統(tǒng)調(diào)用
- 顯示系統(tǒng)調(diào)用的時(shí)間:-ttt選項(xiàng)
- 詳細(xì)顯示每行的數(shù)據(jù),而不是... -s選項(xiàng)加大字符串的長度限制如-s 1024
比如,跟蹤pid為12345的進(jìn)程中所有線程的read和write系統(tǒng)調(diào)用,輸出字符串的長度限制為1024:
- strace -s 1024 -f -e trace=read,write -p 12345
2.tcpdump
tcpdump是Linux上的抓包工具,如抓取eth0網(wǎng)卡上的包,使用:
- sudo tcpdump -i eth0
但如果需要:
- 文本形式顯示抓包數(shù)據(jù):-A選項(xiàng)
- 顯示16進(jìn)制的報(bào)文數(shù)據(jù):-X選項(xiàng)
- 輸出結(jié)果到文件中 -w選項(xiàng),如-w 1.cap將報(bào)文輸出到1.cap文件,此文件可用wireshark查看
- 過濾主機(jī)和端口號(hào) 如host 11.11.11.11 and port 12345過濾主機(jī)ip為11.11.11.11,端口號(hào)為12345的tcp報(bào)文
比如,抓取80端口的HTTP報(bào)文,以文本形式展示:
- sudo tcpdump -i any port 80 -A
這樣你就可以清楚看到GET、POST請(qǐng)求的內(nèi)容了。
3.nc
nc可以在Linux上開啟TCP Server、TCP Client、UDP Server、UDP Client。
如在端口號(hào)12345上開啟TCP Server和Client模擬TCP通信:
- Server: nc -l 127.0.0.1 12345
- Client: nc 127.0.0.1 12345
在端口號(hào)12345上開啟UDP Server和Client模擬TCP通信:
- Server: nc -ul 127.0.0.1 12345
- Client: nc -u 127.0.0.1 12345
Unix Socket通信示例:
- Server: nc -Ul /tmp/1.sock
- Client: nc -U /tmp/1.sock
4.curl
curl用于模擬HTTP請(qǐng)求,在終端模擬請(qǐng)求時(shí)常用,如最基本的用法:
- curl http://www.baidu.com
但如果需要:
- 指定HTTP首部 -H選項(xiàng),如-H "Host: xx.xx.xx.xx"
- 指定請(qǐng)求方法 -X選項(xiàng),如-X POST,-d指定post數(shù)據(jù)
- 顯示請(qǐng)求詳細(xì)信息,包括請(qǐng)求和響應(yīng)首部 -v選項(xiàng)
- 重定向請(qǐng)求自動(dòng)追蹤 -L選項(xiàng)
常見的curl請(qǐng)求選項(xiàng)-sSfL表示: 不顯示進(jìn)度信息,顯示錯(cuò)誤信息,發(fā)生HTTP錯(cuò)誤時(shí)失敗,自動(dòng)跟蹤重定向
5.find
find可用于查找文件,比如:
- find . -name "1.txt"
表示在當(dāng)前目錄及其子目錄下查找文件名為1.txt的文件,結(jié)合xargs使用功能更加強(qiáng)大,如:
- find . -type f|xargs grep 'abcd'
表示在當(dāng)前目錄及其子目錄下查找包含abcd字符串的文件行,經(jīng)常用于搜索代碼。
6.lsof
lsof命令主要用法包括:
- sudo lsof -i :[port] 查看端口占用進(jìn)程信息,經(jīng)常用于端口綁定失敗時(shí)確認(rèn)端口被哪個(gè)進(jìn)程占用
- sudo lsof -p [pid] 查看進(jìn)程打開了哪些文件或套接字
7.ss
Linux上的ss命令可以用于替換netstat,ss直接讀取解析/proc/net下的統(tǒng)計(jì)信息,相比netstat遍歷/proc下的每個(gè)PID目錄,速度快很多。
常見示例:
- ss -t -a 顯示所有的TCP Sockets
- ss -u -a 顯示所有的UDP Sockets
- ss -x src /tmp/a.sock 顯示連接到/tmp/a.sock的進(jìn)程
- ss -o state [state TCP-STATE] 如ss -o state established顯示所有建立的連接
8.awk/sed
awk和sed在文本處理方面十分強(qiáng)大,其中,awk按列進(jìn)行處理,sed按行進(jìn)行處理。
如采用冒號(hào)分隔數(shù)據(jù),輸出***列數(shù)據(jù)($0代表行全部列數(shù)據(jù),$1代表***列,$2代表第二列...)
- awk -F ":" '{print $1}'
在awk的結(jié)果基礎(chǔ)上,結(jié)合sort、uniq和head等命令可以輕松完成頻率統(tǒng)計(jì)等功能
- 查看文件的第100行到第200行:
- sed -n '100,200p' log.txt
- 替換字符串中的特定子串
- echo "int charset=gb2312 float"|sed "s/charset=gb2312/charset=UTF-8/g"
- 替換test文件每行匹配ab的部分為cd
- sed -i 's/ab/cd/g' test
9.screen
當(dāng)采用telnet或SSH登錄遠(yuǎn)程主機(jī)時(shí),因?yàn)榫W(wǎng)絡(luò)中斷的原因會(huì)導(dǎo)致session終止,此時(shí)會(huì)觸發(fā)SIGHUP信號(hào)使得任務(wù)終止,因此我們常常會(huì)看到有些任務(wù)采用nohup的方式運(yùn)行,避免任務(wù)被打斷。screen通過多終端的方式,巧妙地解決了這個(gè)問題。 示例:
- screen -S test 開啟一個(gè)screen,這時(shí)擁有一個(gè)終端,所有執(zhí)行的程序都會(huì)在ps中展示
- Ctrl+a鍵+d鍵 退出當(dāng)前screen,切到上級(jí)窗口
- screen -ls 查看所有screen列表,如
- 13333.test (Detached)
- 14039.test4 (Detached)
- 表示兩個(gè)screen,screen標(biāo)識(shí)為13333.test和14039.test4
- screen -r [pid.]tty.host 進(jìn)入選定的screen,如screen -r 13333.test
- exit 關(guān)閉當(dāng)前screen
注:本文假定讀者已經(jīng)知道類似top、netstat、df、vmstat等常見命令的用法,所以介紹的都是一些容易被忽視卻很實(shí)用的命令用法。本文對(duì)于這些命令進(jìn)行了簡化和提煉,所有命令的完整功能需要具體參考命令手冊(cè)。