Linux 相關學習內容(不定期更新)

JonPan發表於2020-07-08

Linux 主要目錄

/ 根目錄,在 linux 下有且只有一個根目錄,所有的東西都是從這裡開始
/bin 可執行二進位制檔案的目錄,如常用的命令,ls, tar, mv, cat..
/boot 放置linux系統啟動時用到的檔案,linux的核心檔案/boot/vmlinuz,系引導管理器/boot/grub
/dev 存放linux系統下的裝置檔案,常用的是掛載光碟機 mount /dev/chrom /mnt
/dev/ttl 表示終端 , /dev/null 表示無底洞垃圾桶
/etc 系統配置檔案存放的目錄,不建議在此目錄下存放可執行檔案
/home 使用者家目錄,每個使用者有自己的目錄 ~表示當前使用者的家目錄
/lib 系統使用的函式庫的目錄,程式在執行過程中,需要呼叫一些額外的引數時需要函式庫協助
/lost+fount 系統異常產生錯誤時,會將一些遺失的片段放置在此目錄下
/opt 給主機額外安裝軟體所存放的目錄
/proc 此目錄的資料都在記憶體中,如系統核心,外部裝置,網路狀態,由於資料都存放於記憶體中,所以不佔用磁碟空間,比較重要的檔案, 系統記憶體的對映目錄,提供核心和程式資訊有:/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等
/root 系統管理員的家目錄
/sbin 放置系統管理員使用的可執行命令,如:fdisk,shutdown, mount,與 /bin 不同的是,這幾個目錄是給系統管理員 root 使用的命令,一般使用者只能"檢視"而不能設定和使用
/tmp 一般使用者或正在執行的程式臨時存放檔案的目錄,任何人都可以訪問,重要資料不可放置在此目錄下
/srv 服務啟動之後需要訪問的資料目錄,如 www 服務需要訪問的網頁資料存放在 /srv/www 內
/usr usr並不是user的縮寫,而是Unix Software Resource的縮寫,即“Unix 作業系統軟體資源”放在該目錄。這個目錄 相當於Windows作業系統的“C:\Windows\”和“C:\Program files\”這兩個目錄的綜合體
/var 放置系統執行過程中經常變化的檔案
  • /usr/bin:存放應用程式

  • /usr/share:存放共享資料

  • /usr/lib:存放不能直接執行的,卻是許多程式執行所必需的一些函式庫檔案

  • /usr/local:存放軟體升級包

  • /usr/share/doc:系統說明檔案存放目錄

  • /usr/share/man:程式說明檔案存放目錄

  • /var/log:隨時更改的日誌檔案

  • /var/spool/mail:郵件存放的目錄

  • /var/run:程式或服務啟動後,其 PID 存放在該目錄下

常用Linux命令

序號 命令 對應英文 作用
01 ls list 檢視當前資料夾下的內容
02 pwd print wrok directory 檢視當前所在資料夾
03 cd [目錄名] change directory 切換資料夾
04 touch [檔名] touch 如果檔案不存在,新建檔案
05 mkdir [目錄名] make directory 建立目錄
06 rm [檔名] remove 刪除指定的檔名
07 clear clear 清屏
08 which which 檢視命令位置,如果找到則顯示 which ls --> /bin/ls
09 who who 檢視當前所有登入系統的使用者資訊
10 reboot reboot 重新啟動作業系統
11 shutdown shotdown shotdown -r now 重新啟動作業系統,shutdown會給別的使用者提示
shutdown -h now 立刻關機,其中now相當於時間為0的狀態
shutdown -h 20:25 系統在今天的20:25 會關機
shutdown -h +10 系統再過十分鐘後自動關機
12 wc Word Count - c 統計位元組數 - l 統計行數 - w 統計字數
13 grep

歸檔管理:tar

tar命令很特殊,其引數前面可以使用“-”,也可以不使用。

引數 含義
-c 生成檔案檔案,建立打包檔案
-v 列出歸檔解檔的詳細過程,顯示進度
-f 指定檔案檔名稱,f後面一定是.tar檔案,所以必須放選項最後
-t 列出檔案中包含的檔案
-x 解開檔案檔案

注意:除了f需要放在引數的最後,其它引數的順序任意。

