文章目錄
- (1)Shell運行原理
- (2)Linux權限的概念
- 1)Linux中的用戶
- 2)Linux權限管理
- 1、檔案訪問者的分類(人)
- 2、檔案的權限(事物屬性)
- ① 檔案型別
- ② 檔案基本權限
- ④ 【拓展】檔案各屬性列含義
- 3、檔案權限值的表示方法
- 4、檔案權限的修改:chmod 指令
- ① 用戶表示符 + / - / = 權限字符
- ② 基于三位8進制數字來修改權限
- 5、檔案所有者的修改:chown 指令
- 6、檔案所屬組的修改:chgrp 指令
- 7、file 指令
- 8、Linux中的默認權限由什么決定
- ① 權限掩碼
- ② umask指令
- 9、目錄的權限
- 粘滯位
- 3)關于權限的總結
(1)Shell運行原理
當用戶登錄Linux系統的時候,系統會給用戶創建一個新的行程,一般叫做 bash(命令列解釋器)
Linux嚴格意義上說的是一個作業系統,我們稱之為“核心(kernel)“ ,但我們一般用戶,不能直接使用 kernel,
而是通過kernel的 “ 外殼 ” 程式,也就是所謂的shell,來與kernel溝通,如何理解?為什么不能直接使用kernel?
從技術角度,Shell的最簡單定義:命令列解釋器(command Interpreter),其作用主要包含:
- 將使用者的命令翻譯給核心(kernel)處理,
- 同時,將核心的處理結果翻譯給使用者,
對比 Windows GUI,本質其實并不屬于作業系統,而是一種 “ 外殼 ” 程式,我們操作 windows 不是直接操作 windows 內核,而是通過圖形介面,點擊,從而完成我們的操作(比如進入D盤的操作,我們通常是雙擊D盤盤符,或者運行起來一個應用程式),
Shell 對于 Linux,有相同的作用,主要是對我們的指令進行決議,決議指令給 Linux 內核,反饋在通過內核運行出的結果,通過 Shell 決議給用戶,
媒婆牽線小故事:如果說你是一個悶騷且害羞的程式員,那 shell 就像媒婆,作業系統內核就是你們村頭漂亮的且有讓你心動的MM小花,你看上了小花,但是有不好意思直接表白,就去婚介所找媒婆幫你提親,所有的事情你都直接跟媒婆溝通,由媒婆(shell)轉達你的意思給小花,而我們找到媒婆姓王,所以我們叫它王婆(bash),它對應我們常使用的 bash,
你(用戶)為什么不直接去找小花(作業系統內核)呢?因為不擅長,
媒婆(Shell)存在的價值是什么?1、解決你 ” 不擅長 “ 的問題,2、以及保護小花(作業系統內核),
![]()
【結論】
普通用戶不擅長直接去訪問作業系統,Shell 外殼就是用來將用戶的需求傳遞給作業系統,同時也可以保護作業系統(假如用戶有非法操作)
【思考】
Shell vs Bash,這兩者有啥區別呢?
Shell 是對所有外殼程式的統稱,而 Bash 是某一個具體的 Shell,Bash也是許多 Linux 發行版的默認 Shell,
(2)Linux權限的概念
1)Linux中的用戶
Linux 中有兩種用戶:超級用戶(root)、普通用戶,
- 超級用戶(root):可以在 linux 系統下做任何事情,不受限制(具有最高權限),
- 普通用戶:在 linux 下做有限的事情,
- 超級用戶的命令提示符是 “ # ”,普通用戶的命令提示符是 “ $ ” ,
切換用戶命令:
語法:su [用戶名]
功能:切換用戶,(要從root用戶切換到普通用戶user,則使用 su user, 要從普通用戶 user 切換到 root 用戶則使用 su - 或者 su root)
使用舉例:
- 切換成超級用戶:
su -- 切換回普通用戶:
ctrl + d
【拓展一】:
如果我不想切換成 root 用戶,但我想用 root 的身份去執行一些命令,可以采取在命令前帶 sudo 的方式,可以對該命令進行短期的權限提升,
語法:sudo [命令]
【拓展二】:
如果在執行命令的程序中,遇到如下報錯:解決方法是切換成 root 用戶,執行該命令,然后再切換回普通用戶,
xx is not in the sudoers file. This incident will be reported.
和用戶更多的相關操作,可以參考我寫的這篇文章:【Linux】初識云服務器 | 新建、登錄、切換用戶
2)Linux權限管理
什么是權限:決定某件事情,某人能否做
檔案權限 = 人 + 事物屬性
- 檔案受 “ 人 ” 的影響
- 檔案受本身特點的影響(“ 事物屬性 ”)
人(不一定是特定具體的人,而是一種角色):擁有者,所屬組,other(其它用戶)
檔案權限屬性:r(讀),w(寫),x(執行權限)
1、檔案訪問者的分類(人)
檔案和檔案目錄的所有者:u—User
檔案和檔案目錄的所屬者所在的組的用戶:g—Group
其它用戶:o—Others
2、檔案的權限(事物屬性)
輸入命令 ll 查看該目錄下檔案的詳細資訊,
① 檔案型別
Windows通過后綴磁區檔案型別,
而Linux區分檔案型別,一般不通過后綴,通過屬性列的第一個字符!
但并不代表某些工具不關心后綴,比如 gcc,
![]()
檔案型別如下:
- d:檔案夾
- -:普通檔案(文本檔案、可執行檔案、各種庫檔案)
- l:軟鏈接檔案(類似Windows的快捷方式)
- b:塊設備檔案(例如硬碟、光驅等)
- p:管道檔案(進行行程間通信)
- c:字符設備檔案(例如螢屏等串口設備)
- s:套介面檔案
② 檔案基本權限
屬性列的第一個字符的后面9個字符,33為一組,表示檔案的權限屬性
![]()
權限屬性如下:
- 「r / -」:Read對檔案而言,具有讀取檔案內容的權限;對目錄來說,具有瀏覽該目錄資訊的權限
- 「w / -」:Write對檔案而言,具有修改檔案內容的權限;對目錄來說,具有洗掉移動目錄內檔案的權限
- 「x / -」:execute對檔案而言,具有執行檔案的權限;對目錄來說,具有進入目錄的權限
- 「-」:表示不具備該項權限
【思考】
group 存在意義是什么呢?—— 保證專案安全的前提,方便組內協同,
公司里有一臺服務器,有兩個專案技術組,A組和B組,老板讓兩個組同時開發一個專案,比比誰做的更好,雖然同時公司人,但我們并不想另外一組看到我們的專案檔案,該怎么辦呢?
假如A組中的張三創建了該專案檔案
- 張三是該專案的所屬用戶 owner,可讀可寫;
- A組的其它組員則是所屬用戶組 group,設定成可讀可寫;
- B組的人都是 other,設定成不可讀不可寫,他們就什么都看不到;
我們就對這三類訪問者進行了專案檔案的訪問權限控制,在保證專案安全的前提下,方便組內協同,
![]()
④ 【拓展】檔案各屬性列含義
3、檔案權限值的表示方法
我們對檔案的訪問權限有是否讀、是否寫、是否可執行,這種是與否的概念不就是二進制嗎,1表示是,0表示否,
| 權限符號 | 二進制 | 八進制 |
|---|---|---|
| r– | 100 | 4 |
| w– | 010 | 2 |
| x– | 001 | 1 |
| rw- | 110 | 6 |
| r-x | 101 | 5 |
| -wx | 011 | 3 |
| rwx | 111 | 7 |
| — | 000 | 0 |
4、檔案權限的修改:chmod 指令
語法:chmod [引數] [權限] [檔案名]
功能:設定檔案的訪問權限,
常用選項:
R :遞回修改目錄檔案的權限(說明:只有檔案的擁有者和 root 才可以改變檔案的權限)
chmod命令修改權限值的格式
① 用戶表示符 + / - / = 權限字符
+:向權限范圍增加權限代號所表示的權限
-:向權限范圍取消權限代號所表示的權限
=:向權限范圍重新賦予權限代號所表示的權限
用戶表示符:
u:擁有者
g:擁有者同組用
o:其它用戶
a:所有用戶
使用舉例一:增加取消權限
取消 test.c 檔案的擁有者(u)的讀(r)權限:
[ll@VM-0-12-centos lesson4]$ chmod u-r test.c
[ll@VM-0-12-centos lesson4]$ ll
--w-rw-r-- 1 ll ll 72 Jan 4 17:10 test.c
取消 test.c 檔案的所屬用戶組(g)的讀寫(rw)權限:
[ll@VM-0-12-centos lesson4]$ chmod g-rw test.c
[ll@VM-0-12-centos lesson4]$ ll
--w----r-- 1 ll ll 72 Jan 4 17:10 test.c
增加 test.c 檔案的其它用戶(o)的讀寫執行(rwx)權限:
[ll@VM-0-12-centos lesson4]$ chmod o+rwx test.c
[ll@VM-0-12-centos lesson4]$ ll
--w----rwx 1 ll ll 72 Jan 4 17:10 test.c
對 test.c 檔案的擁有者增加讀權限,所屬組增加讀寫權限,其它用戶取消讀寫執行權限:
[ll@VM-0-12-centos lesson4]$ chmod u+r,g+rw,o-rwx test.c
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw---- 1 ll ll 72 Jan 4 17:10 test.c
使用舉例二:重新賦予權限
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw---- 1 ll ll 72 Jan 4 17:10 test.c
[ll@VM-0-12-centos lesson4]$ chmod o=rw test.c #=對檔案權限重新賦予
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw-rw- 1 ll ll 72 Jan 4 17:10 test.c
使用舉例三:
[ll@VM-0-12-centos lesson4]$ chmod u-r test.c #取消test.c的擁有者(u)的讀(r)權限
[ll@VM-0-12-centos lesson4]$ ll
--w-rw-r-- 1 ll ll 72 Jan 4 17:10 test.c #讀權限沒有了
#-----------------------------------------------------------------#
[ll@VM-0-12-centos lesson4]$ cat test.c #查看test.c的內容
cat: test.c: Permission denied #顯示沒有權限
解決方法:使用 sudo 暫時提升權限成為 root,可查看檔案內容:
sudo cat test.c
【思考】
root 對于 test.c 來說,其角色是其它用戶(other),卻可以隨意訪問 test.c,為什么呢?
因為權限永遠都是約束普通用戶的,root用戶不受權限約束,
② 基于三位8進制數字來修改權限
使用舉例:
7的八進制形式為111,表示 rwx,可讀可寫可執行,一次性設定三類用戶的檔案訪問權限:
[ll@VM-0-12-centos lesson4]$ chmod 777 test.c
[ll@VM-0-12-centos lesson4]$ ll
-rwxrwxrwx 1 ll ll 72 Jan 4 17:10 test.c
6 6 0 -> 110 110 000,設定檔案所有者和所屬組的權限為 rw-,其它用戶的權限為 —:
[ll@VM-0-12-centos lesson4]$ chmod 660 test.c
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw---- 1 ll ll 72 Jan 4 17:10 test.c
5、檔案所有者的修改:chown 指令
格式:chown [引數] [用戶名] [檔案名]
功能:修改檔案的所有者,
使用舉例:
把 test.c 檔案的所有者改為 root,提示說不允許操作:
這個就像你把這個東西(test.c)給別人,肯定是要爭得別人得同意的,
[ll@VM-0-12-centos lesson4]$ chown root test.c
chown: changing ownership of ‘test.c’: Operation not permitted
所以我們需要用 「sudo」 暫時提升一下我們的權限,來修改檔案的所有者:
$ sudo chown root test.c
#$ sudo chown sctest test.c
修改之后:
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw-r-- 1 root ll 72 Jan 4 17:10 test.c
6、檔案所屬組的修改:chgrp 指令
格式:chgrp [引數] [用戶組名] [檔案名]
功能:修改檔案或目錄的所屬組,
常用選項:
-R:遞回修改檔案或目錄的所屬組
使用舉例:
修改檔案的所屬組為 root,提示說不允許操作,類似第 5、檔案所有者的修改:chown 指令
[ll@VM-0-12-centos lesson4]$ chgrp sctest test.c
chgrp: changing group of ‘test.c’: Operation not permitted
所以我們需要用 「sudo」 暫時提升一下我們的權限,來修改檔案的所屬組:
$ sudo chgrp root test.c
修改之后:
[ll@VM-0-12-centos lesson4]$ ll
-rw-rw-r-- 1 ll root 72 Jan 4 17:10 test.c
【拓展】
如何一次性修改檔案所有者和所屬組:
$ sudo chown ll:ll test.c #檔案所有者和所屬組都被修改成了ll
7、file 指令
語法:file [選項] [檔案或目錄]
功能:辨識檔案型別,
常用選項:
- -c 詳細顯示指令執行程序,便于排錯或分析程式執行的情形,
- -z 嘗試去解讀壓縮檔案的內容,
使用舉例:
[ll@VM-0-12-centos lesson4]$ file test.c
test.c: C source, ASCII text
[ll@VM-0-12-centos lesson4]$ file file1.txt
file1.txt: empty
8、Linux中的默認權限由什么決定
查看檔案詳細資訊,可以看到檔案所有者、所屬組、其它用戶的權限
-
對于一般普通檔案,新建檔案的默認權限為 666(rw- rw- rw-)
-
對于一般目錄檔案,新建目錄的默認權限為 777(rwx rwx rwx)
但實際上你所創建的檔案和目錄,看到的權限往往不是上面這個值,原因就是創建檔案或目錄的時候還要受到 umask 的影響,所以我們在 Linux 中看到的實際創建出來的檔案權限是這樣的:
[ll@VM-0-12-centos lesson4]$ ll
total 8
drwxrwxr-x 2 ll ll 4096 Jan 13 21:32 dir #775(檔案權限值用八進制表示)
-rw-rw-r-- 1 ll ll 72 Jan 4 17:10 test.c #664
這又是為什么呢?這就需要了解一下權限掩碼的概念了,
① 權限掩碼
權限掩碼是由3個八進制的數字所組成,將現有的存取權限減掉權限掩碼后,即可產生建立檔案時預設的權限,
② umask指令
語法:umask [權限值]
功能:查看或修改檔案權限掩碼
說明:將現有的存取權限減去權限掩碼后,即可產生建立檔案時預設權限,超級用戶默認掩碼值為0022,普通用戶默認為0002
(1)使用指令 " umask " 查看當前權限掩碼,我們只關注后3個八進制數字,
[ll@VM-0-12-centos lesson4]$ umask
0002 #權限掩碼為002 --> 000 000 010 --> 我們可以看到other的寫權限為1
凡是在 umask 中出現的權限,都應該減掉,不應該在檔案預設權限中出現,
預設權限計算方法一:
#建立檔案時預設權限 = 默認權限 & ~umask
666 --> 110 110 110
~002 --> 111 111 101 &
------------------------
110 110 100 --> 664 #檔案默認權限為666,通過計算后得到預設權限為664
預設權限計算方法二:建立檔案時預設的權限 = 默認權限 - 權限掩碼
[ll@VM-0-12-centos lesson4]$ ll
total 8
drwxrwxr-x 2 ll ll 4096 Jan 13 21:32 dir #777-002=775(rwx rwx r-x)
-rw-rw-r-- 1 ll ll 72 Jan 4 17:10 test.c #666-002=664(rw- rw- r--)
(2)我們通過指令 " umask " 可用來設定建立檔案時預設的權限掩碼
[ll@VM-0-12-centos lesson4]$ umask 777 #權限掩碼被設定成777
9、目錄的權限
曾經的一道面試題:
-
要在目錄下創建檔案,需要什么權限?
@需要寫權限「w」,如果沒有,則無法在目錄中創建和洗掉檔案,
-
要讀取目錄下的檔案串列,要什么權限?
@需要讀權限「r」,如果沒有,則無法用 ls 等命令查看目錄中的檔案內容,
-
要進入一個目錄要什么權限?
@具有可執行權限「x」,如果沒有,則無法用 cd 命令進入到目錄中,
【思考】
這里有一個問題,只要用戶具有目錄的寫和執權限,就可以在目錄中創建和洗掉檔案,而不論這個用戶是否具有某個檔案的寫權限,
換言之就是,我張三在目錄 A 中創建了一個檔案,而李四有目錄 A 的寫和執權限,他就可以進入目錄洗掉掉我的檔案嗎?
下面我們來一起驗證一下:
這里有一個目錄,用 sudo 提升我們的權限將目錄的所有者和所屬組改成 root,其 u、g、o 權限都修改為 rwx:
[ll@VM-0-12-centos lesson4]$ ll
drwxrwxrwx 2 root root 4096 Jan 17 11:05 dir
在 dir 目錄中創建一些檔案,用 sudo 提升我們的權限將檔案的所有者和所屬組改成 root,并去掉其它用戶的所有權限:
[ll@VM-0-12-centos dir]$ ll
total 0
-rw-rw---- 1 root root 0 Jan 17 11:20 file1.txt #其它用戶沒有可寫可讀可執行權限
-rw-rw---- 1 root root 0 Jan 17 11:20 file2.txt
-rw-rw---- 1 root root 0 Jan 17 11:20 file3.txt
此時我作為其它用戶,有 dir 目錄的寫權限,來對目錄里 root 的檔案執行 rm 指令:
[ll@VM-0-12-centos dir]$ rm file1.txt
結果發現,我(其它用戶,有目錄的寫和執權限)是可以洗掉目錄中 root 的檔案,
那么應該怎么防止這種情況的發生呢?這就需要學習一下粘滯位的概念了,
粘滯位
同一個目錄下,不同用戶創建的檔案,可能會被其它用戶刪掉,為了防止被刪掉,給目錄設定粘滯位,
[ll@VM-0-12-centos lesson4]$ ll
drwxrwxrwx 2 root root 4096 Jan 17 11:05 dir
----------------------------------------------------------
[ll@VM-0-12-centos lesson4]$ sudo chmod +t dir #給目錄加上粘滯位
----------------------------------------------------------
[ll@VM-0-12-centos lesson4]$ ll
drwxrwxrwt 2 root root 4096 Jan 17 11:05 dir #該目錄其它用戶權限變成了rwt
此時再去洗掉目錄中 root 的檔案,提示無法洗掉,操作不被允許:
[ll@VM-0-12-centos dir]$ rm file1.txt #不能洗掉目錄中別人的檔案
【結論】
-
在目錄上設定 " 粘滯位 " (用 chmod + t),則該目錄下的檔案只能由
- 超級管理員root洗掉
- 該目錄的所有者洗掉
- 該檔案的所有者洗掉
-
只有目錄內檔案的所有者或者 root 才可以洗掉或移動該檔案,
-
如果不為目錄設定粘滯位,任何具有該目錄寫和執權限的用戶都可以洗掉和移動其中的檔案,
-
實際應用中,粘滯位一般用于 /tmp 目錄(該目錄通常保存系統中各用戶產生的臨時檔案),以防止普通用戶洗掉或移動其他用戶的檔案,
[ll@VM-0-12-centos dir]$ ll -d /tmp drwxrwxrwt. 10 root root 4096 Jan 17 03:08 /tmp
3)關于權限的總結
- 目錄的可執行權限是表示你是否可以進入目錄,
- 如果目錄沒有 -x 權限,則無法對目錄執行任何命令,甚至無法 cd 進入目錄,即使目錄仍然有 -r 讀權限(這個地方很容易犯錯,認為有讀權限就可以進入目錄讀取目錄下的檔案)(想要讀和寫目錄里的檔案,首先得有進入目錄的權限)(比如要去銀行倉庫取錢,你得先有進入銀行倉庫的權限呀)
- 而如果目錄具有 -x 權限,但沒有 -r 權限,則用戶可以執行命令,可以 cd 進入目錄,但由于沒有目錄的讀權限,所以在目錄下,即使可以執行 ls 命令,但仍然沒有權限讀出目錄下的檔案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414030.html
標籤:其他
上一篇:計算機組成-三個子系統互連
下一篇:Linux-行程控制
