一. linux基礎操作指令
1. 新建文件和目錄
(1) 新建文件
-
touch
命令:用于創建空文件。
touch filename.txt
-
如果文件已存在,
touch
會更新文件的訪問時間和修改時間。
(2) 新建目錄
-
mkdir
命令:用于創建目錄。
mkdir directoryname
-
使用
-p
選項可以遞歸創建多級目錄?
mkdir -p parent/child/grandchild
2. 刪除文件和目錄
(1) 刪除文件
-
rm
命令:用于刪除文件。
rm filename.txt
-
使用
-f
選項可以強制刪除文件,不提示確認。
rm -f filename.txt
(2) 刪除目錄
-
rmdir
命令:用于刪除空目錄。
rmdir directoryname
-
如果目錄不為空,需要使用
rm -r
或rm -rf
。
rm -r directoryname # 遞歸刪除目錄及其內容,但會提示確認
rm -rf directoryname # 強制遞歸刪除目錄及其內容,不提示確認
3. 查找文件和目錄
(1) 查找文件
-
find
命令:用于在指定目錄及其子目錄中查找文件。-name
選項用于指定文件名。
find /path/to/search -name "filename.txt"
-
可以使用通配符(如
*.txt
)來匹配特定模式的文件。
find /path/to/search -name "*.txt"
(2) 查找目錄
-
使用
find
命令查找目錄。-type d
表示只查找目錄。
find /path/to/search -type d -name "directoryname"
4. 修改文件和目錄
(1) 修改文件內容
-
nano
或vim
:使用文本編輯器直接編輯文件內容。
nano filename.txt # nano
vim filename.txt # vim
?(2) 修改文件權限
-
chmod
命令:用于修改文件或目錄的權限。
chmod 644 filename.txt # 設置文件權限為所有者讀寫,組和其他用戶只讀
chmod -R 755 directoryname # 遞歸設置目錄權限
(3) 修改文件所有者
-
chown
命令:用于修改文件或目錄的所有者。
chown newowner filename.txt
(4) 修改文件所屬組
-
chgrp
命令:用于修改文件或目錄的所屬組。
(4) 修改文件所屬組
chgrp 命令:用于修改文件或目錄的所屬組。
5. 拷貝文件和目錄
(1) 拷貝文件
-
cp
命令:用于拷貝文件。
cp sourcefile destinationfile
(2) 拷貝目錄
-
使用
-r
或-R
選項遞歸拷貝目錄。
cp -r sourcedirectory destinationdirectory
6. 移動文件和目錄
(1) 移動文件
-
mv
命令:用于移動文件或重命名文件。
mv sourcefile destinationfile
(2) 移動目錄
-
同樣使用
mv
命令。
mv sourcedirectory destinationdirectory
7. 查看文件內容
(1) 查看文件內容
-
cat
命令:用于查看文件內容。
cat filename.txt
(2) 查看文件前幾行
-
head
命令:用于查看文件的前幾行(默認顯示前10行)。
head filename.txt
(3) 查看文件后幾行
-
tail
命令:用于查看文件的后幾行(默認顯示后10行)。
tail filename.txt
8. 總結
????????這些是 Linux 終端中常用的文件和目錄操作命令。通過掌握這些命令,你可以高效地管理文件和目錄。以下是這些命令的簡要總結:
操作類型 | 命令 | 說明 |
---|---|---|
新建文件 | touch | 創建空文件 |
新建目錄 | mkdir | 創建目錄 |
刪除文件 | rm | 刪除文件 |
刪除目錄 | rm -r ?或?rmdir | 刪除目錄 |
查找文件 | find | 查找文件或目錄 |
修改文件內容 | nano ?或?vim | 編輯文件內容 |
修改文件權限 | chmod | 修改文件或目錄的權限 |
修改文件所有者 | chown | 修改文件或目錄的所有者 |
修改文件所屬組 | chgrp | 修改文件或目錄的所屬組 |
拷貝文件 | cp | 拷貝文件或目錄 |
移動文件 | mv | 移動文件或重命名文件 |
查看文件內容 | cat | 查看文件內容 |
查看文件前幾行 | head | 查看文件的前幾行 |
查看文件后幾行 | tail | 查看文件的后幾行 |
二. 熟悉文件操作指令
1. 建立一個目錄~/work/test,在此目錄下用 echo 命令建立一個文件 mytext,輸 入以下內容:
Hello there !
There are things we know we know.
And things we know we don’t know.
Still there are things we don’t know we don’t know.
# 創建目錄
mkdir -p ~/work/test
# 進入目錄
cd ~/work/test
# 使用 echo 命令創建文件并寫入內容 -e 是讓echo識別轉義字符
echo -e "Hello there ! \nThere are things we know we know. \nAnd thing we know we don't know. \nStill there are things we don't know we don't know." > mytext
2. 用 vi 打開 mytext 進行編輯修改,練習主要 vi 命令的使用。
# 打開 mytext 文件 vi mytext 在?vi 編輯器中,你可以練習以下常用命令:
i
:進入插入模式
Esc
:退出插入模式,回到命令模式
:wq
:保存并退出
:q!
:不保存并退出
dd
:刪除當前行
yy
:復制當前行
p
:粘貼
/pattern
:搜索?pattern
3. 用 echo 命令為 mytext 增加一行文本 “Add a new line”。
# 使用 echo 追加一行內容
echo "Add a new line" >> mytext
# 注意: ?>? ?是覆蓋寫入
#? ? ? ? ? ?>> 是追加寫入?
4. 用 grep 命令搜索 mytext 中“there”,不分大小寫。然后統計包含”there”字 串的行數。
# 搜索 "there",忽略大小寫
grep -i "there" mytext
# 統計包含 "there" 的行數
grep -i "there" mytext | wc -l
?grep是文本搜索工具,用于在文件或文本流中搜索符合特定模式的行。global/regular expression/print的縮寫,表示全局正則表達式打印
1. 基本搜索
grep "pattern" filename # 在文件 filename 中搜索包含字符串 pattern 的行,并打印這些行。
2. 忽略大小寫
grep -i "pattern" filename # -i 選項表示忽略大小寫,搜索時不區分大小寫。
3. 反向匹配
grep -v "pattern" filename # -v 選項表示反向匹配,打印不包含指定模式的行。
4. 顯示行號
grep -n "pattern" filename # -n 選項會在匹配的行前顯示行號。
5. 遞歸搜索
grep -r "pattern" directory/ # -r 或 -R 選項表示遞歸搜索,會在指定目錄及其子目錄中搜索匹配的文件。
6. 顯示匹配的上下文
grep -C 2 "pattern" filename # -C 選項表示上下文(Context),會顯示匹配行的上下各2行。 # 類似地,-A 顯示匹配行之后的行,-B 顯示匹配行之前的行。
7. 使用正則表達式
grep "^[a-z]" filename # grep 默認支持基本正則表達式(BRE)。例如,^ 表示行首,[a-z] 表示任意小寫字母。 # 使用 -E 或 egrep 可以啟用擴展正則表達式(ERE),支持更復雜的表達式。
8. 統計匹配的行數
grep -c "pattern" filename # -c 選項統計匹配的行數,而不是顯示匹配的行。
9. 只顯示匹配的部分
grep -o "pattern" filename # -o 選項只顯示匹配的部分,而不是整行。
5. 用 file mytext 查看文件類型。
# 查看文件類型
file mytext
6. 用 chmod 命令修改 mytext 讓所有用戶可讀寫。
# 修改文件權限為所有用戶可讀寫
chmod a+rw mytext
?`chmod`(change mode)是 Linux 和 Unix 系統中用于更改文件或目錄權限的命令。它允許用戶修改文件或目錄的訪問權限,以控制誰可以讀取、寫入或執行這些資源。
1. 權限概述
在 Linux 系統中,文件和目錄的權限分為三類:
????????所有者(Owner)? ? :文件或目錄的所有者。
????????所屬組(Group)? ? ?:文件或目錄所屬的用戶組。
????????其他用戶(Others):不屬于上述兩類的其他用戶。每類用戶可以有以下三種權限:
????????讀權限(r)? ? :允許查看文件內容或列出目錄內容。
????????寫權限(w)? ?:允許修改文件內容或刪除/修改目錄中的文件。
????????執行權限(x):允許運行文件(如可執行腳本)或進入目錄。2. 查看權限
使用 `ls -l` 命令可以查看文件或目錄的權限:ls -l filename
輸出示例:
-rw-r--r-- 1 user group 123 Mar 18 10:00 filename
解釋:
- `-rw-r--r--`:權限部分。? - 第一個字符 `-` 表示文件類型(`-` 表示普通文件,`d` 表示目錄)。- 接下來的三個字符 `rw-` 表示所有者的權限(讀寫權限)。- 接下來的三個字符 `r--` 表示所屬組的權限(只讀權限)。- 最后三個字符 `r--` 表示其他用戶的權限(只讀權限)。
3. 修改權限
`chmod` 命令可以通過兩種方式修改權限:符號模式 和 數字模式。(1) 符號模式
符號模式使用符號(`+`、`-`、`=`)來修改權限。????????`+` :添加權限。
????????`-` :移除權限。
????????`=` :設置權限。用戶類別:
????????`u` :所有者(user)。
????????`g` :所屬組(group)。
????????`o` :其他用戶(others)。
????????`a` :所有類別(all)。權限類型:
????????`r`? ?:讀權限。
????????`w` :寫權限。
????????`x`? :執行權限。示例:
給文件所有者添加執行權限:chmod u+x filename
移除文件所屬組的寫權限:
chmod g-w filename
設置文件對所有用戶為只讀:
chmod a=r filename
(2) 數字模式
數字模式使用八進制數字表示權限。每個權限類型對應一個數字:
????????讀權限(r)? ? ?:4
????????寫權限(w)? ?:2
????????執行權限(x):1權限組合:
????????`rwx` :7(4 + 2 + 1)
????????`rw-`? :6(4 + 2)
????????`r-x`? ?:5(4 + 1)
????????`r--`? ?:4
????????`w-`? ?:2
????????`wx`? :3(2 + 1)
????????`---`? ?:0示例:
- 設置文件權限為所有者讀寫執行,所屬組只讀,其他用戶無權限:chmod 740 filename
設置目錄權限為所有者讀寫執行,所屬組和他人只讀執行:
chmod 755 directoryname
4. 常用命令
以下是一些常用的 `chmod` 命令:(1) 修改文件權限
設置文件所有者為讀寫權限,所屬組和其他用戶為只讀權限:
?chmod 644 filename
(2) 修改目錄權限
設置目錄所有者為讀寫執行權限,所屬組和其他用戶為讀執行權限:
?chmod 755 directoryname
(3) 遞歸修改權限
對目錄及其所有子文件和子目錄遞歸設置權限:
?chmod -R 755 directoryname
(4) 添加或移除權限
給文件所有者添加執行權限:chmod u+x filename
移除文件所屬組的寫權限:
?chmod g-w filename
(5) 設置特殊權限
設置用戶ID(SetUID):允許用戶以文件所有者的身份運行文件:chmod u+s filename
設置組ID(SetGID):允許用戶以文件所屬組的身份運行文件:
chmod g+s filename
設置粘滯位(Sticky Bit)**:防止用戶刪除或移動不屬于自己的文件(常用于共享目錄):
?chmod +t directoryname
5. 總結
`chmod` 是一個強大的命令,用于管理文件和目錄的權限。通過符號模式和數字模式,可以靈活地設置權限,以滿足不同的安全需求。以下是一些關鍵點:
????????符號模式:適合快速修改權限。
????????數字模式:適合設置復雜的權限組合。
????????遞歸修改權限:(`-R`)可以批量設置目錄及其內容的權限。
????????特殊權限:(如 SetUID、SetGID 和 Sticky Bit)可以實現更高級的權限管理。
7. 建立文件連接: mytext 的硬連接 yourtext,mytext 的軟連接 thetext。
# 創建硬連接
ln mytext yourtext
# 創建軟連接
ln -s mytext thetext
?在 Linux 系統中,
ln
命令用于創建鏈接(Link),包括硬鏈接(Hard Link)和軟鏈接(Soft Link,也稱為符號鏈接或 Symbolic Link)。鏈接是一種特殊的文件,它指向另一個文件或目錄。1. 硬鏈接(Hard Link)
硬鏈接是文件系統中的一種機制,它允許一個文件在文件系統中擁有多個名稱。硬鏈接直接指向文件的 inode(索引節點),而不是文件的路徑。
特點:
硬鏈接不能跨文件系統。
硬鏈接不能鏈接到目錄(出于安全和文件系統結構的考慮)。
硬鏈接和原始文件共享同一個 inode,因此對文件的修改會反映在所有鏈接上。
刪除硬鏈接不會刪除原始文件,只有當所有鏈接都被刪除時,文件才會被真正刪除。
創建硬鏈接:
ln [源文件] [硬鏈接名] # 示例 ln file.txt link_to_file.txt # file.txt 是原始文件,link_to_file.txt 是硬鏈接。 # 修改 file.txt 或 link_to_file.txt 的內容,另一個文件也會相應變化。
2. 軟鏈接(Soft Link / Symbolic Link)
軟鏈接是一種特殊的文件,它包含了一個指向目標文件或目錄的路徑。軟鏈接類似于 Windows 系統中的快捷方式。
特點:
軟鏈接可以跨文件系統。
軟鏈接可以鏈接到目錄。
軟鏈接有自己的 inode,與目標文件或目錄的 inode 不同。
如果目標文件被刪除,軟鏈接會變成“死鏈接”(無效鏈接)。
創建軟鏈接:
#軟連接多了 -s ln -s [目標文件或目錄] [軟鏈接名] # 示例 ln -s /path/to/file.txt link_to_file.txt # /path/to/file.txt 是目標文件,link_to_file.txt 是軟鏈接。 # 如果目標文件被刪除,link_to_file.txt 會變成無效鏈接。
3. 常用選項
-s
:創建軟鏈接(符號鏈接)。
-f
:強制創建鏈接。如果目標鏈接已經存在,會先刪除舊鏈接再創建新鏈接。
-i
:交互模式。如果目標鏈接已經存在,會提示用戶是否覆蓋。
-n
:當創建指向目錄的軟鏈接時,避免覆蓋已存在的軟鏈接。示例:
(1)強制創建軟鏈接
ln -sf /path/to/new_file.txt link_to_file.txt # 如果 link_to_file.txt 已經存在,會先刪除舊鏈接,再創建指向 /path/to/new_file.txt 的新鏈接。
(2)創建指向目錄的軟鏈接
ln -s /path/to/directory link_to_directory # 創建一個軟鏈接 link_to_directory,指向 /path/to/directory。
5. 使用場景
(1) 硬鏈接
用于在文件系統內為文件創建別名,方便訪問。
用于備份文件,節省存儲空間(因為硬鏈接不占用額外的磁盤空間)。
(2) 軟鏈接
用于創建跨文件系統的鏈接。
用于創建指向目錄的鏈接。
用于創建指向文件或目錄的快捷方式。
用于在開發環境中快速切換配置文件或版本。
6. 總結
ln
命令在 Linux 系統中用于創建鏈接,包括硬鏈接和軟鏈接。它們的主要區別在于:
硬鏈接直接指向文件的 inode,不能跨文件系統,不能鏈接到目錄。
軟鏈接包含目標文件或目錄的路徑,可以跨文件系統,可以鏈接到目錄。
8. ls –l 觀察文件屬性,引用次數?
# 查看文件屬性
ls -l
# 輸出示例
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 mytext
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user 6 Oct 10 12:00 thetext -> mytext
# mytext 和 yourtext 的引用次數為 2,表示它們共享相同的 inode。
# thetext 是軟連接,指向 mytext。
ls
(list)是 Linux 和 Unix 系統中最基本的命令之一,用于列出目錄中的文件和子目錄。它提供了多種選項,可以用來顯示文件的詳細信息、排序文件、過濾文件等。1. 基本功能
ls
命令的主要功能是列出指定目錄中的文件和子目錄。如果沒有指定目錄,默認會列出當前工作目錄的內容。2. 基本用法
ls [選項] [目錄或文件]
3. 常見選項
以下是一些常用的
ls
選項及其功能:(1)?
-l
:長格式顯示以長格式顯示文件和目錄的詳細信息,包括權限、所有者、所屬組、大小、修改時間等。
ls -l # 輸出示例 # drwxr-xr-x 2 user group 4096 Mar 18 10:00 directory # -rw-r--r-- 1 user group 1234 Mar 18 09:00 file.txt
(2)?
-a
:顯示所有文件顯示所有文件和目錄,包括以
.
開頭的隱藏文件。ls -a # 輸出示例 # . .. .hiddenfile file.txt directory # . 表示當前目錄。 # .. 表示父目錄。 # .hiddenfile 是隱藏文件。
(3)?
-h
:以易讀格式顯示文件大小以更易讀的格式(如 KB、MB、GB)顯示文件大小。
ls -lh # 輸出示例 # drwxr-xr-x 2 user group 4.0K Mar 18 10:00 directory # -rw-r--r-- 1 user group 1.2M Mar 18 09:00 file.txt
(4)?
-t
:按修改時間排序按修改時間排序,最近修改的文件或目錄會顯示在前面。
ls -lt
(5)?
-r
:反向排序對排序結果進行反向排序。
ls -ltr # 按修改時間反向排序
(6)?
-S
:按文件大小排序按文件大小排序,較大的文件會顯示在前面。
ls -lS
(7)?
-R
:遞歸顯示遞歸顯示目錄及其子目錄中的內容。
ls -R
(8)?
-1
(數字1):每行顯示一個文件或目錄每行顯示一個文件或目錄名稱,而不是按列顯示。
ls -1
4. 組合使用選項
ls
命令支持組合使用多個選項,以滿足不同的需求。例如:ls -lath # -l:長格式顯示。 # -a:顯示所有文件(包括隱藏文件)。 # -t:按修改時間排序。 # -h:以易讀格式顯示文件大小。
5. 示例
# (1) 列出當前目錄的內容 ls # (2) 列出當前目錄的詳細信息 ls -l # (3) 列出包括隱藏文件的所有內容 ls -la # (4) 列出按修改時間排序的內容 ls -lt # (5) 列出按文件大小排序的內容 ls -lS # (6) 遞歸列出目錄內容 ls -R # (7) 列出指定目錄的內容 ls /path/to/directory
9. 用 chmod 修改連接屬性 yourtext 和 thetext 的屬性為只讀,用 ls –l 觀察
# 修改硬連接 yourtext 為只讀
chmod a-w yourtext
# 修改軟連接 thetext 為只讀
chmod a-w thetext
# 查看文件屬性
ls -l# 輸出示例
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 mytext
# -r--r--r-- 2 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user 6 Oct 10 12:00 thetext -> mytext
# yourtext 的權限變為只讀。
# thetext 是軟連接,其權限不受 chmod 影響。
10. 刪除 mytext,用 ls –l 觀察
# 刪除 mytext
rm mytext
# 查看文件屬性
ls -l# 輸出示例
# -r--r--r-- 1 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user 6 Oct 10 12:00 thetext -> mytext# mytext 被刪除后,yourtext 仍然存在,因為它是硬連接。
# thetext 仍然存在,但指向的文件 mytext 已被刪除,因此 thetext 會顯示為紅色或提示文件不存在。
11. cp yourtext mytext,用 ls –l 觀察
# 復制 yourtext 到 mytext
cp yourtext mytext
# 查看文件屬性
ls -l# 輸出示例
# -r--r--r-- 1 user user 200 Oct 10 12:00 mytext
# -r--r--r-- 1 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user 6 Oct 10 12:00 thetext -> mytext# mytext 被重新創建,內容與 yourtext 相同。
# thetext 現在指向新的 mytext 文件。
三. 練習文檔建立和壓縮/解壓操作
1. 創建測試目錄
假設當前目錄下已存在?test
?目錄。若沒有,可通過以下命令創建:
mkdir test && touch test/file{1..3}.txt # 創建 test 目錄及三個測試文件
2. 壓縮操作
(1)使用 gzip 壓縮(.tar.gz 或 .tgz)
tar -czvf test.tar.gz test/ # 打包并壓縮為 .tar.gz
# 或
tar -czvf test.tgz test/ # 等效寫法
(2)使用 bzip2 壓縮(.tar.bz2)
tar -cjvf test.tar.bz2 test/ # 打包并壓縮為 .tar.bz2
(3)使用 xz 壓縮(.tar.xz 或 .txz)
tar -cJvf test.tar.xz test/ # 打包并壓縮為 .tar.xz
# 或
tar -cJvf test.txz test/ # 等效寫法
(4)僅打包不壓縮(.tar)
tar -cvf test.tar test/ # 僅打包,不壓縮
3. 解壓操作
(1)解壓 .tar.gz 或 .tgz
tar -xzvf test.tar.gz # 指定解壓參數
# 或
tar -xvf test.tar.gz # 自動檢測壓縮類型(推薦)
(2)解壓 .tar.bz2
tar -xjvf test.tar.bz2 # 指定解壓參數
# 或
tar -xvf test.tar.bz2 # 自動檢測壓縮類型(推薦)
(3)解壓 .tar.xz 或 .txz
tar -xJvf test.tar.xz # 指定解壓參數
# 或
tar -xvf test.tar.xz # 自動檢測壓縮類型(推薦)
(4)解壓 .tar
tar -xvf test.tar # 解壓未壓縮的 tar 包
(可選)解壓到指定目錄
tar -xvf test.tar.gz -C /path/to/target_dir # 將內容解壓到 target_dir
4. 常用參數說明
參數 | 作用 |
---|---|
c | 創建壓縮包 |
x | 解壓 |
z | 使用 gzip 壓縮/解壓 |
j | 使用 bzip2 壓縮/解壓 |
J | 使用 xz 壓縮/解壓 |
v | 顯示操作過程(詳細信息) |
f | 指定文件名(必須緊跟文件名) |
C | 指定解壓目錄 |
5. 驗證壓縮/解壓結果
-
查看壓縮包內容:
tar -tf test.tar.gz # 列出 .tar.gz 中的文件
-
檢查解壓后的目錄:
ls test/ # 確認文件與原始目錄一致
四. 練習編寫和運行簡單的 bash 腳本
1. 將課上 PPT 上的簡單腳本例子用 vi 編輯為 test.sh。
(1).使用 vi 創建并編輯腳本
vi test.sh
(2).在 vi 中輸入以下內容(按 i 進入編輯模式)
#!/bin/bash
# 這是一個簡單的 Bash 腳本示例
echo "Hello World!"
date # 顯示當前時間
(3).保存并退出 vi(按 Esc 退出編輯模式;輸入 :wq 保存并退出)
2. 用兩種方法執行這個腳本:sh test.sh 和./test.sh。
(1). 方法一: 直接使用 sh 命令
sh test.sh
(2).方法二:賦予執行權限后通過路徑運行
# 1. 添加可執行權限
chmod +x test.sh# 2. 通過相對路徑執行
./test.sh
兩種方法的區別:
? ? ? ? sh test.sh :顯示指定使用 sh 解釋器執行腳本,即使腳本中沒有 #!/bin/bash 也能運行。
? ? ? ? ./test.sh? ? :依賴腳本首行的 ( #!/bin/bash )指定解釋器,需先賦予執行權限。?
3. 編寫一個腳本設置自己需要的環境變量,例如設置程序別名,增加可執行路徑。
? ? ? ? 創建一個腳本 set_env.sh ,用于設置別名和添加可執行路徑:
步驟:
(1). 編輯腳本
vi set_env.sh
(2). 輸入以下內容
#!/bin/bash
# 設置環境變量示例
alias ll='ls -alF' # 定義別名 ll
export PATH=$PATH:~/bin # 將 ~/bin 添加到 PATH
(3). 保存并退出 vi
4. 用 source 命令執行這個腳本,然后執行進行測試,看看環境變量設置是否成功。
(1). 使用 source 或 . 執行腳本
source set_env.sh # 方法一
# 或
. set_env.sh # 方法二(等效寫法)
(2). 測試環境變量是否生效
? ? ? ? 測試別名 ll :
ll # 應顯示詳細文件列表
? ? ? ? 檢查 PATH 是否更新 :
echo $PATH # 輸出中應包含 ~/bin
關鍵點:
? ? ? ? 使用 source 或 . 是為了讓腳本在當前 Shell 中生效(而非子 Shell )。
? ? ? ? 直接運行 ./set_env.sh 或 sh set_env.sh 不會生效,因為環境變量僅在子 Shell 中有效。
5. 永久生效(可選)
????????若希望環境變量永久生效,可將腳本內容添加到?~/.bashrc
?或?~/.bash_profile
:
echo "alias ll='ls -alF'" >> ~/.bashrc
echo "export PATH=\$PATH:~/bin" >> ~/.bashrc
source ~/.bashrc # 立即生效
總結
操作 | 命令/方法 |
---|---|
編輯腳本 | vi test.sh |
執行腳本(無權限) | sh test.sh |
執行腳本(有權限) | chmod +x test.sh ?+?./test.sh |
設置環境變量并生效 | source set_env.sh |
永久生效 | 將內容添加到?~/.bashrc |
五.?練習文件搜索
1.?搜索以?arm-
?開頭、以?gcc
?結尾的文件,找到用于 ARM 程序編譯的 GCC 編譯器路徑。
sudo find / -type f -name 'arm-*gcc' 2>/dev/null
參數說明?
sudo | ?以管理員權限搜索整個系統(可能需要輸入密碼) |
-find / | 從根目錄開始遞歸搜索 |
-type f | 僅搜索普通文件 |
-name 'arm-*gcc' | 匹配以?arm- ?開頭、以?gcc ?結尾的文件名 |
2>/dev/null | 忽略權限錯誤等干擾信息 |
輸出示例
/usr/bin/arm-linux-gnueabi-gcc
/opt/arm-toolchain/bin/arm-none-eabi-gcc
注意事項
-
常見 ARM GCC 編譯器路徑可能位于?
/usr/bin
?或工具鏈安裝目錄(如?/opt
)。 -
如果未安裝 ARM GCC,需先通過包管理器安裝(如?
apt install gcc-arm-linux-gnueabi
)。
2. 搜索?/bin/
?目錄下的所有符號鏈接文件
????????列出?/bin/
?目錄中所有軟鏈接文件。
find /bin -type l
參數說明
-type l | 僅搜索符號鏈接文件(軟鏈接) |
輸出示例
/bin/sh -> dash
/bin/rm -> /usr/bin/rm
驗證鏈接指向
ls -l /bin/sh # 查看軟鏈接指向的實際文件
3. 統計?/dev/
?下的字符設備和塊設備文件數量
echo "字符設備文件數量:$(find /dev -type c | wc -l)"
echo "塊設備文件數量:$(find /dev -type b | wc -l)"
參數說明
-type c | 搜索字符設備文件(如終端?/dev/tty ) |
-type b | 搜索塊設備文件(如磁盤?/dev/sda ) |
-wc -l | 統計行數(即文件數量) |
輸出示例
字符設備文件數量:123
塊設備文件數量:5
設備類型說明
類型 | 描述 | 常見示例 |
字符設備 | 按字符流讀寫 | /dev/tty ,?/dev/null |
塊設備 | 按數據塊讀寫 | /dev/sda ,?/dev/loop0 |
總結
問題 | 命令/方法 | 關鍵參數 |
搜索特定文件名 | find / -name 'arm-*gcc' | -name ,?2>/dev/null |
搜索符號鏈接 | find / bin -type l | -type l |
統計設備文件 | find /dev -type c ?和?find /dev -type b | -type c ,?-type b |
六. 練習掛在移動存儲設備
1. 查看現有磁盤設備
命令
ls /dev/sd* # 列出所有以 sd 開頭的設備(如 sda, sdb)
sudo fdisk -l # 列出所有磁盤及分區信息(需管理員權限)
說明
-
/dev/sda
: 第一塊物理磁盤(如系統盤)。 -
/dev/sdb
: 第二塊物理磁盤(可能是插入的 U 盤)。
2. 插入 U 盤并分配給虛擬機(僅限虛擬機環境)
操作步驟
? ? ? ? 1. 插入 U 盤到物理機。
? ? ? ? 2. 虛擬機軟件設置(以 VirtualBox 為例)
????????????????點擊虛擬機菜單欄:設備
?→?USB
?→ 選擇你的 U 盤設備。
????????3. 確認 U 盤已連接到虛擬機:
????????????????虛擬機右下角狀態欄顯示 U 盤圖標。
3. 檢查 U 盤設備及掛載狀態
命令
sudo fdisk -l # 查看新增的 U 盤設備(如 /dev/sdb1)
mount | grep sd # 查看已掛載的磁盤設備(自動掛載的 U 盤路徑通常是 /media/用戶名/卷標)
示例輸出
/dev/sdb1 /media/user/USB_DISK vfat rw,nosuid,nodev 0 0
4. 卸載自動掛載的 U 盤
命令
# 如果系統已自動掛載,先卸載
sudo umount /dev/sdb1 # 通過設備路徑卸載
# 或
sudo umount /media/user/USB_DISK # 通過掛載點卸載
5. 再次檢查設備狀態
sudo fdisk -l # 確認 /dev/sdb1 仍存在(設備未移除)
mount | grep sd # 確認 U 盤掛載點已消失
6. 手動掛載 U 盤到指定目錄
步驟
1. 創建掛載目錄
sudo mkdir -p /media/udisk # 創建目標目錄
2. 掛載U盤
sudo mount /dev/sdb1 /media/udisk # 手動掛載
3. 驗證掛載
mount | grep udisk # 查看掛載信息
ls /media/udisk # 列出 U 盤內容
7. 卸載 U 盤并從虛擬機移除
步驟
1. 卸載U盤
sudo umount /media/udisk # 通過掛載點卸載
# 或
sudo umount /dev/sdb1 # 通過設備路徑卸載
2. 安全移除U盤
????????虛擬機環境:點擊右下角 U 盤圖標 → 選擇?斷開連接
????????物理機環境:直接拔出 U 盤(確保已卸載)。?
關鍵命令總結
操作 | 命令/方法 |
---|---|
查看磁盤設備 | sudo fdisk -l |
查看已掛載設備 | mount | grep sd |
卸載設備 | sudo umount /dev/sdb1 ?或?sudo umount /掛載點 |
手動掛載 | sudo mount /dev/sdb1 /media/udisk |
安全移除 U 盤(虛擬機) | 虛擬機菜單欄斷開 USB 設備 |
注意事項
1. 設備名稱可能不同:U 盤可能為?/dev/sdc1
?或其他名稱,需根據?fdisk -l
?實際輸出調整。
2. 文件系統兼容性:如果 U 盤為 NTFS 文件系統,需安裝?ntfs-3g
?驅動:
sudo apt install ntfs-3g # Ubuntu/Debian
3. 卸載前確保無占用:若提示?target is busy
,關閉所有訪問 U 盤的程序或終端。
七. 操作磁盤映像文件
1. 創建磁盤鏡像文件?disk.img
命令
dd if=/dev/zero of=disk.img bs=1024 count=65536
參數說明
-
if=/dev/zero
: 輸入源為?/dev/zero
(生成全零文件)。 -
of=disk.img
: 輸出文件名為?disk.img
。 -
bs=1024
: 每次讀寫塊大小為 1KB。 -
count=65536
: 寫入 65536 個塊,總大小?64MB(1024 * 65536 = 64 MiB)。
驗證
ls -lh disk.img # 查看生成的文件大小是否為 64M
2. 格式化鏡像文件為 ext2 文件系統
命令
mkfs.ext2 -F disk.img
參數說明
-
-F
: 強制格式化,即使文件不是塊設備。
可能的問題
-
若提示?
mkfs.ext2: command not found
,需安裝?e2fsprogs
:
sudo apt install e2fsprogs # Ubuntu/Debian
3. 掛載鏡像文件到目錄
步驟
1. 創建掛載點目錄
mkdir mydisk
2. 掛載鏡像文件(需要管理員權限)
sudo mount -o loop disk.img mydisk # 關鍵:必須添加 `-o loop` 參數
-
-o loop
: 將文件關聯為循環設備(虛擬塊設備)。
3. 驗證掛載
mount | grep mydisk # 查看掛載信息
df -h mydisk # 查看掛載點磁盤使用情況
4. 讀寫操作
cd mydisk
sudo touch test.txt # 創建測試文件(需管理員權限)
sudo echo "Hello" > test.txt
4. 卸載鏡像文件
命令
sudo umount mydisk
注意事項
-
若提示?
target is busy
,表示有進程正在訪問掛載點:-
退出?
mydisk
?目錄。 -
關閉所有占用該目錄的程序或終端。
-
5. 壓縮磁盤鏡像文件
方法一:使用?gzip
(快速壓縮)
gzip disk.img # 生成 disk.img.gz
方法二:使用?xz
(高壓縮率,速度慢)
xz -z disk.img # 生成 disk.img.xz
方法三:使用?bzip2
(平衡壓縮率與速度)
bzip2 disk.img # 生成 disk.img.bz2
壓縮后操作
-
查看壓縮文件大小:
ls -lh disk.img.*
-
解壓縮:
gunzip disk.img.gz # 解壓 .gz
unxz disk.img.xz # 解壓 .xz
bunzip2 disk.img.bz2 # 解壓 .bz2
關鍵問題總結
步驟 | 命令/操作 | 常見問題及解決方案 |
---|---|---|
創建鏡像文件 | dd if=/dev/zero of=disk.img ... | 文件大小不足?調整?bs ?和?count |
格式化鏡像 | mkfs.ext2 -F disk.img | 安裝?e2fsprogs ?包 |
掛載鏡像 | mount -o loop ... | 必須添加?-o loop |
卸載鏡像 | umount mydisk | 確保無進程占用掛載點 |
壓縮鏡像 | gzip /xz /bzip2 | 根據需求選擇壓縮工具 |
擴展操作
調整鏡像文件大小(擴容)
1. 擴展鏡像文件至 128 M
dd if=/dev/zero bs=1M count=64 >> disk.img # 追加 64MB
2. 調整文件系統大小
sudo losetup /dev/loop0 disk.img # 關聯為循環設備
sudo e2fsck -f /dev/loop0 # 檢查文件系統
sudo resize2fs /dev/loop0 # 擴展 ext2 文件系統
sudo losetup -d /dev/loop0 # 解除關聯
八. 練習掛載 NFS 網絡文件系統
目的:將練習目錄~/work 進行 NFS 共享,可以將其掛載到從其它主機或本地其它目錄。
1. 配置 NFS 服務器端
(1)安裝 NFS 服務器軟件包
sudo apt update
sudo apt install nfs-kernel-server # Ubuntu/Debian
(2)編輯?/etc/exports
?文件
sudo nano /etc/exports
在文件末尾添加以下行(替換實際共享路徑):
/home/your_username/work *(rw,no_subtree_check,sync,no_root_sash)
-
路徑說明:
-
/home/your_username/work
:需共享的本地目錄(如?~/work
?對應絕對路徑?/home/user/work
)。 -
*
:允許所有 IP 訪問(生產環境建議限制為特定 IP 或網段,如?192.168.1.0/24
)。
-
-
權限參數:
-
rw
:允許讀寫。 -
no_subtree_check
:禁用子目錄檢查,提升性能。 -
sync
:同步寫入,保證數據一致性。 -
no_root_squash
:允許客戶端 root 用戶保留權限(謹慎使用,存在安全風險)。
-
(3)重啟 NFS 服務
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server # 開機自啟
(4)驗證共享配置
sudo exportfs -v
輸出應顯示共享目錄及參數,例如:
/home/user/work<world> (rw,wdelay,no_root_squash,no_subtree_check)
2. 本地掛載測試
(1)創建本地掛載點
mkdir ~/test
(2)掛載 NFS 共享目錄
sudo mount -t nfs localhost:/home/your_username/work ~/test
-
參數說明:
-
-t nfs
:指定文件系統類型為 NFS。 -
localhost
:若在本地測試,可直接用?localhost
;跨主機需替換為服務器 IP。
-
(3)驗證掛載
ls ~/test # 查看共享目錄內容
touch ~/test/file.txt # 測試寫入權限
(4)卸載共享目錄
sudo umount ~/test
3. 其他主機掛載(以客戶端為例)
(1)客戶端安裝 NFS 工具
sudo apt update
sudo apt install nfs-common # Ubuntu/Debian
(2)創建掛載點
sudo mkdir /mnt/nfs_shared
(3)掛載遠程 NFS 共享
sudo mount -t nfs 服務器IP:/home/your_username/work /mnt/nfs_shared
示例:
sudo mount -t nfs 192.168.1.100:/home/user/work /mnt/nfs_shared
(4)驗證掛載
df -h | grep nfs_shared # 查看掛載信息
ls /mnt/nfs_shared # 檢查文件內容
(5)卸載共享目錄
sudo umount /mnt/nfs_shared
4. 常見問題及解決
(1)權限被拒絕(Access Denied)
-
原因:
-
服務器端?
/etc/exports
?未正確配置 IP 或權限。 -
客戶端用戶無共享目錄的本地權限。
-
-
解決:
-
檢查?
/etc/exports
?的 IP 范圍和權限參數(如?rw
)。 -
確保服務器端共享目錄的本地權限開放:
-
sudo chmod 777 /home/your_username/work # 臨時測試(不建議生產環境使用)
(2)掛載超時或連接失敗
-
原因:
-
防火墻阻止 NFS 端口(默認使用?
2049/tcp
?和?111/udp
)。 -
服務器與客戶端網絡不通。
-
sudo ufw allow from 客戶端IP to any port nfs # Ubuntu
-
解決:
-
開放防火墻端口。
-
sudo ufw allow from 客戶端IP to any port nfs # Ubuntu
-
-
使用?
ping
?和?telnet
?測試網絡連通性。
-
telnet 服務器IP 2049
(3) 文件系統只讀(Read-Only)
-
原因:
-
服務器端?
/etc/exports
?未配置?rw
?權限。 -
客戶端掛載時未指定讀寫選項。
-
-
解決:
-
修改服務器端配置為?
rw
?并重啟 NFS 服務。 -
重新掛載時添加?
-o rw
?參數:
-
sudo mount -t nfs -o rw 服務器IP:/共享目錄 /掛載點
5. 自動掛載(可選)
編輯?/etc/fstab
?實現開機自動掛載:
sudo nano /etc/fstab
添加以下行:
服務器IP:/home/your_username/work /mnt/nfs_shared nfs defaults 0 0
????????驗證自動掛載:
sudo mount -a # 加載所有 fstab 條目
總結
步驟 | 命令/操作 | 關鍵點 |
---|---|---|
配置 NFS 服務器 | 編輯?/etc/exports ?+ 重啟服務 | 確保路徑、IP 范圍和權限正確 |
本地掛載測試 | mount -t nfs localhost:/path ~/test | 驗證讀寫權限 |
跨主機掛載 | 客戶端安裝?nfs-common ?+ 掛載命令 | 檢查防火墻和網絡連通性 |
故障排查 | 檢查權限、防火墻、日志 (/var/log/syslog ) | 使用?exportfs -v ?和?showmount -e |
九. 進程觀察和管理
1. 使用?sleep 100
?練習進程管理
(1) 啟動?sleep 100
?進程
sleep 100 # 前臺運行,阻塞終端
(2) 暫停進程(Ctrl-Z)
-
按下?
Ctrl-Z
,進程暫停并轉入后臺,終端顯示:
[1]+ Stopped sleep 100
(3) 查看作業狀態
jobs # 輸出示例:[1]+ Stopped sleep 100
(4) 后臺恢復進程
bg %1 # 輸出示例:[1]+ sleep 100 &
(5) 獲取進程 PID
ps -x | grep sleep # 查找 PID(如 1234)
(6) 查看進程內存映射
cat /proc/1234/maps # 或使用 pmap
pmap 1234 # 顯示內存布局
(7) 前臺恢復進程
fg %1 # 進程回到前臺繼續運行
(8) 進程結束后重新后臺啟動
sleep 100 & # 直接后臺運行
(9) 查看后臺作業詳情
jobs -l # 顯示作業號、PID 和狀態
(10) 終止進程
kill 1234 # 通過 PID 終止
# 或
kill %1 # 通過作業號終止
(11) 驗證進程狀態
ps -x | grep sleep # 確認進程已終止
2. 使用 C 程序?dvar
?重復操作
(1) 準備并編譯程序
<1>. 創建?dvar.c
:
#include <unistd.h>
int main() {while(1) { sleep(1); }return 0;
}
<2>. 編譯:
gcc -o dvar dvar.c
(2) 執行程序并重復步驟
./dvar # 前臺運行
# 后續操作與 sleep 100 完全相同(Ctrl-Z、jobs、bg/fg、kill 等)
3. 關鍵命令總結
操作 | 命令/快捷鍵 | 說明 |
---|---|---|
啟動前臺進程 | sleep 100 ?或?./dvar | 阻塞終端 |
暫停進程 | Ctrl-Z | 進程轉入后臺并暫停(狀態?T ) |
查看作業列表 | jobs | 顯示所有后臺作業 |
后臺恢復運行 | bg %作業號 | 進程在后臺運行(狀態?R ) |
查看進程 PID | ps -x ?或?jobs -l | 過濾關鍵詞如?sleep ?或?dvar |
查看內存映射 | pmap PID | 顯示虛擬內存布局 |
前臺恢復運行 | fg %作業號 | 進程回到前臺運行 |
終止進程 | kill PID ?或?kill %作業號 | 發送?SIGTERM ?信號 |
強制終止進程 | kill -9 PID | 發送?SIGKILL ?信號(慎用) |
4. 進程狀態說明
狀態符號 | 含義 |
---|---|
R | 運行中或可運行 |
S | 可中斷的睡眠(等待事件) |
T | 暫停(Ctrl-Z 或 SIGTSTP) |
Z | 僵尸進程(已終止未回收) |
5. 常見問題
(1)Ctrl-Z
?無響應
-
原因:程序未處理?
SIGTSTP
?信號(如自定義信號處理忽略此信號)。 -
解決:修改程序代碼或使用?
kill -SIGSTOP PID
?強制暫停。
(2)kill
?無法終止進程
-
原因:進程處于?
D
?狀態(不可中斷睡眠,如等待 I/O)。 -
解決:等待或重啟系統(極端情況)。
(3)僵尸進程處理
-
現象:進程狀態為?
Z
,父進程未回收子進程。 -
解決:終止父進程或重啟服務。
十. Linux 應用基礎 - 課后作業
1. 內核貢獻者統計
1.1?author_stats.sh
(統計高頻作者)
#!/bin/bash
# 功能:統計 kernel 目錄中 MODULE_AUTHOR 聲明的前五位高頻作者
# 前提:kernel 目錄包含內核源碼,且源碼中包含 MODULE_AUTHOR 聲明# 設置內核源碼路徑
# 本目錄下為“kernel”,查找主目錄下為:“$HOME/kernel”
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ];
thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 提取作者信息并統計
echo "正在提取 MODULE_AUTHOR 聲明中的作者信息并統計前五位高頻作者..."# 使用 find 命令查找 kernel 目錄中所有 .c 和 .h 文件。
# 使用 grep 提取包含 MODULE_AUTHOR 的行。
# 使用 sed 提取作者名稱(例如 "Linus Torvalds")。
# 使用 sort | uniq -c | sort -nr 統計每個作者的次數,并按次數降序排序。
# 使用 head -n 5 輸出出現頻率最高的前五位作者。
find "$KERNEL_PATH" -type f \( -name "*.c" -o -name "*.h" \) -exec grep -h 'MODULE_AUTHOR' {} + | sed -E 's/^.*MODULE_AUTHOR\("([^"]+)".*$/\1/' | sort | uniq -c | sort -nr | head -n 5echo "統計完成!"
?說明:
-
grep -r
?遞歸搜索所有文件,-h
?隱藏文件名,-o
?只輸出匹配部分。 -
提取雙引號內的作者名,統計頻率并取前 5 名。
1.2?danger_func_check.sh
(檢測危險函數?sprintf
)
#!/bin/bash
# 功能:檢測 kernel 目錄中使用 sprintf 的文件,并標紅顯示
# 前提:kernel 目錄包含內核源碼# 設置內核源碼路徑
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ]; thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 查找使用 sprintf 的文件并標紅顯示
echo "正在檢測使用 sprintf 的文件..."
grep -rn --color=always -e 'sprintf' "$KERNEL_PATH" --include="*.c" --include="*.h"# 使用 grep -rn 遞歸搜索 kernel 目錄中包含 sprintf 的文件。
# -r:遞歸搜索。
# -n:顯示匹配行的行號。
# --color=always:在終端中標紅顯示匹配的 sprintf。--color=always 選項會高亮顯示匹配的 sprintf,默認顏色為紅色。
# -e 'sprintf':指定搜索模式為 sprintf。
# --include="*.c" 和 --include="*.h":限定搜索范圍為 .c 和 .h 文件。echo "檢測完成!"
說明:
-
\<sprintf\>
?精確匹配單詞?sprintf
,避免誤匹配。 -
--color=always
?強制顯示顏色(標紅)。
1.3?find_magic_secret.sh
(查找內核彩蛋)
#!/bin/bash
# 功能:查找 kernel 目錄中包含特殊注釋 "magic" 和 "secret" 的代碼文件
# 前提:kernel 目錄包含內核源碼# 設置內核源碼路徑
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ]; thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 查找包含 "magic" 的代碼文件
echo "正在查找包含 'magic' 的代碼文件..."
grep -rnw "$KERNEL_PATH" -e 'magic' --include="*.c" --include="*.h"# 查找包含 "secret" 的代碼文件
echo "正在查找包含 'secret' 的代碼文件..."
grep -rnw "$KERNEL_PATH" -e 'secret' --include="*.c" --include="*.h"# 使用 grep -rnw 遞歸搜索 kernel 目錄中包含 magic 和 secret 的文件。
# -r:遞歸搜索。
# -n:顯示匹配行的行號。
# -w:全詞匹配(避免匹配到類似 magical 或 secrets 的內容)。
# --include="*.c" 和 --include="*.h":限定搜索范圍為 .c 和 .h 文件。# 指定模式:-e 后面跟著一個正則表達式,grep 會根據這個模式進行匹配。
# 支持多個模式:可以多次使用 -e 來指定多個搜索模式。echo "查找完成!"
2. 打包腳本
# 賦予腳本執行權限
chmod +x *.sh# 打包為 tar.gz
tar czvf kernel_scripts.tar.gz *.sh
輸出文件:kernel_scripts.tar.gz
?
3. 使用說明
3.1 解壓并使用腳本
tar xzvf kernel_scripts.tar.gz
cd <解壓目錄>
3.2 運行腳本
# 統計高頻作者
./author_stats.sh# 檢測 sprintf 使用
./danger_func_check.sh# 查找彩蛋文件
./find_magic_secret.sh
4. 示例輸出
4.1?author_stats.sh
?輸出
Top 5 MODULE_AUTHOR contributors:42 Linus Torvalds <torvalds@linux-foundation.org>35 Greg Kroah-Hartman <gregkh@linuxfoundation.org>28 Arnd Bergmann <arnd@arndb.de>25 David S. Miller <davem@davemloft.net>20 Kees Cook <keescook@chromium.org>
4.2?danger_func_check.sh
?輸出
(終端中?sprintf
?顯示為紅色)
4.3?find_magic_secret.sh
?輸出
./drivers/misc/magic_driver.c
./kernel/secret_module.c
5.關鍵命令參數說明
命令/參數 | 作用 |
---|---|
grep -r | 遞歸搜索目錄 |
awk -F'"' | 以雙引號為分隔符提取字段 |
sort | uniq -c | 統計頻率 |
grep --color=always | 強制終端顯示顏色(即使輸出到管道) |
grep -rl | 遞歸搜索并僅輸出文件名 |