一言不合就改爲 777 權限?會出人命的!

最近和幾個朋友開發項目,期間使用了一臺服務器跑模型,這臺服務器是多人公用的,不少人都在上面有本身的帳號,互不干涉內政,一切看起來十分井井有理。mysql

近期,這個服務器上剛掛載了一塊新硬盤,是一位朋友使用 root 帳號掛載的,而後將磁盤映射到某個文件夾下。然而掛載好了以後發現使用普通帳號沒有權限在文件夾下操做,沒法建立文件,因而他乾脆就直接把文件夾權限改爲 777 了。我心想,這還了得,改爲 777 了,其餘人在裏面亂改咋辦?會出人命的!
nginx

因此,我就這件事詳細梳理了一下 Linux 下的用戶、用戶組、文件權限等基本知識,看完這些,之後不要動不動就把文件夾改爲 777 權限了。sql

基本操做

首選咱們梳理一下 Linux 下的用戶、用戶組、文件權限等基本知識,而後後面經過一個案例來實際演示一下權限設置的一些操做。ubuntu

首先 Linux 系統中,是有用戶和用戶組的概念的,用戶就是身份的象徵,咱們必須以某一個用戶身份來操做一個系統,實際上這就對應着咱們登陸系統時的帳號。而用戶組就是一些用戶的集合,咱們能夠經過用戶組來劃分和統一管理某些用戶。安全

好比我要在微信發一條朋友圈,我只想給個人親人們看,難道我發的時候還要一個個去勾選全部的人?這未免太麻煩了。爲了解決這問題,微信裏面就有了標籤的概念,咱們能夠提早給好友以標籤的方式分類,發的時候直接勾選某個標籤就行了,簡單高效。實際上這就是用戶組的概念,咱們能夠將某些人進行分組和歸類,到時候只須要指定類別或組別就能夠了,而不用一個我的去對號入座,從而節省了大量時間。bash

在 Linux 中,一個用戶是能夠屬於多個組的,一個組也是能夠包含多個用戶的,下面我以一臺 Ubuntu Linux 爲例來演示一下相關的命令和操做。服務器

用戶和用戶組

首先查看全部用戶,命令以下:微信

cut -d':' -f 1 /etc/passwd
複製代碼

結果:網絡

root
daemon
bin
sys
...
ubuntu
mysql
複製代碼

這裏一行就是一個用戶名,因爲太多,部分就省略了,實際上這個命令就是從密碼文件中把用戶名單獨列出來了。oop

而後查看全部用戶組,命令也是相似的:

cut -d':' -f 1 /etc/group
複製代碼

結果:

root
daemon
bin
sys
...
ubuntu
mysql
複製代碼

結果基本是相似的,由於每一個用戶在被建立的時候都會自動建立一個同名的組做爲其默認的用戶組。

這裏我是使用 ubuntu 這個帳號來登陸的,下面我來看下 ubuntu 這個帳號是屬於哪些組。

查看一個用戶所屬組的命令格式以下:

gorups <username>
複製代碼

這裏就是 groups 命令加上用戶名就能查看該用戶名所屬的組了,若是不加用戶名的話就默認是當前用戶。

例如查看 ubuntu 這個用戶所屬於的組,命令以下:

groups ubuntu
複製代碼

結果:

ubuntu : ubuntu adm cdrom sudo dip plugdev lxd lpadmin sambashare
複製代碼

還很多,這個用戶被分配到了不少組下,好比同名的組 ubuntu,還有 sudo 組,另外還有一些其餘的組。

其中 sudo 組比較特殊,若是被分到了這個組裏面就表明該帳號擁有 root 權限,可使用 sudo 命令。

瞭解了怎樣查看用戶所屬的組,咱們也應該反過來了解如何查看一個用戶組裏麪包含哪些用戶啊。

查看某個用戶組下全部用戶命令以下:

members <group>
複製代碼

