linux中的權限
前言
最近使用ansible
搭建了mongo的replica set
。發現很多次的失敗都是文件權限不對造成的。那么就總結下吧。
數字權限
數字權限,我們常見的是三位的數字表示的權限,當然四位的我們也難免會遇到,接下我們看下他們直接的區別。
三位數字權限
linux中的文件權限分為讀、寫、執行.對應的字母就是r、w、x.
讀(r)
Read對文件而言,具有讀取文件內容的權限;對目錄來說,具有瀏覽該目錄信息的權限。
寫(w)
Write對文件而言,具有修改文件內容的權限;對於目錄來說,具有刪除移動目錄內文件的權限。
執行(x)
Execute對文件而言,具有執行文件的權限;對目錄來說,具有進入目錄的權限。
無權限(-)
-
表示不具有該項選項
linux下的權限粒度有 擁有者
、群組
、其他組
三種。每個文件都可以針對這三個粒度,設置不同的(r,w,x)讀寫執行權限。通常情況下,一個文件只能歸屬於一個用戶和組, 如果其它的用戶想有這個文件的權限,則可以將該用戶加入具備權限的群組,一個用戶可以同時歸屬於多個組。
Linux上通常使用chmod命令對文件的權限進行設置和更改。
我們規定數字4、2、1表示讀、寫、執行的權限。即r=4,w=2,x=1。
栗如:
rwx = 4 + 2 + 1 = 7
rw = 4 + 2 = 6
rx = 4 +1 = 5
即
若要同時設置 rwx (可讀寫運行) 權限則將該權限位 設置 為 4 + 2 + 1 = 7
若要同時設置 rw- (可讀寫不可運行)權限則將該權限位 設置 為 4 + 2 = 6
若要同時設置 r-x (可讀可運行不可寫)權限則將該權限位 設置 為 4 +1 = 5
三位數字權限的轉換
讀,寫,執行對應的權限二進制表示為
r-- = 100
-w- = 010
--x = 001
--- = 000
將二進制轉換成十進制就是
r-- = 100 4
-w- = 010 2
--x = 001 1
--- = 000 0
故
rwx 權限就是 4 + 2 + 1 = 7
rw- 權限就是 4 + 2 = 6
...
如何設置權限
每個文件都有擁有者
、群組
、其他組
三種權限的粒度。我們在設置權限的時候也是針對這幾個粒度進行配置的。即我們可以使用三個數字來配置這三個權限粒度的權限。
chmod
file...
其中
a,b,c各為一個數字,分別代表User、Group、及Other的權限。
相當於簡化版的
chmod u=權限,g=權限,o=權限 file...
而此處的權限將用8進制的數字來表示User、Group、及Other的讀、寫、執行權限
栗子:
設置所有人可以讀寫及執行
chmod 777 file (等價於 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)
設置擁有者可讀寫,其他人不可讀寫執行
chmod 600 file (等價於 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )
一些常見的權限
-rw------- (600) 只有擁有者有讀寫權限。
-rw-r--r-- (644) 只有擁有者有讀寫權限;而屬組用戶和其他用戶只有讀權限。
-rwx------ (700) 只有擁有者有讀、寫、執行權限。
-rwxr-xr-x (755) 擁有者有讀、寫、執行權限;而屬組用戶和其他用戶只有讀、執行權限。
-rwx--x--x (711) 擁有者有讀、寫、執行權限;而屬組用戶和其他用戶只有執行權限。
-rw-rw-rw- (666) 所有用戶都有文件讀、寫權限。
-rwxrwxrwx (777) 所有用戶都有讀、寫、執行權限
最高位的含義
關於第一位最高位的解釋: 上面我們說到了權限表示中后九位的含義,剩下的第一位代表的是文件的類型,類型可以是下面幾個中的一個:
d代表的是目錄(directroy)
-代表的是文件(regular file)
s代表的是套字文件(socket)
p代表的管道文件(pipe)或命名管道文件(named pipe)
l代表的是符號鏈接文件(symbolic link)
b代表的是該文件是面向塊的設備文件(block-oriented device file)
四位數字權限
linux除了設置正常的讀寫操作權限外,還有關於一類設置也是涉及到權限,叫做Linxu附加權限。包括 SET位權限(suid,sgid)和粘滯位權限(sticky)。
SUID
讓本來沒有相應權限的用戶運行這個程序時,可以訪問他沒有權限訪問的資源。
1、SUID權限僅對二進制程序有效。
2、執行者對於該程序需要具有x的可執行權限。
3、本權限僅在執行該程序的過程中有效。
4、執行者將具有該程序擁有者的權限。
栗子:
$ ls -la /bin/su
-rwsr-xr-x 1 root root 63568 7月 16 06:52 /bin/su
對於su這個命令,擁有者是root,但是實際上是無論任何人,都可以執行,並且擁有的執行權限和root一樣。因為這個設置了SUID,並且設置了擁有者有可執行權限。從上面可以看到,不管是文件擁有者,文件擁有者所屬組,還是其他人,都是具有x權限的,所以都可以執行該程序,執行之后就將具有該程序擁有者的權限,即root的權限,這也就是su命令能夠切換用戶權限的實現原理。
SGID
和SUID類似,不過SGID是針對所屬用戶組權限的。
1、SGID對二進制程序有用;
2、程序執行者對於該程序來說需具備x的權限;
3、SGID主要用在目錄上;
SET位權限表示形式:
如果一個文件被設置了suid或sgid位,會分別表現在所有者或同組用戶的權限的可執行位上;如果文件設置了suid還設置了x(執行)位,則相應的執行位表示為s(小寫)。但是,如果沒有設置x位,它將表示為S(大寫)。如:
1、-rwsr-xr-x 表示設置了suid,且擁有者有可執行權限
2、-rwSr--r-- 表示suid被設置,但擁有者沒有可執行權限
3、-rwxr-sr-x 表示sgid被設置,且群組用戶有可執行權限
4、-rw-r-Sr-- 表示sgid被設置,但群組用戶沒有可執行權限
設置方式:
SET位權限可以可以使用chmod命令設置,栗子:
chmod u+s filename 設置suid位
chmod u-s filename 去掉suid設置
chmod g+s filename 設置sgid位
chmod g-s filename 去掉sgid設置
SBIT
目前只針對目錄有效,對於目錄的作用是:當用戶在該目錄下建立文件或目錄時,僅有自己與 root才有權力刪除。
栗子:
最具有代表的就是/tmp目錄,任何人都可以在/tmp內增加、修改文件(因為權限全是rwx),但僅有該文件/目錄建立者與 root能夠刪除自己的目錄或文件
注:SBIT對文件不起作用。
粘滯位權限表示形式:
一個文件或目錄被設置了粘滯位權限,會表現在其他組用戶的權限的可執行位上。如果文件設置了sticky
還設置了x(執行)位,其他組用戶的權限的可執行位為t(小寫)。但是,如果沒有設置x位,它將表示為T(大寫)。如:
1、-rwsr-xr-t 表示設置了粘滯位且其他用戶組有可執行權限
2、-rwSr--r-T 表示設置了粘滯位但其他用戶組沒有可執行權限
四位數字權限的轉換
同樣使用二進制表示下:
SGT分別表示SUID權限、SGID權限、和 粘滯位權限
S-- = 100
-G- = 010
--T = 001
--- = 000
和前面的rwx的轉換一樣,轉換成是十進制就是
S-- = 100 4
-G- = 010 2
--T = 001 1
--- = 000 0
- suid 位代表數字是 4
- sgid 位代表數字是 2
- sticky 位代表數字是 1
如何設置權限
使用chmod進行權限的設置
chmod <abcd> file
栗子:
使用一個栗子對比下吧
設置 netlogin 的權限為擁有者可讀寫執行,群組和其他權限為可讀可執行
chmod 755 netlogin
設置 netlogin 的權限為擁有者可讀寫執行,群組和其他權限為可讀可執行,並且設置SUID
chmod 4755 netlogin
chmod 4755與chmod 755對比多了附加權限值4,這個4表示其他用戶執行文件時,具有與所有者同樣的權限(設置了SUID)。
為什么要設置4755 而不是 755?
假設netlogin是root用戶創建的一個上網認證程序,如果其他用戶要上網也要用到這個程序,那就需要root用戶運行chmod 755 netlogin命令使其他用戶也能運行netlogin。但假如netlogin執行時需要訪問一些只有root用戶才有權訪問的文件,那么其他用戶執行netlogin時可能因為權限不夠還是不能上網。這種情況下,就可以用 chmod 4755 netlogin 設置其他用戶在執行netlogin也有root用戶的權限,從而順利上網。
如何改變文件屬性
我們先介紹幾個常用於群組、擁有者、各種身份的權限之修改的指令,如下所示:
chgrp :改變文件所屬群組
chown :改變文件擁有者
chmod :改變文件的權限, SUID, SGID, SBIT等等的特性
改變所屬群組, chgrp
改變一個文件的群組真是很簡單的,直接以chgrp來改變即可。chgrp的拼寫也是有點意思的,這個指令就是change group的縮寫。
不過需要注意的是,我們要改變的用戶組,必須在在/etc/group文件內存在才行。
假設你是以root的身份登入Linux系統的,那么在你的家目錄內有一個install.log的文件, 如何將該文件的群組改變一下呢?假設你已經知道在/etc/group里面已經存在一個名為users的群組, 但是testing這個群組名字就不存在/etc/group當中了,此時改變群組成為users與testing分別會有什么現象發生呢?
發現了嗎?文件的群組被改成users了,但是要改成testing的時候, 就會發生錯誤
改變文件擁有者, chown
chown的拼寫也是change owner的拼寫。同樣用戶必須是已經存在系統中的賬號,也就是在/etc/passwd 這個文件中有紀錄的用戶名稱才能改變。
chown同時也可以修改所屬群組
同時chown也可以簡單的修改用戶的組
chown .sshd install.log
其中的sshd代表的就是用戶的群組
改變權限, chmod
文章開頭已經描述的很清楚了
參考
【第六章、Linux 的文件權限與目錄配置】http://cn.linux.vbird.org/linux_basic/0210filepermission.php
【Linux權限詳解(chmod、600、644、666、700、711、755、777、4755、6755、7755)】https://blog.csdn.net/u013197629/article/details/73608613
【深入Linux文件權限 SUID/SGID/SBIT】https://blog.csdn.net/imkelt/article/details/53054309?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
【第六章、Linux 的文件權限與目錄配置】http://cn.linux.vbird.org/linux_basic/0210filepermission.php#filepermission_ch