C:\Users\asus\Desktop\review\testlinuk      
λ tar -cvf test.tar *                       
1.txt                                       
2.txt                                       
3.txt                                       
tes1/                                       
tes2/                                       
tes2/tes3/                                  
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ ls                                        
1.txt  2.txt  3.txt  tes1/  tes2/  test.tar 
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ rm *.txt                                  
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ rm -r *[12]                               
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ ls                                        
test.tar                                    
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ tar -xvf test.tar                         
1.txt                                       
2.txt                                       
3.txt                                       
tes1/                                       
tes2/                                       
tes2/tes3/                                  
                                            
C:\Users\asus\Desktop\review\testlinuk      
λ ls                                        
1.txt  2.txt  3.txt  tes1/  tes2/  test.tar 

檔案解壓縮:gzip

tar與gzip命令結合使用實現檔案打包、壓縮。 tar只負責打包檔案,但不壓縮,用gzip壓縮tar打包後的檔案,其副檔名一般用xxxx.tar.gz

gzip [options] compressfile

選項 含義
-d 解壓
-r 壓縮所有子目錄

tar這個命令並沒有壓縮的功能,它只是一個打包的命令,但是在tar命令中增加一個選項(-z)可以呼叫gzip實現了一個壓縮的功能,實行一個先打包後壓縮的過程。

tar -zcvf test.tar.gz * # 將當前目錄下的檔案以及資料夾打包並壓縮為test.tar.gz

  1. 檔案解壓縮:bzip2

tar與bzip2命令結合使用實現檔案打包、壓縮(用法和gzip一樣)。

tar只負責打包檔案,但不壓縮,用bzip2壓縮tar打包後的檔案,其副檔名一般用xxxx.tar.gz2。

在tar命令中增加一個選項(-j)可以呼叫bzip2實現了一個壓縮的功能,實行一個先打包後壓縮的過程。。

壓縮用法:tar -jcvf 壓縮包包名 檔案...(tar jcvf bk.tar.bz2 *.c)

解壓用法:tar -jxvf 壓縮包報名 (tar jxvf bk.tar.bz2)

修改檔案許可權:chmod

chmod 修改檔案許可權有兩種使用格式:字母法與數字法。

字母法:chmod u/g/o/a +/-/= rwx 檔案

[ u/g/o/a ] 含義
u user 表示該檔案的所有者
g group 表示與該檔案的所有者屬於同一組( group )者,即使用者組
o other 表示其他以外的人
a all 表示這三者皆是
[ +-= ] 含義
+ 增加許可權
- 撤銷許可權
= 設定許可權
rwx 含義
r read 表示可讀取,對於一個目錄,如果沒有r許可權,那麼就意味著不能通過ls檢視這個目錄的內容。
w write 表示可寫入,對於一個目錄,如果沒有w許可權,那麼就意味著不能在目錄下建立新的檔案。
x excute 表示可執行,對於一個目錄,如果沒有x許可權,那麼就意味著不能通過cd進入這個目錄。

數字法:“rwx” 這些許可權也可以用數字來代替

字母 說明
r 讀取許可權,數字代號為 "4"
w 寫入許可權,數字代號為 "2"
x 執行許可權,數字代號為 "1"
- 不具任何許可權,數字代號為 "0"

如執行:chmod u=rwx,g=rx,o=r filename 就等同於:chmod u=7,g=5,o=4 filename

注意:如果想遞迴所有目錄加上相同許可權,需要加上引數“ -R ”。 如:chmod 777 test/ -R 遞迴 test 目錄下所有檔案加 777 許可權

windows 遞迴修改檔案許可權: Icacls ${dirName} /grant ${userName}:F

賦予test使用者d:/workspace目錄下所有檔案的完全訪問許可權

Icacls d:/workspace /grant test:F

grep (Global Regular Expression Print)

Linux系統中grep命令是一種強大的文字搜尋工具,grep允許對文字檔案進行模式查詢。如果找到匹配模式, grep列印包含模式的所有行。每日一個linux-grep