不過這個命令不是自帶的,須要額外安裝 members 包,命令以下:

sudo apt-get install members
複製代碼

例如查看 sudo 用戶組下的全部用戶,即擁有 root 權限的用戶:

members sudo
複製代碼

結果:

ubuntu hadoop
複製代碼

能夠看到擁有 root 權限的用戶有兩個,ubuntu 和 hadoop,固然不一樣的機器結果確定是不同的。

接下來介紹一個比較有用的命令,就是 id 命令,它能夠用來查看用戶的所屬組別,格式以下:

id <username>
複製代碼

例如查看 ubuntu 用戶的信息,就是這樣:

id ubuntu
複製代碼

結果:

uid=500(ubuntu) gid=500(ubuntu) groups=500(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)
複製代碼

這裏有一個 gid,做爲主工做組,後面還有個 groups,它列出了用戶所在的全部組。主工做組只有一個,然後者的數量則不限。能夠看到用戶組的結果和使用 groups 命令看到的結果是一致的。

接下來咱們再來了解一下如何建立一個用戶和怎樣爲用戶分配組別。

添加一個用戶命令格式以下:

sudo adduser <username>
複製代碼

好比我要添加一個用戶 cqc,命令就能夠這麼寫:

sudo adduser cqc
複製代碼

這裏使用的命令前面都帶有 sudo,由於畢竟是系統級別的操做。

添加一個組的命令格式以下:

sudo groupadd <group>
複製代碼

格式是相似的,後面跟一個組的名稱就能夠了,例如我要爲個人實驗室建立一個用戶組,那麼就可使用以下命令:

sudo groupadd lab
複製代碼

建立完了用戶和組,那得把它們關聯起來吧,關聯的意思就是把某個用戶加入到某個組裏面,命令格式以下:

sudo adduser <username> <group>
複製代碼

或者使用 usermod 命令:

sudo usermod -G <group> <username>
複製代碼

若是要添加多個組的話,能夠經過 -a 選項指定多個名稱:

sudo usermod -aG <group1,group2,group3..> <username>
複製代碼

例如我要將 cqc 用戶添加到 sudo 用戶組中,命令就是:

sudo adduser cqc sudo
複製代碼

或:

sudo usermod -G sudo cqc
複製代碼

這樣就爲用戶和用戶組作好關聯了。

文件權限管理

瞭解了這些以後,咱們再來了解一下文件權限的相關知識,下面咱們先隨便找一個目錄,查看一下文件的列表。

列出某個目錄下文件詳細信息的命令以下:

ll
複製代碼

或者使用:

ls -l
複製代碼

好比我這裏列出了 /etc/nginx 目錄下的文件列表:

total 80
drwxr-xr-x   7 root root  4096 Jun 21 22:16 ./
drwxr-xr-x 103 root root  4096 Sep  4 18:04 ../
drwxr-xr-x   2 root root  4096 Jul 12  2017 conf.d/
-rw-r--r--   1 root root  1077 Feb 12  2017 fastcgi.conf
-rw-r--r--   1 root root  1007 Feb 12  2017 fastcgi_params
-rw-r--r--   1 root root  2837 Feb 12  2017 koi-utf
-rw-r--r--   1 root root  2223 Feb 12  2017 koi-win
-rw-r--r--   1 root root  3957 Feb 12  2017 mime.types
-rw-r--r--   1 root root  1505 Jun 21 20:24 nginx.conf
-rw-r--r--   1 root root 12288 Jun 21 20:44 .nginx.conf.swp
-rw-r--r--   1 root root   180 Feb 12  2017 proxy_params
-rw-r--r--   1 root root   636 Feb 12  2017 scgi_params
drwxr-xr-x   2 root root  4096 Jun 21 22:42 sites-available/
drwxr-xr-x   2 root root  4096 Jun 21 19:08 sites-enabled/
drwxr-xr-x   2 root root  4096 Jun 21 19:08 snippets/
-rw-r--r--   1 root root   664 Feb 12  2017 uwsgi_params
drwxr-xr-x   2 root root  4096 Jun 22 02:44 vhosts/
-rw-r--r--   1 root root  3071 Feb 12  2017 win-utf
複製代碼

