因爲 linux 是多用戶操做系統,因此基於安全的考慮,須要具有保障我的隱私和系統安全的機制。所以在使用 linux 系統的時候,常常會出現權限的問題(好比: 刪除文件、安裝軟件、運行應用等等),期初遇到這些問題的時候,大部分都使用sudo
或者是sudo chmod 777 file
(後面會講解這個命令)來解決的。雖然這種方式能夠解決問題,可是這樣是不安全的,特別是在服務器上操做的時候,由於不是全部的文件和文件夾均可以被其它用戶操做的,不是全部的用戶都有root
權限的,不是全部的應用均可以用root
用戶啓動的。那麼咱們要如何正確的處理這些權限問題呢?那就讓咱們來學習一下 linux 權限相關的知識。html
要肯定一個用戶對某個文件或文件夾是否具備相應的操做權限,先要明確該用戶與文件或文件夾之間的關係。在 linux 系統中,定義了以下三種關係:linux
文件或文件夾的全部者 (owner):文件或文件夾的擁有者,開始建立文件或文件夾時爲建立者。git
組 (group):文件或文件夾所屬的組, 開始建立文件或文件夾時爲建立者的所屬的組。github
其餘人 (other):除了文件或文件夾的全部者和文件或文件夾所屬的組的其餘成員,剩下的 linux 的用戶。算法
由於在 linux 下的文件和文件夾都有讀取(r)
、寫入(w)
、執行(x)
的操做,因此上面描述的每種關係的用戶分別均可以賦予這些操做權限。操做權限介紹:docker
權限 | 簡寫 | 對普通文件的做用 | 對文件夾的做用 |
---|---|---|---|
讀取 | r | 查看文件內容 | 列出文件夾中的文件(ls) |
寫入 | w | 修改文件內容 | 在文件夾中刪除、添加或重命名文件(夾) |
執行 | x | 文件能夠做爲程序執行 | cd 到文件夾 |
在 linux 使用ls -la
命令能夠查看文件夾內文件的屬性,下面是我電腦上某個文件夾下文件的屬性:shell
$ ls -la drwxr-xr-x 14 root root 4096 Apr 3 18:47 . drwxr-xr-x 23 root root 4096 Mar 2 05:48 .. drwxr-xr-x 2 root root 4096 Apr 3 07:44 backups drwxr-xr-x 17 root root 4096 Jul 22 2014 cache drwxr-xr-x 2 root root 4096 Mar 2 04:26 docker-registry lrwxrwxrwx 1 root root 9 Feb 25 13:31 lock -> /run/lock drwxrwxr-x 15 root syslog 4096 Apr 3 07:44 log -rw-r--r-- 1 root root 0 Apr 3 18:47 test
上面的有九列數據,第一列數據表示和文件或文件夾相應關係用戶的操做權限,第二列表示文件夾內文件和文件夾的總數量(包括文件夾自己),第三列表示文件夾或文件的擁有者,第四列表示文件或文件夾的所屬的組,第五列表示文件或文件夾的大小,第6、7、八列表示文件或文件夾最後被修改的時間,第九列文件或文件夾的名字。安全
接下主要分析第一列的數據,在上面的信息中倒數第二行drwxrwxr-x
,從左到右第一個字母表示文件系統對象的類別,這裏d
表示爲目錄(文件夾)。其它文件系統對象:bash
-
(常規文件)、d
(目錄)、l
(符號連接)、c
(字符特殊設備)、b
(模塊特殊設備)、p
(FIFO)、s
(套接字)服務器
drwxrwxr-x
除出去第一個字母d
後的rwxrwxr-x
表示的是三種用戶關係對文件或文件夾的操做權限。從左到右每三個一組,依次表示全部者權限、組權限、其餘用戶權限。每組的順序均爲rwx
,若是用戶有相應的操做權限就用相應的字母表示,若是不具備相應的操做權限就用-
表示。好比: rwxrwxr-x
表示文件或文件夾的全部者具備rwx
(可讀,可寫,可執行)的操做權限,組用戶也具備rwx
(可讀,可寫,可執行)的權限,其餘用戶具備r-x
(可讀,可執行,沒有可讀)的操做權限。
SUID
、SGID
、Sticky
在 linux 系統中還有三種與用戶身份無關的三個文件權限屬性。即SUID、SGID和Sticky
。
SUID(Set User ID, 4):
該屬性只對有執行權限的文件有效,對目錄無效。執行具備
SUID
權限的程序時,引起的進程的全部者是程序文件的全部者,而不是啓動程序的用戶(除非兩者是同一我的)。好比,若是一個程序的全部者是root
且具備SUID
屬性,一個普通用戶執行此程序時,如同root
執行此程序同樣。(請注意該屬性對Shell
腳本程序無效)該屬性爲一些特殊程序(如lpr)的啓動帶來了方便。但有時也帶來了安全隱患:好比一個具備SUID
屬性的程序若是在執行時運行了一個shell
,那麼用戶能夠籍此獲得系統的最高權限。SUID
可用s
表示,如:
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 47032 Feb 16 2014 /usr/bin/passwd
SGID(Set Group ID, 4):
對於可執行文件,
SGID
與SUID
相似,引起的進程的全部組是程序文件所屬的組。對於目錄,SGID
屬性會使目錄中新建文件的所屬組與該目錄相同。SGID
也能夠用s表示,如:
$ ls -l /var drwxrwsr-x 2 root staff 4096 Apr 10 2014 local drwxrwxr-x 15 root syslog 4096 Apr 4 19:57 log
Sticky, 1:
僅對目錄有效。帶
sticky
屬性的目錄下的文件或目錄能夠被其擁有者刪除或更名。常利用sticky
屬性建立這樣的目錄:組用戶能夠在此目錄中建立新文件、修改文件內容,但只有文件全部者才能對本身的文件進行刪除或更名。如系統中的/tmp
文件夾。在屬性字符串中,一般用t表示。
$ ls -l / drwxrwxrwt 8 root root 4096 Apr 4 23:57 tmp
在 linux 系統中,可使用chmod
命令來修改文件或文件夾對應用戶的操做權限,chmod
命令也有兩種方式修改,一種是使用表明相應操做權限的字母簡寫表示,另外一種是使用表明相應操做權限的數字表示。
使用簡寫字母
chmod
語法參數格式: ugoa[rwxst]
第一個字符是u、g、 o 或 a 中的一個(分別表示用戶、組、其餘人和全部人)。還能夠選擇添加(+)、刪除(-)或設置(=)各類不一樣權限。
給文件或文件夾try
的擁有者加可執行權限
$ sudo chmod u+x try
給文件或文件夾try
的擁有者和組成員加可讀可寫權限
$ sudo chmod ug+rw try
給文件或文件夾try
的擁有者和組成員除去可寫權限
$ sudo chmod ug-r try
使用數字表示(八進制數)
爲了簡化表述,也可以使用八進制數來表示權限。即用一個四位八進制數來表示,其中最高位表示特殊權限,隨後的三位依次是全部者權限、組權限和其餘人權限。每個八進制位的權限數值是文件具備的相應權限所對應的數值以後,如:
0755=rwxr-xr-x=0(4+2+1)(4+0+1)(4+0+1)
數值權限的算法,好比
rw-
其實就是110
的二進制,也就是0*2^0 + 1*2^1 + 1*2^2 = 6
。有相應的權限就用1
表示,沒有相應的權限就用0
表示。不過這種算法特殊權限不包含在內。
給文件或文件夾try
的擁有者加rwx
權限,組用戶加r-x
權限,其餘用戶r--
權限
$ sudo chmod 0754 try
chmod
命令也能夠遞歸的修改文件夾下全部的文件的權限,如給 try 文件夾下得全部文件加上 0755 權限
$ sudo chmod -R 0755 try
批量只修改文件或文件夾權限
$ find -type d|xargs chmod 745 // 只修改文件夾權限 $ find -type f|xargs chmod 644 // 只修改文件權限 // 或者 $ chmod 745 `find 路徑 -type d` // 只修改文件夾權限 $ chmod 644 `find 路徑 -type f` // 只修改文件權限
相應權限的數值:
rwx
(7)、rw-
(6)、r-x
(5)、r--
(4)、--wx
(3)、-w-
(2)、--x
(1)、---
(0)suid: 符號
s
(4)sgid: 符號
s
(2)sticky: 符號
t
(1)
使用chown
能夠修改文件或文件夾的擁有者和所屬的組。
將文件或文件夾try
的擁有者修改爲aikin
,所屬的組修改爲adm
$ sudo chown aikin:adm try
和chmod
同樣,-R
參數能夠起到遞歸的做用
$ sudo chown -R aikin:adm try
組相關操做:
建立一個try
組
$ sudo groupadd try
修改try
組的名字爲rename-try
$ sudo groupadd -n rename-try try
修改try
組的名字爲rename-try
$ sudo groupadd -n rename-try try
刪除try2
組
$ sudo groupdel try2
查看全部組
$ sudo cat /etc/group
用戶相關操做:
建立用戶test
在 linux 系統上雖然可使用
useradd
或adduser
來建立用戶,可是這兩個命令是有區別的。
使用
useradd
時,若是後面不添加任何參數選項,例如:$sudo useradd test
建立出來的用戶將是默認「三無」用戶:一無Home Directory,二無密碼,三無系統Shell。使用
adduser
時,建立用戶的過程更像是一種人機對話,系統會提示你輸入各類信息,而後會根據這些信息幫你建立新用戶。
下面建立用戶使用的是adduser
命令:
$ sudo adduser test Adding user `test' ... Adding new group `test' (1002) ... Adding new user `test' (1001) with group `test' ... Creating home directory `/home/test' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for test Enter the new value, or press ENTER for the default Full Name []: test Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y
修改用戶
$ sudo passwd test // 修改用戶密碼 $ sudo usermod -d /home/test -G try2 test // 將test用戶的登陸目錄改爲/home/test,並加入 try 組,注意這裏是大 G。 $ sudo gpasswd -a test try // 將用戶 test 加入到 try2 組。 $ sudo gpasswd -d test try2 // 將用戶 test 從 try 組中移除
刪除用戶test
$ sudo userdel test
查看全部用戶
$ cut -d : -f 1 /etc/passwd // 或者 $ cat /etc/passwd |awk -F \: '{print $1}'
瞭解 linux 用戶操做權限,安全就掌握在手中。