要瞭解Linux的許可權,需要和Linux的用戶與組的概念一併理解,不瞭解的同學請參考Linux的用戶和組 簡介 在Linux中,每個文件除了有用戶和組的信息以外,還有其對應的許可權。可使用來查看。 看第一個欄位的第二位至第十位,一共九位。 左三位(rw-):表示文件所有者的許可權。 中三位(r--):表 ...
要瞭解Linux的許可權,需要和Linux的用戶與組的概念一併理解,不瞭解的同學請參考Linux的用戶和組
簡介
在Linux中,每個文件除了有用戶和組的信息以外,還有其對應的許可權。可使用來查看。
[root@C7 ~]# ls -l /etc/fstab -rw-r--r--. 1 root root 465 Sep 27 15:49 /etc/fstab
看第一個欄位的第二位至第十位,一共九位。
-rw-r--r--.
左三位(rw-):表示文件所有者的許可權。
中三位(r--):表示文件所有組的許可權。
右三位(r--):表示其他人的許可權。
註意:某個進程對於文件是否具備足夠的許可權,取決於運行該進程的用戶對其的許可權!
進程安全上下文
進程對文件的訪問許可權應用模型:
- 檢查進程的屬主是否與文件的屬主一致,若一致則應用文件屬主許可權;否則下一步。
- 檢查進程的屬組是否與文件的屬組一致,若一致則應用文件屬組許可權;否則下一步。
- 應用文件其他人許可權。
讀寫執行
對於文件:
- 讀(readable,簡寫r):可以獲取文件的數據。
- 寫(writable,簡寫w):可以增刪改文件的數據。
- 執行(executable,簡寫x):若文件為可執行的格式,例如bash腳本、PHP文件等,則可以執行文件。
對於目錄:
- 讀:可以使用ls命令獲取目錄的內容,不包含ls -l。
- 寫:可以修改目錄列表,即增加、刪除和重命名目錄下的文件。
- 執行:可以對目錄使用cd和ls -l命令。
許可權組合機制
Linux的許可權除了使用rwx字母表示以外,還可以使用八進位數字表示,如下表所示。
一般我們在使用過程中,也習慣使用八進位表示法。
許可權 | 二進位 | 八進位 |
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
chmod命令
簡介
chmod用於修改文件的許可權。
普通用戶只能修改屬主為自己的文件,root可以修改所有文件。
語法格式
第一種語法格式表示以字元表示法設置許可權;第二種語法格式表示以八進位表示法設置許可權;第三種語法格式表示參照某個文件設置許可權。
在選項當中,基本只會用到遞歸-R, --recursive(用於修改目錄及其子文件的許可權)和--reference=RFILE(見下文“許可權複製”)
chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --reference=RFILE FILE...
描述
chmod可以根據mode來修改文件的許可權,文件的許可權也叫作mode bits。mode可以是以字元表示法修改許可權或者是以八進位表示法來重置新的許可權。
字元表示法
字元表示法的格式如下。
[ugoa...][[+-=][perms...]...]
ugoa分別表示所有者(user)、所有組(group)、其他(other)和所有人(all)。
perms是具體的許可權,可以為空(表示無許可權)或者為rwxXst中的任意字母。Xst是特殊的許可權,目前暫時不做介紹。
[root@C7 ~]# ls -l mode.txt -rw-r--r-- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod u+x mode.txt [root@C7 ~]# ls -l mode.txt -rwxr--r-- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod o-r mode.txt [root@C7 ~]# ls -l mode.txt -rwxr----- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod g=rw mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw---- 1 root root 0 Dec 7 16:58 mode.txt
[root@C7 ~]# ls -l mode.txt -rwxrw-rw- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod a= mode.txt [root@C7 ~]# ls -l mode.txt ---------- 1 root root 0 Dec 7 16:58 mode.txt
也可以是ugo的任意字母。表示參照其他成員配置許可權。
[root@C7 ~]# ls -l mode.txt -rwxrw---- 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# chmod o=g mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw-rw- 1 root root 0 Dec 7 16:58 mode.txt
字元表示法可以有多個,使用逗號隔開。
[root@C7 ~]# chmod u=rwx,g=rw,o=r mode.txt [root@C7 ~]# ls -l mode.txt -rwxrw-r-- 1 root root 0 Dec 7 16:58 mode.txt
如果省略了ugoa的話,那麼預設表示a,但是如此設置許可權會受到umask的影響。umask後面會做介紹。
[root@C7 ~]# chmod =rwx mode.txt [root@C7 ~]# ls -l mode.txt -rwxr-xr-x 1 root root 0 Dec 7 16:58 mode.txt [root@C7 ~]# umask 0022
操作符“+”表示增加許可權;操作符“-”表示減少許可權;操作符“=”表示增加許可權並刪除沒提到的許可權,除了目錄的SUID和SGID。
八進位表示法
八進位表示法由4位八進位組成,第一位是特殊許可權位表示SUID(4)、SGID(2)或者sticky(1),第二位表示用戶,第三位表示組,第四位表示其他。
不一定要4位都寫出來,省略的話表示前置0。例如
chmod 755 等價於 chmod 0755
chmod 7 不等價於 chmod 0700 而等價於 chmod 0007
chmod與字元鏈接文件
chmod不會修改字元鏈接文件的許可權(因為chmod的系統調用無法做到),而是修改字元鏈接文件所指向的文件的許可權。但是,如果是遞歸修改目錄的話,那麼就會忽略掉目錄下字元連接文件了。
許可權複製
chmod可以以某個文件作為參照物來設置許可權,類似於將某個文件的許可權複製到一個或多個文件上。
[root@C7 ~]# ls -l {1,2,3,refer}.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 1.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 2.txt -rw-r--r-- 1 root root 0 Dec 10 15:23 3.txt -rwxrwxrwx 1 root root 0 Dec 10 15:22 refer.txt [root@C7 ~]# chmod --reference=refer.txt {1,2,3}.txt [root@C7 ~]# ls -l {1,2,3,refer}.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 1.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 2.txt -rwxrwxrwx 1 root root 0 Dec 10 15:23 3.txt -rwxrwxrwx 1 root root 0 Dec 10 15:22 refer.txt [root@C7 ~]# ls -ld testdir drwxr-xr-x 2 root root 6 Dec 10 15:24 testdir [root@C7 ~]# chmod --reference=refer.txt testdir [root@C7 ~]# ls -ld testdir drwxrwxrwx 2 root root 6 Dec 10 15:24 testdir
chown命令
簡介
用於修改文件的屬主/所有者(owner)和屬組/所有組(group),屬主和屬組合起來也稱為ownership。
語法格式
chown [OPTION]... [OWNER][:[GROUP]] FILE... chown [OPTION]... --reference=RFILE FILE...
第一種格式有以下幾種情況:
- 僅修改文件的屬主。
# chown OWNER FILE
- 修改文件的屬主和屬組。
# chown OWNER:GROUP FILE
- 修改文件的屬主和屬組,且屬組為屬主的GID。
# chown OWNER: FILE
- 僅修改文件的屬組,效果等同於chgrp,因此本博文不會討論chgrp命令。
# chown :GROUP FILE
常用選項
--from=[CURRENT_OWNER]:[CURRENT_GROUP]:當且僅當文件的ownership為這裡指定的屬主和屬組的時候,才會修改文件的許可權;如果屬主和屬組都指定了,那麼必須同時滿足才會修改;如果省略了屬主或者屬組,那麼只要滿足了給出的屬主或者屬組,就算會發生修改操作。這個選項在結合-R選項遞歸修改的時候比較有用。
[root@C7 ~]# ls -l 1.txt -rwxrwxrwx 1 test03 test03 0 Dec 10 15:23 1.txt [root@C7 ~]# chown --from=:test03 test01:test01 1.txt [root@C7 ~]# ls -l 1.txt -rwxrwxrwx 1 test01 test01 0 Dec 10 15:23 1.txt
-H、-L和-P:影響當遞歸一個目錄的時候,如何處理字元鏈接文件的。
umask
在Linux上,當用戶創建文件或者目錄的時候,會自動為文件或者目錄創建一個許可權。
[root@C7 ~]# touch 1.txt [root@C7 ~]# ls -l 1.txt -rw-r--r-- 1 root root 0 Dec 10 16:54 1.txt [root@C7 ~]# mkdir umask_dir [root@C7 ~]# ls -ld umask_dir drwxr-xr-x 2 root root 6 Dec 10 16:55 umask_dir
這種機制,我們就叫做Linux的umask。
umask中的u表示user,mask表示掩碼。也就是說umask設置的是創建文件或者目錄的時候,應該被剝奪的許可權。
umask是shell的內置命令,語法格式如下:
umask [-p] [-S] [mode]
不帶選項和參數的時候,是以八進位表示法顯示當前shell中的umask值。
-p和-S也是用於顯示umask的值的。前者的輸出格式可用於再次作為命令執行,後者的輸出格式是字元表示法。
如果加上-S選項以字元表示法顯示的話,那麼顯示的就是ugo目前所具備的許可權,而不是被拿掉的許可權了。
[root@C7 ~]# umask 0022 [root@C7 ~]# umask -p umask 0022 [root@C7 ~]# umask -S u=rwx,g=rx,o=rx
只有當需要重新設置umask的時候,才會帶上mode參數。
[root@C7 ~]# umask 0022 [root@C7 ~]# umask 027 [root@C7 ~]# umask 0027
在Linux中,預設不允許文件具備執行的許可權。因此,對於文件的預設創建許可權為“666-umask”,對於目錄的預設創建許可權為“777-umask”。
即便我們設置的umask剛好可以使得文件具備可執行許可權,也是不行的。許可權具體是如何計算的,可以看一下參考資料,涉及一些數學知識,我不太懂。
[root@C7 ~]# umask 023 [root@C7 ~]# touch umask.txt [root@C7 ~]# ls -l umask.txt -rw-r--r-- 1 root root 0 Dec 11 16:50 umask.txt
在Linux中,umask只會影響新建文件的ugo的rwx許可權,不會影響新建文件的suid、sgid和sticky許可權。因此umask中的第一個0表示的是八進位,可以省略,而不是表示用來設置suid、sgid和sticky許可權。
[root@C7 ~]# umask 7022 -bash: umask: 7022: octal number out of range [root@C7 ~]# umask 1022 -bash: umask: 1022: octal number out of range
在當前會話中設置的umask只會在當前的shell(bash)進程中有效,退出會話後就無效了。
要想使其永久生效的話,一般是寫入相關的配置文件中。