咱們注意到了每一行都是一個文件或文件夾的信息,一共包括七列:

  • 第一列是文件的權限信息

  • 第二列表示該文件夾鏈接的文件數

  • 第三列表示文件所屬用戶

  • 第四列表示文件所屬用戶組

  • 第五列表示文件大小(字節)

  • 第六列表示最後修改日期

  • 第七列表示文件名

其中第一列的文件權限信息是很是重要的,它由十個字符組成:

  • 第一個字符表明文件的類型,有三種,- 表明這是一個文件,d 表明這是一個文件夾,l 表明這是一個連接。

  • 第 2-4 個字符表明文件全部者對該文件的權限,r 就是讀,w 就是寫,x 就是執行,若是是文件夾的話,執行就意味着查看文件夾下的內容,例如 rw- 就表明文件全部者能夠對該文件進行讀取和寫入。

  • 第 5-7 個字符表明文件所屬組對該文件的權限,含義是同樣的,如 r-x 就表明該文件所屬組內的全部用戶對該文件有讀取和執行的權限。

  • 第 8-10 個字符表明是其餘用戶對該文件的權限,含義也是同樣的,如 r-- 就表明非全部者,非用戶組的用戶只擁有對該文件的讀取權限。

咱們可使用 chmod 命令來改變文件或目錄的權限,有這麼幾種用法。

一種是數字權限命名,rwx 對應一個二進制數字,如 101 就表明擁有讀取和執行的權限,而轉爲十進制的話,r 就表明 4,w 就表明 2,x 就表明 1,而後三個數字加起來就和二進制數字對應起來了。如 7=4+2+1,這就對應着 rwx;5=4+1,這就對應着 r-x。因此,相應地 777 就表明了 rwxrwxrwx,即全部者、所屬用戶組、其餘用戶對該文件都擁有讀取、寫入、執行的權限,這是至關危險的!

賦予權限的命令以下:

sudo chmod <permission> <file>
複製代碼

例如我要爲一個 file.txt 賦予 777 權限,就寫成:

sudo chmod 777 file.txt
複製代碼

另外咱們也可使用代號來賦予權限,代號有 u、g、o、a 四中,分別表明全部者權限,用戶組權限,其餘用戶權限和全部用戶權限,這些代號後面經過 + 和 - 符號來控制權限的添加和移除,再後面跟上權限類型就好,例如:

sudo chmod u-x file.txt
複製代碼

就是給全部者移除 x 權限,也就是執行權限。

sudo chmod g+w file.txt
複製代碼

就是爲用戶組添加 w 權限,即寫入權限。

另外若是是文件夾的話還能夠對文件夾進行遞歸賦權限操做,如:

sudo chmod -R 777 share
複製代碼

就是將 share 文件夾和其內全部內容都賦予 777 權限。

好,有了權限的標識,那咱們還得把用戶和用戶組與文件關聯起來啊,這裏使用的命令就是 chown 和 chgrp 命令。

命令格式以下:

sudo chown <username> <file>
sudo chgrp <group> <file>
複製代碼

例如我要將 file.txt 的全部者換成 cqc,那就可使用以下命令:

sudo chown cqc file.txt
複製代碼

若是我要將 file.txt 所屬用戶組換成 lab,那就可使用以下命令:

sudo chgrp lab file.txt
複製代碼

另外一樣可使用 -R 來進行遞歸操做,如將 share 文件夾及其內全部內容的全部者都換成 cqc,命令以下:

sudo chown -R cqc share/
複製代碼

好,瞭解了 chown、chgrp、chmod 以後,咱們就能夠靈活地對文件權限進行控制了。

