一. shell 命令及運行原理基本理解
1)廣義理解的操作系統包括:操作系統內核、外殼程序(shell命令行、圖形化界面)、必要的軟件。
2)狹義的操作系統:操作系統內核。
3)在用戶和內核之間有一個外殼程序(shell外殼),也叫命令行解釋器,是操作系統外的一層軟件層。
1. 它存在的原因:主要是因為人不擅長和內核交互,但是擅長和shell命令行、圖形化界面等外殼程序交互。并且外殼可以變相的保護內核。
2. 它的作用:將用戶的命令翻譯給核心處理。同時,將核心的處理結果翻譯給用戶。
4)shell外殼是一個廣義的概念,它包含了bash。即bash是一個具體的命令行解釋器。
他有雙重身份,既作為執行環境又作為一個可執行命令本身。
1. 作為外殼程序,他會一直循環的做四件事:打印提示符 --> 讀取命令 --> 解釋和執行命令 --> 返回結果。
2. 作為一個命令,執行這個命令會啟動一個新的 Bash Shell 子進程,通常用于創建嵌套的 Shell 環境或執行腳本。
[root@hcss-ecs-116a ~]# ls /usr/bin/bash
/usr/bin/bash
5)有風險的命令,shell外殼程序可以創建子進程來做。這樣就算子進程掛了也不會影響我們原本的外殼程序。
二. 權限
(一)什么是權限
權限決定了一個資源我們有沒有權利訪問,即能不能訪問資源的問題。
(二)為什么要有權限
Linux是一個多用戶操作系統,可能同時有多個人或賬號進行登陸訪問,有普通用戶也有超級用戶。如果不對部分用戶加以限制,可能用戶之間彼此會有不好的影響。所以權限的本質也是要進行更好的用戶管理。
(三)權限 = 人 + 屬性
權限針對特定的群體---與人有關(普通用戶?超級用戶?)。
目標主體必須具備對應的屬性才能訪問。根據Linux下,一切皆文件的特性,所謂的目標主體就是文件,而文件常見的屬性有三個:可讀(r)?可寫(w)?可執行(x)?
用戶的問題
1)超級用戶(root):Linux中的特權級別,基本不受權限約束。可以隨意切換到任意普通賬號。
2)su指令---賬號間的切換問題
1. 超級用戶和普通用戶之間
這個操作一般由擁有root賬號的人做,因為超級用戶通常也有自己的普通賬號,他知道root賬號的密碼,需要在兩個賬號間切換。
[root@hcss-ecs-116a lsy]# whoami root [root@hcss-ecs-116a lsy]# su lsy [lsy@hcss-ecs-116a ~]$ whoami lsy
[lsy@hcss-ecs-116a ~]$ whoami lsy [lsy@hcss-ecs-116a ~]$ su root Password: [root@hcss-ecs-116a lsy]# exit [lsy@hcss-ecs-116a ~]$ su Password: [root@hcss-ecs-116a lsy]# exit [lsy@hcss-ecs-116a ~]$ su - Password: Last login: Sat Sep 6 13:18:40 CST 2025 on pts/0 [root@hcss-ecs-116a ~]# logout
可以看到第三種普通賬號切換到root賬號的方式比其他兩種方式多出了一行:Last login: Sat Sep ?6 13:18:40 CST 2025 on pts/0? ?證明這種方式雀食是以重新登陸的方式切換賬號的。
2. 普通用戶和普通用戶之間
有對方的密碼即可切換
3)最佳實踐:每個人老老實實用好自己的賬號,不要切來切去。只有超級用戶偶爾需要在root賬號和自己的普通賬號之間切換。
4)新建、刪除用戶,并設置密碼
默認root賬號才有的權力,普通用戶只有修改自己密碼的權力,普通用戶也可以通過短暫提權的方式獲得這項權利(馬上會講如何短暫提權)。
1. 新建、設置(更改)密碼
[root@hcss-ecs-116a ~]# adduser lh
[root@hcss-ecs-116a ~]# passwd lh
Changing password for user lh.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@hcss-ecs-116a ~]# su lsy
[lsy@hcss-ecs-116a root]$ su lh
Password:
[lh@hcss-ecs-116a root]$ whoami
lh
?2. 刪除(千萬別忘了加 -r !!)
[root@hcss-ecs-116a ~]# adduser lh
[root@hcss-ecs-116a ~]# ls /home
lh lsy
[root@hcss-ecs-116a ~]# userdel -r lh
[root@hcss-ecs-116a ~]# ls /home
lsy
5)sudo 指令
如果一個普通用戶想在系統中裝一個軟件,但是軟件安裝相當于將對應的文件拷貝到系統的指定目錄下,操作系統不允許普通用戶拷。
那是不是意味著所有類似于軟件安裝等的任務都只有root賬號即超級管理員能做?答案是:不是的。
如果真的是這樣,那超級管理員的工作量很大,每天安裝個軟件就有好多人找到他,讓他做。同樣的,也不可能將root密碼給所有人,讓他們隨意切換到root賬號進行軟件安裝等工作,否則權限對不同用戶的約束力就消失了。
基于以上的問題,Linux給出了一個能讓普通用戶進行短暫提權的指令 --- sudo指令。
?1. 用法:sudo? 你想做的指令? +? 你自己的普通賬號的密碼
- 這里普通用戶想要短暫獲取超級用戶的權限,竟然只需要知道自己的密碼就可以,那么不是所有人都和root賬號沒區別了么?并不是這樣的。
- sudo是現代Linux系統安全和管理的最佳實踐之一,在普通賬號創建之初是默認沒有使用sudo的權力的,系統通過白名單(一個特殊的配置文件 /etc/sudoers,這個文件定義了哪些用戶、在哪些主機上、可以以誰的身份、運行哪些命令)機制管理誰可以進行提權操作。將普通用戶添加到這個文件里或者加入一個在sudoers文件中指定的用戶組,這個普通用戶才獲得了使用sudo的資格。
- 普通用戶想用sudo變身為root,光知道自己的密碼遠遠不夠,最關鍵的是需要root提前在系統里給他“開權限”;一旦開了權限,他的一切超級操作都會被記錄在案,責任到人,這和直接擁有root賬號是完全不同的兩回事。
- 讓輸入自己的密碼主要是為了安全性和責任追溯,確認是你本人在執行這個特權操作,而不是別人在你忘記鎖屏的電腦上胡亂操作。這強化了“誰操作,誰負責”的原則。系統日志會清晰記錄sudo的使用情況。如果使用統一的root密碼,出了事無法查清是誰干的。同時也減少了root密碼泄露的風險。
[lsy@hcss-ecs-116a ~]$ sudo touch test.txt [sudo] password for lsy: lsy is not in the sudoers file. This incident will be reported.
sudo可以進行短暫的提權,當我們輸入密碼成功,之后的一段時間(從認證的角度看,默認有效期是15分鐘(可配置))都不用再輸入密碼
角色的問題
1)角色,對于一個文件,存在三種角色。
1. 擁有者(user) --- 文件是誰建的
2. 所屬組(group)?--- 文件屬于哪個組,對文件進行組級別的管理
3. 其他所有用戶(others)--- 不是擁有者,也不是所屬組,就是others
2)權限是依附于角色的,角色是需要人來扮演的。
3)使用 ll 指令查看文件屬性:
屬性從左到右依次為(后面以上圖為例):
1. 文件類型:-
2. 擁有者權限:rw-
3. 所屬組權限:r--
4. others權限:r--
5. 硬鏈接數:1(這個暫時還不需要理解,后面會講到)
6.? 擁有者:root
7. 所屬組:root
8. 文件大小:72
9. 最后一次修改時間:Sep? 8 10:01
10. 文件名:test.txt
1. 顯然,我們可以直接在屬性中查看到文件的擁有者和所屬組是誰,但是沒有單獨列出others,是因為不需要,系統在識別訪問者的角色之后會拿來和擁有者、所屬組對比,如果都不是就認為是others。
2. 單獨的一個人,比如root、lsy...都可以做一個組。
4)什么是所屬組?為什么要有所屬組?
1.?所屬組(Group)是一個用戶的集合。?它是Linux系統中用于組織用戶和管理權限的一個基本單位。
2. 所屬組的意義,簡單來說:在同一個組中,方便一個團隊的伙伴共享資源,卻又能限制其他不在組中的用戶,不能隨意訪問組中資源。所屬組的意義還有很多,詳細地可以問一下大模型!
文件權限屬性問題
1)常見的三個文件屬性
1. 可讀(r)
2. 可寫(w)
3. 可執行(x)
2)1.?
2.?
r 代表角色對文件有可讀權限
w 代表角色對文件有可讀權限
x 代表角色對文件有可執行權限
- 代表沒有某項權限
3. 從左到右必須是rwx的順序,不能像指令選項一樣,隨便交換順序。
?4. 小總結:如何正確描述一個文件的權限(以test.txt為例)
該文件的擁有者是root,所屬組是root。該文件對應的擁有者的權限是可讀可寫不可執行,該文件對應的所屬組的權限為可讀不可寫不可執行,others對該文件的權限是只能讀不可寫不可執行。
權限的指令操作
權限 = 人 + 文件屬性
所以在操作上要么改變人(用戶或角色),要么改變文件屬性(可讀?可寫?可執行?)
1)chmod指令(change mode,改變模式)
文件屬性只有root和文件擁有者能改文件屬性,需要使用chmod指令。
超級用戶的命令行提示符是#,普通用戶的是$
?1. 語法:chmod? 角色名+/-某屬性? 文件名
角色名 | 某屬性 |
u(擁有者) | r(可讀) |
g(所屬組) | w(可寫) |
o(others) | x(可執行) |
a(all,所有角色) |
?2. 示例
[root@hcss-ecs-116a dira]# ll
total 4
-rw-r--r-- 1 root root 72 Sep 8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod u-r test.txt
[root@hcss-ecs-116a dira]# ll
total 4
--w-r--r-- 1 root root 72 Sep 8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod u+r,g+rwx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rwxr-- 1 root root 72 Sep 8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod o+wx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rwxrwx 1 root root 72 Sep 8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod a-rwx test.txt
[root@hcss-ecs-116a dira]# ll
total 4
---------- 1 root root 72 Sep 8 10:01 test.txt
[root@hcss-ecs-116a dira]# chmod a+rw test.txt
[root@hcss-ecs-116a dira]# ll
total 4
-rw-rw-rw- 1 root root 72 Sep 8 10:01 test.txt
2)修改文件屬性的八進制方案
1. 對于rwx這按個屬性,一個文件只有? 有(r/w/x)和沒有(-)這兩種狀態,那么我將有認為是1,沒有認為是0,就又可以多出一種修改文件屬性的方案。因為文件屬性是三位一組、一共三組的,而三位二進制數最大能表示到八進制的7,三組并列表示不會進位,剛好是一個八進制數。
2. 比如對于u(擁有者)這一組,我要為他加上所有權限 rwx? =>? 111? =>? 7(轉換為八進制:4+2+1=7)。同理我要g這一組沒有任何權限 ---? =>? 000? =>? 0,o這一組只有只讀屬性 r--? =>? 100? =>? 4。那么三組按順序就是:704。我們可以驗證一下是否像我們預想的設置了文件權限。
3)總結
如何修改文件屬性有兩種方案:
1. ugo +- rwx
2. 八進制方案
沒有權限會怎么樣
1)此時lsy作為擁有者,有對文件的讀寫權限。
2)當去掉他的讀寫權限時:
3)該文件的擁有者和所屬組都是lsy,所以root屬于others,我們去掉others的讀寫權限,發現root依然可以對文件進行讀寫操作。體現了root賬號是Linux中的特權級別,不受權限約束。
4)Q&A
1.? 為什么文件的擁有者要去掉自己的權限?
?① 最主要的原因就是要增強安全性,防止自身的誤操作導致數據丟失或者服務中斷。
② 合規性與審計要求。確保某些文件(比如財務日志、審計追蹤文件等)不可篡改,滿足監管要求。
③ 其他場景還有很多不同的意義,所以文件擁有者主動放棄自己的一些權限其實是一種更高級、更精細的控制形式,體現對系統安全性和穩定性的深刻理解。
?2. 在2)的例子中,lsy作為文件的擁有者雖然沒有讀寫權限,但是他同時還是文件的所屬組啊,明明所屬組有讀寫權限,為什么事實上lsy不能進行讀寫了?
?因為:用戶訪問文件時,系統就會驗證他的身份,并確定他相對于該文件是什么身份。這個驗證只會做一次(權限只會驗證一次),也就是說系統識別到 lsy 是文件的擁有者之后就確定了他是擁有者,不會再和后面的所屬組比對了。
如何證明呢?
1.? 間接證明:其實這個問題就已經間接證明了,如果會驗證多次的話,在擁有者失去權限時,系統就應該向后匹配是否是所屬組或others,是否有對應的權限。
2.? 直接證明,現在我把擁有者換了,理論上就可以匹配到所屬組這一步了。
(這里用到了一個chown指令,比較見名知意,就是改變文件擁有者的指令,稍后在下面會再正式提出一次)
3. 關于可執行屬性
不是有了可執行屬性文件就可執行了,一個txt文件他也執行不起來啊。可執行屬性相當于給了文件一個入場券,代表著你想執行我不攔著你,但是能不能真正執行起來還要看你自己的本事(是不是一個可執行的二進制文件)。
綜上,文件想要真正的執行起來需要兩個條件:
① 文件本身就是一個可執行的二進制文件。
② 文件擁有可執行權限。
權限中與人有關的話題
1)chown指令(change own,更換文件擁有者)
2)chgrp指令(change group,更改文件所屬組)
3)同時改:chown lsy:lsy test.txt
沒有指令:chgrp root:root test.txt
4)沒有單獨改others的指令,因為并不需要,改變擁有者和所屬組就是改變others了(不是擁有者也不是所屬組就是others)
5)從上圖中我們可以看出:作為文件的擁有者,lsy卻不能更改文件的擁有者和所屬組(文件擁有者可以改變各角色的權限),為什么呢?
因為你改一個屬于你的文件的權限那是你自己的事情,允不允許誰看、寫、執行都是你自己的事情。但是想改文件的擁有者和所屬組就和別人有關了,相當于把你這個文件給了別人。現實中你想要把一個東西給別人也要征得別人的同意,因為誰知道你給的是什么,萬一是“臟水”呢,對方可能會被迫承擔責任。
但是我們linux中沒有能去征得對方同意的方法,只能通過超級用戶的權限強行改。但是有強行改的方法如何避免我們可能會被迫承擔責任這件事呢?不用擔心,普通用戶想要提權必須通過sudo,前面也說過了,能使用sudo的一定是系統白名單上的用戶,也有日志記錄易于追責。
文件類型
屬性中第一個位置的-就是文件屬性,它屬于普通文件。當然linux中的文件類型不止這一個(我們只介紹幾個常見的):
類型標識符 | 文件類型名 | 舉例 | 演示指令 |
- | 普通文件 | 文本、二進制、圖片、源碼等 | ll |
d | 目錄文件 | 文件夾 | ll |
l | 鏈接文件 | ls /usr/lib64/ -l | |
p | 管道文件 | 用于進程間通信,和我們之前提到的管道 | 是一回事,| 是匿名管道,管道文件是命名管道 | mkfifo fifo ll |
c | 字符文件 | 鍵盤、顯示器(按照順序輸入輸出,不支持隨機讀寫。我們printf、scanf、cin、cout操作的都是字符) | ls /dev/pts/ -l |
b | 塊設備文件 | 磁盤(典型的塊設備)(支持隨機讀寫,讀寫的基本單位以塊為單位,通常4kb、512字節) | ls /dev/vda* -l |