Linux 文件和文件夾的操做權限

因爲 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(可讀,可執行,沒有可讀)的操做權限。

特殊權限SUIDSGIDSticky

在 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):

對於可執行文件,SGIDSUID相似,引起的進程的全部組是程序文件所屬的組。對於目錄,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 系統上雖然可使用useraddadduser來建立用戶,可是這兩個命令是有區別的。

    1. 使用useradd時,若是後面不添加任何參數選項,例如:$sudo useradd test建立出來的用戶將是默認「三無」用戶:一無Home Directory,二無密碼,三無系統Shell。

    2. 使用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 用戶操做權限,安全就掌握在手中。

    參考

    原文連接

    相關文章
    相關標籤/搜索