實戰演示

可能上面提及來有點抽象,下面咱們以一個實例來演示一下權限控制的流程,經過這個流程,相信理解以上的命令都不在話下了。

首先狀況是這樣的,我要在某臺主機上共享一些文件給我實驗室的人,但這臺主機上還有其餘非實驗室的人在使用,我只想讓實驗室的人查看和修改這些文件,其餘人不行。

另外我本身的帳號要有最高權限來管理這些文件的共享權限,即要有 root 權限。

如今我已經登陸了一個 ubuntu 的帳號,是系統初始化的,擁有 root 權限。

下面我就模擬建立三個帳號和一個用戶組,來獲得以下效果:

  • 帳號 cqc 是我本身使用的帳號,擁有最高權限,能夠自由調整文件權限信息,能夠自由爲某個用戶分配用戶組。

  • 帳號 lbd 是我實驗室的人員,沒有 root 權限,但能查看和修改我共享的文件。

  • 帳號 slb 不是我實驗室的人員,沒有 root 權限,也不能修改我共享的文件。

建立本身的帳戶

首先我先爲本身建立一個帳戶,添加一個 cqc 的用戶:

sudo adduser cqc
複製代碼

運行以後會提示輸入密碼和其餘信息:

Adding user `cqc' ... Adding new group `cqc' (1002) ...
Adding new user `cqc' (1002) with group `cqc' ...
Creating home directory `/home/cqc' ... Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for cqc
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] 
複製代碼

這時候發現一個同名的組就被建立了,查看下 cqc 所在的組:

groups cqc
複製代碼

結果以下:

cqc : cqc
複製代碼

再用 id 命令查看下信息:

id cqc
複製代碼

結果以下:

uid=1002(cqc) gid=1002(cqc) groups=1002(cqc)
複製代碼

能夠看到當前 cqc 只屬於 cqc 用戶組。

接下來咱們建立一個用戶組,叫作 lab,來標明個人實驗室,命令以下:

sudo groupadd lab
複製代碼

而後查看下用戶組裏面的成員:

members lab
複製代碼

沒有任何結果,說明咱們建立了一個空的組,沒有任何成員。

而後咱們將剛纔建立的 cqc 加入到該組中,由於我本身也屬於該實驗室,確定也要加進來,命令以下:

sudo adduser cqc lab
複製代碼

結果:

Adding user `cqc' to group `lab' ...
Adding user cqc to group lab
Done.
複製代碼

而後查看下組內成員:

members lab
複製代碼

結果:

cqc
複製代碼

這樣 lab 組內就有了 cqc 這個用戶了。

別忘了 cqc 還須要擁有 root 權限,因此咱們還須要將 cqc 添加到 sudo 組內,命令以下:

sudo adduser cqc sudo
複製代碼

結果:

Adding user `cqc' to group `sudo' ...
Adding user cqc to group sudo
Done.
複製代碼

這樣就成功加入到 sudo 組了,cqc 也就是個人帳戶就可使用 sudo 命令了。

查看下用戶狀態:

id cqc
複製代碼

結果以下:

uid=1002(cqc) gid=1002(cqc) groups=1002(cqc),27(sudo),1003(lab)
複製代碼

這樣 cqc 就屬於三個用戶組了,既是實驗室成員,又擁有 root 權限。

上面的分配用戶組的命令咱們也可使用 usermod 來實現:

sudo usermod -aG sudo,lab cqc
複製代碼

這樣就添加到多個組了。

添加實驗室用戶

接下來,再添加實驗室的另一我的員 lbd,而後將其添加到 lab 組中,流程是相似的,命令以下:

sudo adduser lbd
sudo adduser lbd lab
複製代碼

運行完畢以後,id 命令查看其信息:

id lbd
複製代碼

結果以下:

uid=1004(lbd) gid=1005(lbd) groups=1005(lbd),1003(lab)
複製代碼