選項 含義
-v 顯示不包含匹配文字的所有行(相當於求反)
-n 顯示匹配行及行號
-i 忽略大小寫
-c 輸出匹配到的個數
-n 輸出匹配內容,同時顯示行數
-v 輸出除匹配外的內容
λ cat -n 1.txt
     1   sdfsdfsdfsd
     2   sdfsdfs
     3   sdfsdf
     4   sfsd
     5   asaa
     6   aaa
     7
     8   AAA
     9   CBB
    10   CCC
    11   CBB
    12  1df
    13  sdfsd
    14  EOF
    15  jsldf

C:\Users\asus\Desktop\review\testlinuk
λ ls
1.txt  2.txt  3.txt  tes1/  tes2/  test.tart.gz

C:\Users\asus\Desktop\review\testlinuk
λ grep -c sdf 1.txt
4

C:\Users\asus\Desktop\review\testlinuk
λ grep -n sdf 1.txt
1: sdfsdfsdfsd
2: sdfsdfs
3: sdfsdf
13:sdfsd

**ps ** Process Status

linux上程式有5種狀態:

  1. 執行(正在執行或在執行佇列中等待)

  2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)

  3. 不可中斷(收到訊號不喚醒和不可執行, 程式必須等待直到有中斷髮生)

  4. 僵死(程式已終止, 但程式描述符存在, 直到父程式呼叫wait4()系統呼叫後釋放)

  5. 停止(程式收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止執行執行)

ps工具標識程式的5種狀態碼:

D 不可中斷 uninterruptible sleep (usually IO)

R 執行 runnable (on run queue)

S 中斷休眠 sleeping

T 停止 traced or stopped

Z 僵死 a defunct (”zombie”) process

常用引數

a 顯示所有程式
-a 顯示同一終端下的所有程式
-A 顯示所有程式
c 顯示程式的真實名字
-e 等於-A
e 顯示環境變數
f 顯示程式間的關係
-H 顯示樹狀結構
-aux 顯示所有包含其他使用者的程式
[root@localhost test6]# ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0 17398 17394  0  75   0 - 16543 wait   pts/0    00:00:00 bash

4 R     0 17469 17398  0  77   0 - 15877 -      pts/0    00:00:00 ps

列出目前所有的正在記憶體當中的程式

ps aux

root@localhost test6]# ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  10368   676 ?        Ss   Nov02   0:00 init [3]                 
root         2  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/1]
root         5  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/1]
root         6  0.0  0.0      0     0 ?        S<   Nov02  29:57 [events/0]
root         7  0.0  0.0      0     0 ?        S<   Nov02   0:00 [events/1]
  • USER:該 process 屬於那個使用者賬號的
  • PID :該 process 的號碼
  • %CPU:該 process 使用掉的 CPU 資源百分比
  • %MEM:該 process 所佔用的實體記憶體百分比
  • VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes)
  • RSS :該 process 佔用的固定的記憶體量 (Kbytes)
  • TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網路連線進主機的程式。
  • STAT:該程式目前的狀態,主要的狀態有
  • R :該程式目前正在運作,或者是可被運作
  • S :該程式目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。
  • T :該程式目前正在偵測或者是停止了
  • Z :該程式應該已經終止,但是其父程式卻無法正常的終止他,造成 zombie (疆屍) 程式的狀態
  • START:該 process 被觸發啟動的時間
  • TIME :該 process 實際使用 CPU 運作的時間
  • COMMAND:該程式的實際指令

有一個指令碼執行時間可能超過2天,如何做才能使其不間斷的執行,而且還可以隨時觀察指令碼執行時的輸出資訊?

答:使用screen工具

awk 參考阮一峰-awk 入門教程

awk是處理文字檔案的一個應用程式,幾乎所有 Linux 系統都自帶這個程式。

它依次處理檔案的每一行,並讀取裡面的每一個欄位。對於日誌、CSV 那樣的每行格式相同的文字檔案,awk可能是最方便的工具, awk其實不僅僅是工具軟體,還是一種程式語言

# 格式
$ awk 動作 檔名

# 示例
$ awk '{print $0}' demo.txt

demo.txtawk所要處理的文字檔案。前面單引號內部有一個大括號,裡面就是每一行的處理動作print $0。其中,print是列印命令,$0代表當前行,因此上面命令的執行結果,就是把每一行原樣列印出來

