# Linux 常用指令 ###### tags: `RD1` :::spoiler 目錄 [TOC] ::: ## grep * 搜尋關鍵字 :::success ```grep``` 這個指令名稱其實是來自於正規表示法的 ```g/RE/p```,其意義是代表以正規表示法全域搜尋並列印出來(globally search for RE and print it)。 ::: ```shell # 在 /etc/os-release 檔案中搜尋 Ubuntu 關鍵字 grep Ubuntu /etc/os-release NAME="Ubuntu" PRETTY_NAME="Ubuntu 18.04.3 LTS" ------------------------------------------ # 在 /etc/*.conf 中搜尋 network 關鍵字 grep network /etc/*.conf ltrace.conf:hex(uint) inet_network(string); nsswitch.conf:networks: files sysctl.conf:# Additional settings - these settings can improve the network sysctl.conf:# security of the host and prevent against some network attacks sysctl.conf:# redirection. Some network environments, however, require that these ------------------------------------------ # 篩選含有 network 關鍵字的檔案名稱 ls /etc/ | grep network network networkd-dispatcher networks ``` * 不分大小寫 ```shell # 不分大小寫 grep -i Ubuntu /etc/os-release ----------------------------------------- # 標示行號 grep -n Ubuntu /etc/os-release 1:NAME="Ubuntu" 5:PRETTY_NAME="Ubuntu 18.04.3 LTS" ``` * 反向匹配 ```shell # 顯示不包含 Ubuntu 關鍵字的行 grep -v Ubuntu /etc/os-release ``` * 遞迴搜尋檔案(找資料夾裡面所有的檔案) ```shell # 在 /etc/ 下所有檔案中搜尋 ubuntu grep -r ubuntu /etc/ ----------------------------------------- # 在所有 *.conf 中尋找 ubuntu grep -r --include="*.conf" ubuntu /etc/ ----------------------------------------- # 不顯示錯誤訊息 grep -r ubuntu /etc/ 2>/dev/null ``` * 顯示前後幾行 ```shell # 多顯示後一行 grep -A 1 Ubuntu /etc/os-release # 多顯示前一行 grep -B 1 Ubuntu /etc/os-release # 多顯示前後各一行 grep -C 1 Ubuntu /etc/os-release ``` * 顏色標示 ```shell grep --color=always 檔名 ``` * 正規表示法 ```shell # a 開頭 ls | grep "^a" # b 結尾 ls | grep "b$" # a 或 b 開頭 ls | grep "^[ab]" # a 或 b 結尾 ls | grep "[ab]$" ----------------------------------------- # a 開頭,接著 b 出現零次以上 ls | grep "^ab*" # a 開頭,接著 b 出現零次或一次 ls | grep "^ab?" # a 開頭,接著 b 出現一次以上 ls | grep "^ab+" ----------------------------------------- # 含有 ab 或 cd ls | grep "ab|cd" # 含有 ab 或 cd(另一種寫法,作用相同) ls | grep -E "ab|cd" ----------------------------------------- # 含有 net 這個單字 ls | grep "<net>" issue.net ``` ## awk ```shell awk '條件類型1{動作1} 條件類型2{動作2} ...' filename ``` awk 可以處理後續接的檔案,也可以讀取來自前個指令的 standard output 。awk 主要是處理『每一行的欄位內的資料』,而預設的『欄位的分隔符號為 "空白鍵" 或 "[tab]鍵" 』 ### 例一 ```shell brave_chen@CY0015923-BRAVE-CHEN cat transportation.txt A001 腳踏車 AEADDDEE9931 A002 機車 FDEAEDFJK3394 A003 火車 FJDKE3AK34940 A004 超機車 FFJJEEE99300 A005 飛機 AIRP33333900 A006 坦克 TANK00000001 ``` ```shell brave_chen@CY0015923-BRAVE-CHEN awk '{print $2","$3}' transportation.txt 腳踏車,AEADDDEE9931 機車,FDEAEDFJK3394 火車,FJDKE3AK34940 超機車,FFJJEEE99300 飛機,AIRP33333900 坦克,TANK00000001 ``` 由以上的例子可以知道每一行的每個欄位都是有變數名稱的,那就是 $1, $2... 等變數名稱。以上面的例子來說,A001,A002...就是$1,第一欄的意思,至於AEADDDEE9931,FDEAEDFJK3394...就是$3,第三欄的意思,其他的就依此類推。另外$0 代表『一整列資料』的意思。 |變數名稱|代表意義 | |------|----------------------------| | NF |每一行 ($0) 擁有的欄位總數 | | NR |目前 awk 所處理的是『第幾行』資料| | FS |目前的分隔字元,預設是空白鍵 | ### 例二 ```shell brave_chen@CY0015923-BRAVE-CHEN awk '{print $1 "\t lines: " NR "\t columns: " NF}' transportation.txt A001 lines: 1 columns: 3 A002 lines: 2 columns: 3 A003 lines: 3 columns: 3 A004 lines: 4 columns: 3 A005 lines: 5 columns: 3 A006 lines: 6 columns: 3 ``` ### 例三 ```shell brave_chen@CY0015923-BRAVE-CHEN cat transportation.txt A001,腳踏車,AEADDDEE9931 A002,機車,FDEAEDFJK3394 A003,火車,FJDKE3AK34940 A004,超機車,FFJJEEE99300 A005,飛機,AIRP33333900 A006,坦克,TANK00000001 ``` ```shell brave_chen@CY0015923-BRAVE-CHEN awk '{FS=","} {print $1" "$3}' transportation.txt A001,腳踏車,AEADDDEE9931 A002 FDEAEDFJK3394 A003 FJDKE3AK34940 A004 FFJJEEE99300 A005 AIRP33333900 A006 TANK00000001 ``` 有趣吧!不過,怎麼第一行沒有正確的顯示出來呢?這是因為我們讀入第一行的時候,那些變數 $1, $2... 預設還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先設定 awk 的變數啊! 利用 BEGIN 這個關鍵字喔!這樣做: ```shell brave_chen@CY0015923-BRAVE-CHEN awk 'BEGIN{FS=","} {print $1" "$3}' transportation.txt A001 AEADDDEE9931 A002 FDEAEDFJK3394 A003 FJDKE3AK34940 A004 FFJJEEE99300 A005 AIRP33333900 A006 TANK00000001 ``` ## sed sed (stream editor) 可以分析 Standard Input (STDIN) 的資料, 進行取代、刪除、新增、擷取特定行等處理後,再輸出到 standrad out (STDOUT) 不會對檔案本身進行修改~~只是輸出給你看~~ * sed [-nefr] [動作] ``` -n :silent模式。在 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到 螢幕上。 但如果加上 -n 參數後,則只有經過 sed 特殊處理的那一行(或者動作)才會被列出來。 -e :直接在指令列模式上進行 sed 的動作編輯; -f :-f filename 可以執行 filename 內的 sed 動作; -r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法) -i :直接修改讀取的檔案內容,而不是由螢幕輸出。 ``` * `[n1[,n2]]function` * n1, n2 :選擇進行動作的行數,例如『10,20[動作行為] 』 ``` a :新增, a 的後面可以接字串,這些字串會在目前的下一行出現。 c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行。 d :刪除, d 後面通常不接任何字串; i :插入, i 的後面可以接字串,這些字串會在目前的上一行出現; p :列印,將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作。 s :取代, s 的動作可以搭配正規表示法。例如 1,20s/old/new/g 。 ``` * 指令形式 ```php sed -n 's/item/Items/p' test.txt //取代所有item並且只印出被修改的行 ``` 上述指令中的界定符`/`可以被代換成任意符號如`:` `|` ## chmod ![](https://i.imgur.com/wf9oAVz.png) ## chown 變更檔案及目錄擁有者與群組 [鳥哥](http://linux.vbird.org/linux_basic/0210filepermission.php) 在 Linux 系統上的檔案與目錄都有擁有者以及群組的屬性質,我們可以透過 ls 的輸出來查看每個檔案與目錄的擁有者與群組: ```shell ls -l ``` ![](https://i.imgur.com/02x2OZo.png) ```ls -l ```的輸出中,第三欄與第四欄就是檔案或目錄的擁有者與群組名稱,例如這裡的 ```log``` 目錄其擁有者就是 ```bill_chiu```,群組就是 ```admin``` ``` # 將 test 的擁有者改為 root sudo chown root test.txt ``` 這樣就可以將 ```test.txt``` 這個檔案的擁有者改為 ```root```。 ![](https://i.imgur.com/uHL5dee.png) 如果要更改檔案或目錄的群組,也可以用 ```chown``` 更改: ``` #將 myfile 的群組改為 root sudo chown :root test.txt ``` chown 的第一個參數若以冒號開頭,就是代表群組名稱的意思,這一行指令就是將 test.txt 這個檔案的群組改為 root。 :::info 不過,請記得,要被改變的群組名稱必須要在/etc/group檔案內存在才行,否則就會顯示錯誤! ::: ![](https://i.imgur.com/JiPBpKt.png) ```shell #將 myfile 的群組改為 everyone sudo chown :everyone test.txt ``` ![](https://i.imgur.com/Mq5N3Xv.png) 若要同時更改 test.txt 的擁有者與群組,可以這樣寫: ```shell # 同時更改擁有者與群組 sudo chown 666:owner test.txt ``` ![](https://i.imgur.com/cOYcoa5.png) ## ls 功能:**列出所在或指定目錄的內容or檔案之相關特性** 語法:ls [-選項] [目錄or檔案名稱] 常用選項及其代表之意義 -a : 列出所有檔案名稱,包括以『.』開頭之隱藏檔,如.profile、.login等。 -d : 若參數的為一目錄名稱,則只列出檔案名稱而非目錄之內容。 -l : 列出檔案的詳細資料,包括檔案形態、存取權限、連結數目、擁有 者名稱、群組名稱等。 ## pwd **印出目前工作目錄之絕對路徑** ``` /Applications/MAMP/htdocs/here ``` ## ps > [linux命令:ps](http://linux.kutx.cn/linux/4/31133.html) **這是察看執行中的程式的一個指令,您可以搭配kill指令隨時中斷,刪除不必要的程序**: ```shell ps [options] ``` - -a顯示所有終端機下執行的程序,除了階段作業領導者之外。 - a顯示現行終端機下的所有程序,包括其他用戶的程序。 - -A顯示所有程序。 - -c顯示CLS和PRI欄位。 - c列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。 - -C<指令名稱>指定執行指令的名稱,並列出該指令的程序的狀況。 - -d顯示所有程序,但不包括階段作業領導者的程序。 - -e此參數的效果和指定"A"參數相同。 - e列出程序時,顯示每個程序所使用的環境變量。 - -f顯示UID,PPIP,C與STIME欄位。 - f用ASCII字符顯示樹狀結構,表達程序間的相互關係。 - -g<群組名稱>此參數的效果和指定"-G"參數相同,當亦能使用階段作業領導者的名稱來指定。 - g顯示現行終端機下的所有程序,包括群組領導者的程序。 - -G<群組識別碼>列出屬於該群組的程序的狀況,也可使用群組名稱來指定。 - h不顯示標題列。 - -H顯示樹狀結構,表示程序間的相互關係。 - -j或j採用工作控制的格式顯示程序狀況。 - -l或l採用詳細的格式來顯示程序狀況。 - L列出欄位的相關信息。 - -m或m顯示所有的執行緒。 - n以數字來表示USER和WCHAN欄位。 - -N顯示所有的程序,除了執行ps指令終端機下的程序之外。 - -p<程序識別碼>指定程序識別碼,並列出該程序的狀況。 - p<程序識別碼>此參數的效果和指定"-p"參數相同,只在列表格式方面稍有差異。 - r只列出現行終端機正在執行中的程序。 - -s<階段作業> 指定階段作業的程序識別碼,並列出隸屬該階段作業的程序的狀況。 - s採用程序信號的格式顯示程序狀況。 - S列出程序時,包括已中斷的子程序資料。 - -t<終端機編號>指定終端機編號,並列出屬於該終端機的程序的狀況。 - t<終端機編號>此參數的效果和指定"-t"參數相同,只在列表格式方面稍有差異。 - -T顯示現行終端機下的所有程序。 - -u<用戶識別碼>此參數的效果和指定"-U"參數相同。 - u以用戶為主的格式來顯示程序狀況。 - -U<用戶識別碼>列出屬於該用戶的程序的狀況,也可使用用戶名稱來指定。 - U<用戶名稱>列出屬於該用戶的程序的狀況。 - v採用虛擬內存的格式顯示程序狀況。 - -V或V顯示版本信息。 - -w或w採用寬闊的格式來顯示程序狀況。  - x顯示所有程序,不以終端機來區分。 - X採用舊式的Linux i386登陸格式顯示程序狀況。 - -y配合參數"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位。 - -<程序識別碼>此參數的效果和指定"p"參數相同。 - -\-cols<每列字符數>設置每列的最大字符數。 - -\-columns<每列字符數>此參數的效果和指定"--cols"參數相同。 - -cumulative此參數的效果和指定"S" 參數相同。 - -\-deselect此參數的效果和指定"-N"參數相同。 - -\-forest此參數的效果和指定"f"參數相同。 - -\-headers重複顯示標題列。 - -\-help在線幫助。 - -\-info顯示排錯信息。 - -\-lines<顯示列數>設置顯示畫面的列數。 - -\-no-headers此參數的效果和指定"h"參數相同,只在列表格式方面稍有差異。 - -\-group<群組名稱>此參數的效果和指定"-G"參數相同。 - -\-Group<群組識別碼>此參數的效果和指定"-G"參數相同。 - -\-pid<程序識別碼>此參數的效果和指定"-p"參數相同。 - -\-rows<顯示列數>此參數的效果和指定"--lines"參數相同。 - -\-sid<階段作業>此參數的效果和指定"-s"參數相同。 - -\-tty<終端機編號>此參數的效果和指定"-t"參數相同。 - -\-user<用戶名稱>此參數的效果和指定"-U"參數相同。 - -\-User<用戶識別碼>此參數的效果和指定"-U"參數相同。 - -\-version此參數的效果和指定"-V"參數相同。 - -\-widty<每列字符數>此參數的效果和指定"-cols"參數相同。 ## wget **下載** ```shell wegt 網址(http,ftp) ``` 常用選項/替代指令 ```shell cat urls.txt | xargs wget ``` ## curl **功能更多的wget** ```shell curl -O 網址 ``` ## tail **顯示尾幾行** ```shell tail [-n] ``` n:指定行數,預設為10行 ## head **顯示頭幾行** ```shell head [-n] ``` n:指定行數,預設為10行 ## cat **印出檔案內容至銀幕(標準輸出)或合併多檔** cat file1 file2 > file3 可將檔案file1、file2之內容依順序合併,並將結果存至file3。 ```shell cat [-選項] file ``` 可當more使用(讀黨) ## less **上下翻頁看內容** ```shell less file man ps | less ``` 近入後案 / 搜尋 n 跳到下一筆匹配 N 回島上一筆匹配 ## rsync > [Linux 使用 rsync 遠端檔案同步與備份工具教學與範例](https://blog.gtwang.org/linux/rsync-local-remote-file-synchronization-commands//) `rsync` 的角色就像是一般 Linux 的 `cp` 與 `scp` 指令,可以將檔案或目錄從來源位置複製到目的位置,不過 `rsync` 在複製檔案時會比 `cp` 與 `scp` 更有效率,並且支援連結檔與設備檔(devices),也可以保留檔案的擁有者、群組與權限設定 `rsync` 在第一次複製檔案時,會複製完整的檔案內容,而之後再次複製檔案時,就會先以 delta transfer 演算法檢查新舊檔案之間的差異,只傳送有變動的部份,可加快備份速度,尤其是在累進備份大檔案時,效果更明顯。另外 `rsync` 在使用網路傳送資料時,也支援資料的自動壓縮與解壓縮,這樣可以有效減少耗費的網路頻寬。 基本語法 ```shell rsync 參數 來源檔案 目的檔案 ``` 以下是最常見的幾個參數: - `-v`:verbose 模式,輸出比較詳細的訊息。 - `-r`:遞迴(recursive)備份所有子目錄下的目錄與檔案。 - `-a`:封裝備份模式,相當於 `-rlptgoD`,遞迴備份所有子目錄下的目錄與檔案,保留連結檔、檔案的擁有者、群組、權限以及時間戳記。 - `-z`:啟用壓縮。 - `-h`:將數字以比較容易閱讀的格式輸出 ## telnet 這套軟體在 Windows 及 Linux 系統中都存在,只是介面有點不很相同就是了。 基本上,**這個程式是 user 端用來連線登入遠端主機的**。 例如人在台南,但是可以在台南使用可以連上 Internet 的電腦,經由 telnet 連線上家裡的 Linux 主機,而進行設定。 感覺上就好像在家裡玩自己的 Linux 主機一樣。 一般來說,如果你是使用 Winodows 系統,則你可以在『開始』-->『執行』後,輸入 telnet xxx.yyy.zzz.qqq ,其中, xxx.yyy.zzz.qqq 為 IP 位址,則可以連上主機(或者是 BBS )囉。當然,如果您是在 Linux 系統下,亦可直接輸入 telnet xxx.yyy.zzz.qqq 來連上主機或BBS。 ```shell telnet 主機位址(或主機名稱) ``` ## nc 這個 nc 指令可以用來作為某些服務的檢測,因為他可以連接到某個 port 來進行溝通,此外,還可以自行啟動一個 port 來傾聽其他用戶的連線。 ``` nc [-u] [IP|host] [port] nc -l [IP|host] [port] 選項與參數: -l :作為監聽之用,亦即開啟一個 port 來監聽用戶的連線; -u :不使用 TCP 而是使用 UDP 作為連線的封包狀態 ``` ## ping **檢測連線** ```shell ping [ci] 位址 ``` c:次數 i:間格 ## nslookup **這是用來查詢或反查詢 DNS 的指令** 例如我們要知道 雅虎 的網路位址,則可以如此查詢: ```shell $ nslookup tw.yahoo.com Server: 192.168.151.31 Address: 192.168.151.31#53 Non-authoritative answer: tw.yahoo.com canonical name = atsv2-fp-shed.wg1.b.yahoo.com. Name: atsv2-fp-shed.wg1.b.yahoo.com Address: 180.222.102.201 Name: atsv2-fp-shed.wg1.b.yahoo.com Address: 180.222.102.202 ``` 系統會告訴你,我們使用的 DNS server 是 ksdns.seed.net.tw,而查詢到的網址是 180.222.102.202。 ## netstat **這也是用來觀察網路狀況的指令** ```shell netstat ``` ## ssh > [遠端連線伺服器SSH / XDMCP / VNC / RDP](http://linux.vbird.org/linux_server/0310telnetssh.php) ## ifconfig > [Linux 常用網路指令](http://linux.vbird.org/linux_server/0140networkcommand.php) **查詢、設定網路卡與 IP 網域等相關參數** ```shell ifconfig [選項] ``` - up 開啟該網路介面 - down 關閉該網路介面 - mtu N 設定最大傳輸單位為 N - netmask 設定子網路遮罩 - broadcast 設定廣播位置 一般來說,直接輸入 ifconfig 就會列出目前已經被啟動的卡,不論這個卡是否有給予 IP,都會被顯示出來。而如果是輸入 ifconfig eth0,則僅會秀出這張介面的相關資料, 而不管該介面是否有啟動。 所以如果你想要知道某張網路卡的 Hardware Address,直接輸入『 ifconfig "網路介面代號" 』即可,至於出現的各項資料是這樣的(資料排列由上而下、由左而右): - eth0:就是網路卡的代號,也有 lo 這個 loopback ; - HWaddr:就是網路卡的硬體位址,俗稱的 MAC 是也; - inet addr:IPv4 的 IP 位址,後續的 Bcast, Mask 分別代表的是 Broadcast 與 netmask 喔! - inet6 addr:是 IPv6 的版本的 IP ,我們沒有使用,所以略過; - MTU:就是第二章談到的 MTU 啊! - RX:那一行代表的是網路由啟動到目前為止的封包接收情況, packets 代表封包數、errors 代表封包發生錯誤的數量、 dropped 代表封包由於有問題而遭丟棄的數量等等 - TX:與 RX 相反,為網路由啟動到目前為止的傳送情況; - collisions:代表封包碰撞的情況,如果發生太多次, 表示你的網路狀況不太好; - txqueuelen:代表用來傳輸資料的緩衝區的儲存長度; - RX bytes, TX bytes:總接收、傳送的位元組總量 ## find **依照指定條件,找尋檔案或目錄** ``` find start_directory [-選項] ``` -name 指定範本樣式的檔名 -iname 搜尋可以忽略大小寫之分 -path 指定目錄的範本 -user 指定使用者名稱 -group 群組名指定群組名稱 -amin < min> 指定時間內曾被存取過的檔案,單位為分鐘 -atime < day> 指定時間內曾被存取過的檔案,單位為24小時 -exec <指令> 當找到符合條件的檔案,就執行該指令,指令結尾必須是";" -mmin < min> 指定時間內曾異動過的檔案,單位為分鐘 -mtime < day> 指定時間內曾被異動過的檔案,單位為24小時 -nouser 檔案不屬於本機上之任何User的檔案 -ok <指令> 用法同-exec,唯每一個指令執行前均會詢問使用者 -print 將符合條件的檔案資料由終端機顯示出來 -size <檔案大小> 符合檔案大小的檔案,單位為512Byte(Block),檔案大小前加"+"號代表大於這個 size,"-"代表小於這個size Example: ```shell find ./ -size +500 -print ``` ###找到目前目錄下,檔案大小大於250K Bytes的檔案,並將結果由終端機輸出 ```shell find / -nouser -exec rm {} \; ``` ###找出整個系統中所有"無主檔案"並刪除之。 ## which **搜尋命令執行檔的完整路徑** 利用 which 選項 命令 可以依據「PATH環境變數」的內容來搜索命令執行檔,並顯示該命令之命令執行檔的完整路徑(若該命令執行檔不在PATH中,則不會被搜尋到)。其中,選項可以是: - 無選項:若不輸入選項,則系統只顯示第一個被找到的命令執行檔之完整路徑。 - -a:系統會顯示所有被找到的命令執行檔之完整路徑。 ```shell $ which ls /bin/ls。 $ which -a ifconfig /sbin/ifconfig $ which -a echo /bin/echo ``` ## watch >[[Linux] 使用watch 定期執行指令](https://caloskao.org/linux-watch-use-watch-to-execute-a-command-periodically/) & [每天一個linux命令(48):watch命令](https://www.cnblogs.com/peida/archive/2012/12/31/2840241.html) watch 是 [procps](https://gitlab.com/procps-ng/procps) 套件內的其中一個指令,基本上現在多數的 Linux 發行版預設的系統套件就包含了 procps。如果系統預設並沒有安裝的話,可以利用套件管理工具安裝,或是到 procps 的 [GitLab](https://gitlab.com/procps-ng/procps) 下載原始碼編譯安裝。 在 mac OS 下可輸入 `brew install watch` 進行安裝。 **可以將命令的輸出結果輸出到標準輸出設備,多用於週期性執行命令/定時執行命令** ``` watch[参数][命令] ``` -n或--interval watch缺省每2秒運行一下程序,可以用-n或-interval來指定間隔的時間。 -d或--differences用-d或--differences選項watch會高亮顯示變化的區域。 而-d=cumulative選項會把變動過的地方(不管最近的那次有沒有變動)都高亮顯示出來。 -t或-no-title會關閉watch命令在頂部的時間間隔,命令,當前時間的輸出。 -h, --help 查看幫助文檔 ## kill 這是用來殺掉執行中程式的指令,需配合 `ps` 這個指令,當你執行一個 ftp 程式,但是他有點當當的時候,你可以 `ps -aux` 這個指令查出 ftp 這個程式的代碼(PID),假設其 PID 為 110 ,然後輸入: ``` kill 110 ``` 即可殺掉這個 ftp 程式。 ## du(Disk usage) **這是用來察看目錄內所有檔案使用掉的空間的情況**,如下所示: ``` du -m ``` 其中, du 預設的檔案輸出資料為 KB,以參數 -m 使檔案資料顯示為 MB。 ``` du [-hscd] du -hc *.jpg ``` h: human-readable s: summary (僅列目錄總容量知結果) c: 當前目錄下(檔案)的傯總容量 dN:指定深度 ## df(Disk free) **這是用來察看硬碟空間的指令。** 由於我們目前將檔案都建立在根目錄『/』下,所以只要沒有空間,則所有檔案都無法複製進來系統。不過,若你規劃出多的硬碟,則可以察看你的硬碟空間資訊,如下所示: ``` df [-ahT] ``` a: 顯示所有系統檔案,包括大小為零的系統檔案 h: human-readable T: 印出檔案系統類型($ mount-1) ## lsof 在 Linux 系統之下,幾乎所有的系統資源都是以檔案的形式呈現的(包含一般檔案、目錄、連結檔、裝置檔、管線檔、網路 socket 等),所以對於管理者來說,若要查詢一個程式使用了哪些系統資源,就可以透過它開啟的檔案來得知。 lsof 指令可以用來查詢行程所開啟的檔案列表,這個小工具對於系統管理者來說非常實用,而且也非常重要,以下是這個工具的使用方式與範例。 ``` # 列出所有行程所開啟的檔案 lsof # 不過由於輸出的資料量太大了,通常我們不太會這樣使用。 ``` ### 查詢開啟指定檔案的行程 如果想要查詢目前正在開啟指定檔案的行程,可以在執行 lsof 時直接加上檔案的名稱與路徑。 ``` # 列出所有開啟檔案的行程 lsof <filename> ``` ### 列出指定使用者所開啟的檔案 ``` # 列出 terry 使用者所開啟的檔案 lsof -u terry ``` ### 列出指定程式所開啟的檔案 ``` # 列出 httpd 伺服器所開啟的檔案 lsof -c httpd ``` ### 條件查詢( OR 與 AND ) ``` # 多個條件(OR 運算) lsof -u root -c java # 多個條件(AND 運算) lsof -a -u root -c java ``` ### 排除條件 ``` # 列出非 root 使用者所開啟的檔案 lsof -u ^root ``` ### 根據 PID 列出所開啟的檔案 ``` # 列出 PID 為 14662 的行程,所開啟的檔案 lsof -p 14662 # 根據多個 PID 列出開啟的檔案 lsof -p 14662,14678,14979 ``` ### 網路連線 ``` # 列出所有網路連線 lsof -i # 列出所有 TCP 網路連線 lsof -i tcp # 列出所有 UDP 網路連線 lsof -i udp # 列出 80 連接埠的網路連線 lsof -i :80 # 列出 SMTP 的網路連線 lsof -i :smtp # 列出 3642 連接埠的 TCP 連線 lsof -i tcp:3642 # 列出 1 到 1024 連接埠的 TCP 網路連線 lsof -i :1-1024 # 列出所有處於 LISTEN 狀態的 TCP 網路連線 lsof -i TCP -s TCP:LISTEN # 列出已建立的 TCP 網路連線 lsof -i TCP -s TCP:ESTABLISHED ``` ## 參考資料 [Linux 基本指令介紹 - for Red Hat Linux 6.1](https://linux.vbird.org/linux_basic/redhat6.1/linux_06command.php) [Linux - 常用指令彙整](https://www.eebreakdown.com/2016/08/linux.html#sec-7) [Linux常用指令](http://nmc.nchu.edu.tw/tanet/linuxcommand.htm) [ Linux 常用網路指令](http://linux.vbird.org/linux_server/0140networkcommand.php)