這樣就成功建立 lbd,並將其添加到實驗室 lab 組了。

添加非實驗室用戶

最後另外添加一個用戶 slb,非實驗室成員,只建立帳戶就行了,命令以下:

sudo adduser slb
複製代碼

可是咱們不把他加入 lab 組中。

查看他的狀態:

id slb
複製代碼

結果以下:

uid=1003(slb) gid=1004(slb) groups=1004(slb)
複製代碼

因此三人的狀態是這樣的:

id cqc
uid=1002(cqc) gid=1002(cqc) groups=1002(cqc),27(sudo),1003(lab)
id lbd
uid=1004(lbd) gid=1005(lbd) groups=1005(lbd),1003(lab)
id slb
uid=1003(slb) gid=1004(slb) groups=1004(slb)
複製代碼

文件權限分配

接下來咱們建立一個文件夾來共享實驗室數據,放在 /srv 目錄下。而後調用 mkdir 命令建立名稱爲 share 的文件夾,命令以下:

cd /srv
sudo mkdir share
複製代碼

注意這裏我仍是使用 ubuntu 帳戶來建立的。

先看下當前目錄權限:

ls -l
複製代碼

結果以下:

total 12
drwxr-xr-x  3 root root 4096 Sep  4 18:17 ./
drwxr-xr-x 24 root root 4096 Sep  4 18:17 ../
drwxr-xr-x  2 root root 4096 Sep  4 18:17 share/
複製代碼

能夠看到 share 文件的全部者是 root,用戶組也是 root,權限是 755,即只有 root 擁有修改權限,其餘的只有讀取和執行權限。

而後進入 share 文件夾建立一個 names.txt:

cd share
sudo vi names.txt
複製代碼

編輯內容以下:

cqc
lbd
複製代碼

保存完畢以後,這時查看一下文件權限,以下:

-rw-r----- 1 root root    8 Sep  4 20:00 names.txt
複製代碼

權限是 640,這代表只有全部者 root 擁有寫入的權限,所在組 其 組只有讀的權限。

這時開啓另一個終端,登陸 cqc 帳號,其實是不能查看和修改任何該文件的內容的,下面的修改和讀取命令都會提示權限不夠:

vi names.txt
cat names.txt
複製代碼

爲何呢?由於該文件是剛纔由 ubuntu 帳號使用 sudo 命令建立的,所以文件的全部者是 root,並非 cqc,所以即便文件的權限是 640,那也就不能使用文件全部者的權限,並且 cqc 也不屬於 root 組,因此也不能使用文件組的權限了,所以什麼都看不了,什麼都改不了。

但 cqc 屬於 sudo 組啊,能夠利用 sudo 命令臨時獲取 root 權限,臨時以 root 的身份來操做該文件,這樣就能夠來查看和修改文件了,所以下面的命令是有效的:

sudo vi names.txt
sudo cat names.txt
複製代碼

但這樣仍是須要使用 sudo 才能修改,很不方便。

這時若是咱們把文件的全部者改爲 cqc,狀況那就不同了。

使用 ubuntu 帳號,對 names.txt 更改其全部者爲 cqc,改的命令以下:

sudo chown cqc names.txt
複製代碼

這時查看下文件信息:

-rw-r----- 1 cqc  root    8 Sep  4 20:29 names.txt
複製代碼

能夠看到全部者信息已經變成了 cqc,這樣 cqc 帳號再直接查看和修改,那就能夠了,再也不須要 sudo 命令:

vi names.txt
cat names.txt
複製代碼

這樣就不會有權限提示,固然加上 sudo 更是沒問題。

好,接下來 lbd 呢?咱們登陸試試修改。

首先當前的文件狀態是這樣的:

-rw-r----- 1 cqc  root    8 Sep  4 20:31 names.txt
複製代碼