變數

$ + 數字表示某個欄位

變數NF表示當前行有多少個欄位,因此$NF就代表最後一個欄位。

$ echo 'this is a test' | awk '{print $NF}'
test

變數NR表示當前處理的是第幾行。

$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync

條件

$ awk '條件 動作' 檔名
$ awk -F ':' '/usr/ {print $1}' demo.txt
root
daemon
bin
sys

print命令前面是一個正規表示式,只輸出包含usr的行

# 輸出奇數行
$ awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
root
bin
sync

輸出第一個欄位的第一個字元大於m的行,否則輸出‘---’

$ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
root
---
---
sys
sync

檢視特定IP的日誌

cat ip.log | awk -F '\t' '($1~/112.15.5.36/){print $0}'

檢視訪問量前10的IP

awk '{print &1}' 17.log | sort | uniq -c | sort -nr | head -n 10

awk 命令教程

sort 命令

[linux下使用awk命令按時間段篩選日誌](https://segmentfault.com/a/1190000011626977)

參考awk 常用命令

linux中的awk命令詳解

sed命令

sed行檔案編輯命令,編輯檔案以行為單位

sed [引數] '[動作]<匹配條件>' [檔名]

  • -i 標識對檔案進行行編輯
  • a\ 在匹配到的內容下一行增加內容 sed -i 3a\nihao hello world test.txt
  • i\ 在匹配到的內容上一行增加內容
  • d 刪除匹配到的內容
  • s 替換匹配到的內容
  • 上面的動作只有在加上引數-i的時候才會生效

命令格式:

sed -i '行號s#原內容#替換後的內容#列號' # 只替換第一個匹配到的項,替換所有內容在尾部加g

sed -n '5,10p' mywork.log 檢視5行到10行的日誌。

日誌分析檢視——grep,sed,sort,awk運用

網路相關

使用iptables 寫一條規則:把來源IP為192.168.1.101訪問本機80埠的包直接拒絕

iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT

要想把iptable的規則儲存到一個檔案中如何做?如何恢復?

iptables-save > 1.ipt

使用iptables-restore反重定向回來:

iptables-restore < 1.ipt

rsync 同步命令中,下面兩種方式有什麼不同呢?

(1) rsync -av  /dira/  ip:/dirb/   #通過ssh方式同步
(2) rsync -av  /dira/  ip::dirb    #通過rsync服務的方式同步

rsync 同步時,如果要同步的源中有軟連線,如何把軟連線的目標檔案或者目錄同步?

答:同步原始檔需要加-L選項

rsync 同步資料時,如何過濾出所有.txt的檔案不同步?

答:加上--exclude選項:

--exclude=“*.txt”

rsync同步資料時,如果目標檔案比原始檔還新,則忽略該檔案,如何做?

答:保留更新使用-u或者--update選項

使用rsync同步資料時,假如我們採用的是ssh方式,並且目標機器的sshd埠並不是預設的22埠,那我們如何做?

rsync "--rsh=ssh -p 10022"或者rsync -e "ssh -p 10022"

rsync同步時,如何刪除目標資料多出來的資料,即源上不存在,但目標卻存在的檔案或者目錄?

答:加上--delete選項

有一天你突然發現公司網站訪問速度變的很慢很慢,你該怎麼辦呢?

(伺服器可以登陸,提示:你可以從系統負載和網路卡流量入手)

答:可以從兩個方面入手分析:分析系統負載,使用w命令或者uptime命令檢視系統負載,如果負載很高,則使用top命令檢視CPU,MEM等佔用情況,要麼是CPU繁忙,要麼是記憶體不夠,如果這二者都正常,再去使用sar命令分析網路卡流量,分析是不是遭到了攻擊。一旦分析出問題的原因,採取對應的措施解決,如決定要不要殺死一些程式,或者禁止一些訪問等。

在Linux下如何指定dns伺服器,來解析某個域名?

# 使用dig命令:dig @DNSip http://domain.com
dig @8.8.8.8 www.baidu.com#使用谷歌DNS解析百度

tcpdump抓包工具

$ tcpdump -i eth0 -nn -s0 -v port 80 -w test.pcap

  • -i : 選擇要捕獲的介面,通常是乙太網卡或無線網路卡,也可以是 vlan 或其他特殊介面。如果該系統上只有一個網路介面,則無需指定。

  • -nn : 單個 n 表示不解析域名,直接顯示 IP;兩個 n 表示不解析域名和埠。這樣不僅方便檢視 IP 和埠號,而且在抓取大量資料時非常高效,因為域名解析會降低抓取速度。

  • -s0 : tcpdump 預設只會擷取前 96 位元組的內容,要想擷取所有的報文內容,可以使用 -s numbernumber 就是你要擷取的報文位元組數,如果是 0 的話,表示擷取報文全部內容。

  • -v : 使用 -v-vv-vvv 來顯示更多的詳細資訊,通常會顯示更多與特定協議相關的資訊。

  • port 80 : 這是一個常見的埠過濾器,表示僅抓取 80 埠上的流量,通常是 HTTP

  • host 10.10.1.1: host過濾器, 抓取特定目的地和源IP地址的流量,也可以使用 srcdst 只抓取源或目的地

  • -w: 把資料包文輸出到檔案

  • -p : 不讓網路介面進入混雜模式。預設情況下使用 tcpdump 抓包時,會讓網路介面進入混雜模式。一般計算機網路卡都工作在非混雜模式下,此時網路卡只接受來自網路埠的目的地址指向自己的資料。當網路卡工作在混雜模式下時,網路卡將來自介面的所有資料都捕獲並交給相應的驅動程式。如果裝置接入的交換機開啟了混雜模式,使用 -p 選項可以有效地過濾噪聲。

  • -e : 顯示資料鏈路層資訊。預設情況下 tcpdump 不會顯示資料鏈路層資訊,使用 -e 選項可以顯示源和目的 MAC 地址,以及 VLAN tag 資訊

如果想實時將抓取到的資料通過管道傳遞給其他工具來處理,需要使用 -l 選項來開啟行緩衝模式(或使用 -c 選項來開啟資料包緩衝模式)。使用 -l 選項可以將輸出通過立即傳送給其他命令,其他命令會立即響應。

tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'

硬連結和軟連線的本質區別

參考:理解 Linux 的硬連結與軟連結

5分鐘讓你明白“軟連結”和“硬連結”的區別

  1. 硬連結

檔案都有檔名與資料,這在 Linux 上被分成兩個部分:使用者資料 (user data) 與後設資料 (metadata)。使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實內容的地方;而後設資料則是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。在 Linux 中,後設資料中的 inode 號(inode 是檔案後設資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。下圖展示了程式通過檔名獲取檔案內容的過程。

圖 1. 通過檔名開啟檔案

由於硬連結是有著相同 inode 號僅檔名不同的檔案,因此硬連結存在以下幾點特性:

  • 檔案有相同的 inode 及 data block;
  • 只能對已存在的檔案進行建立;
  • 不能交叉檔案系統進行硬連結的建立;
  • 不能對目錄進行建立,只可對檔案建立;
  • 刪除一個硬連結檔案並不影響其他有相同 inode 號的檔案。
  1. 軟連線

軟連結與硬連結不同,若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊。因此軟連結的建立與使用沒有類似硬連結的諸多限制:

  • 軟連線有自己的檔案屬性及許可權
  • 可對不存在的檔案或目錄建立軟連結
  • 軟連結可交叉檔案系統
  • 軟連結可對檔案或目錄建立
  • 建立軟連結時,連結計數i_nlink不會增加
  • 刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

圖 2. 軟連結的訪問

軟連線格式: ln -s 原始檔 連結檔案
硬連結格式: ln 原始檔 連結檔案

小結:

  • 硬連結: 與普通檔案沒什麼不同,可以理解為引用,新增一個別名,引用計數+1檔案的inode都一樣,指向同一個資料區塊
  • 軟連結:data block中儲存了其代表的檔案的絕對路徑,是另外一種檔案,有自己的inode,在硬碟中有獨立的區塊,訪問時替換自身路徑

參考資料和書籍

  1. 《Linux基礎千錘百煉》-- 駿馬金龍
  2. Linux工具快速教程-參考教程命令

Linux面試題彙總

46個Linux面試常見問題送給你

相關文章