lbd 不是全部者了,所以前面的 rw- 權限是沒什麼用的,但他屬於 lab 組,而該文件對於用戶組的權限是 r--,也就是讀取權限。

咱們使用 lbd 帳號來嘗試看下文件的內容:

cat names.txt 
cat: names.txt: Permission denied
複製代碼

很遺憾,又沒有權限。由於什麼?由於這個文件的用戶組並非 lab 啊,而 lbd 這個用戶又不屬於 root 組,因此沒有任何權限。

那咋辦?將文件的用戶組改爲 lab 就行了,使用 ubuntu 帳號或 cqc 帳號來操做:

sudo chgrp lab names.txt
複製代碼

這樣就成功將文件所屬用戶組改爲 lab 了,接下來再使用 lbd 帳號查看下文件內容:

cat names.txt
複製代碼

就成功讀取了。

然而 lbd 如今是沒有寫入權限的,由於對於用戶組來講,該文件的權限是 r--,若是要獲取寫入權限,咱們可使用以下命令:

sudo chmod g+w names.txt
複製代碼

或:

sudo chmod 660 names.txt
複製代碼

這樣就至關於賦予了 rw- 權限,下面咱們再使用 lbd 帳號嘗試修改這個文件:

vi names.txt
複製代碼

就沒問題了。

那麼對於非實驗室同窗 slb 呢?它沒有任何權限,咱們登陸 slb 帳號嘗試修改和讀取該文件:

cat names.txt
vi names.txt
複製代碼

均無權限。

因此說,這樣咱們就成功爲實驗室的人員賦予了權限,而非實驗室的人則沒有任何權限。

若是我要爲 slb 賦予讀取權限咋辦呢?很簡單,添加一下就行了:

sudo chmod o+r names.txt
複製代碼

這就是爲其餘用戶添加了讀取權限。這時 slb 就能夠讀取文件,但不能修改文件,也是比較安全的。

好,若是個人文件很是多呢?好比十幾二十個,都放在 share 文件夾內,那不能一個個進行權限設置吧?

這時候咱們只須要針對文件夾進行操做便可,下面的命令就能夠爲 share 文件夾賦予 775 權限,即全部者 cqc 和所在組 lab 可對其進行查看和修改,其餘的人只能看不能改:

sudo chmod -R 775 share/
sudo chown -R cqc share/
sudo chgrp -R lab share/
複製代碼

注意文件夾通常都會賦予 x 權限,否則連進入文件夾的權限都沒有。這也就是文件夾通常會賦予 77五、755,而文件會賦予 66四、600、64四、640 的緣由了。

賦予 775 權限以後,share 的權限就變成了:

drwxrwxr-x  2 cqc  lab  4096 Sep  4 20:31 share/
複製代碼

這樣其餘用戶就只能看,不能改,這樣普通文件就沒什麼問題了。

如文件夾內包含了可執行文件,還能夠單獨爲其餘用戶針對可執行文件去除 x 權限,如去除 Python 文件的可執行權限:

sudo chmod o-x *.py
複製代碼

好了,到如今爲止,咱們就駕輕就熟地完成了權限控制了!

相信若是你耐心看完的話,什麼用戶管理、權限管理,都不在話下!



你們好,我是崔慶才,微軟中國大數據工程師,在微軟小冰部門。固然這是個人職業,我平時還會從事網絡爬蟲、Web開發、深度學習等方向的研究和開發工做。

我我的比較喜歡總結和分享,此次很榮幸在掘金的平臺把本身的爬蟲相關經驗分享給你們,包括爬取、解析、防反爬、加速等等部分,但願你們聽完以後有所收穫。

本週日(10月21日)我會作客掘金Bilibili直播間爲你們作一場《健壯高效的網絡爬蟲》的直播【網頁連接】。直播中我也會抽出 5 名小夥伴贈送各贈送一本《Python3網絡爬蟲開發實戰》書籍一本,但願你們能夠支持。

相關文章
相關標籤/搜索