原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。任何不保留此聲明的轉載都是抄襲。mysql
《調教命令行01》選Linux發行版,就像挑女友
《調教命令行02》準備一個冰清玉潔的Linux系統
《調教命令行03》認識一下,感受不是說來就來的
《調教命令行04》觸碰Linux的每一個角落(長文)
《調教命令行05》對文件的基本操做
《調教命令行06》條條大道通羅馬,羅馬羅馬你在哪(學習技巧)
《調教命令行07》壓縮解壓(有64KB彩蛋)linux
隨着年齡的增長,個人經驗愈來愈豐富,而記憶力卻愈來愈差。爲了應付繁重的平常事務,我不得不許備了長長的任務清單。每一條事項的背後,都在不斷的提醒我:不管生活中充滿什麼驚喜,仍是逃離不了它平庸的本質。程序員
而我對時間,會更加的敏感。每次一次敲擊鍵盤,都會調動骨關節的扭動,留下一洗不可撤回的痕跡:windows的超級用戶,名字叫作Administrator
。這個單詞太長了,我總也記不住。相對來講,linux的超級用戶叫作root,只有四個字母。它的耗能值,比前者要低的多。sql
咱們在第三小節,剛接觸命令行的時候,就使用chmod
命令,給普通文本文件,賦予了執行權限。本小節將看一下用戶權限
和文件權限
這兩個息息相關的概念,windows
到如今爲止,咱們的系統中,還孤零零的只有這一個用戶,是時候學學女媧,捏幾個小泥人了。安全
首先建立兩個用戶:張三(zhang3)、李四(li4)。bash
[root@localhost ~]# useradd zhang3
複製代碼
查看下面命令的三個輸出結果。微信
# 系統中多了一個叫作zhang3的組,group文件保存了系統的組信息
[root@localhost ~]# tail -n1 /etc/group
zhang3:x:1000:
# 系統中多了一個叫作zhang3的用戶,shadow文件保存了它們的密碼。不少安全滲透就是爲了拿到它進行暴力破解
[root@localhost ~]# tail -n1 /etc/shadow
zhang3:!!:18207:0:99999:7:::
# home目錄中,多了一個叫作zhang3的目錄
[root@localhost ~]# ll /home --full-time
total 0
drwx------. 2 zhang3 zhang3 83 2019-11-06 22:09:33.357165082 -0500 zhang3
複製代碼
接下來,給咱們剛剛創建的用戶,使用passwd
設置一個密碼。密碼須要輸入兩次進行確認。若是想要更改密碼,可使用chpasswd
命令。架構
[root@localhost ~]# passwd zhang3
Changing password for user zhang3.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
複製代碼
那麼如何刪除一個現有的用戶呢?這是經過userdel
命令實現的。加上參數f
,會在其餘用戶使用系統的時候,強制退出。併發
userdel -f zhang3
複製代碼
從上面的命令執行結果中,咱們發現了有兩件很是有意思的東西。添加用戶後,除了在密碼文件shadow
中增長了一些內容,同時還在group
文件中添加了信息。這涉及到用戶的兩個屬性:用戶名,組名。
一個用戶只有一個名稱代號,可是能夠有多個組。下面命令建立一個密碼爲123的用戶li4
,並給它追加一個叫作zhang3
的組。能夠看到/etc/group
文件中的信息變動。
[root@localhost ~]# useradd -G zhang3 -p 123 li4
[root@localhost ~]# tail -n 2 /etc/group
zhang3:x:1000:li4
li4:x:1001:
複製代碼
好啦,接下來切換到咱們的文件權限上面。爲了進行下面命令的驗證,咱們首先建立一個名字叫confirm777.sh
的腳本文件。爲了讓腳本對全部用戶可見,咱們把它建立在/tmp目錄下。
cat > /tmp/confirm777.sh <<EOF
echo $USER
id
EOF
複製代碼
使用ll
命令查看文件信息。
[root@localhost ~]# ll /tmp/confirm777.sh --full-time
-rw-r--r--. 1 root root 13 2019-11-07 04:25:55.418254935 -0500 confirm777.sh
複製代碼
從
ll
的命令能夠看出,文件的全部者是root用戶,文件所屬的組,也是root組,它的權限是
rw-r--r--
。文件權限分爲三部分。
全部者權限
,縮寫爲u
。文件的全部者所擁有的權限。也就是root用戶的權限,是rw-
組用戶權限
,縮寫爲g
。文件所屬組內全部用戶的權限。由於root組內只有root一個用戶,因此組用戶權限是r--
。其餘用戶權限
,縮寫爲o
。其餘不相關用戶的權限,好比咱們剛建立的zhang三、li4用戶,對文件的權限就是r--
。所有
,縮寫爲a
,表示對上面三類用戶集體操做。那rw-這些東西是什麼意思呢?
r
表示可讀權限。read。w
表示可寫權限。write。x
表示可執行權限。execute。-
權限佔位符,表示沒有當前權限。注意:一個用戶擁有文件的w權限,並不表明就能夠刪除文件。w僅僅針對於文件內容來講的。
一個文件,有3類用戶,每類用戶,有3種權限。使用最簡單的小學乘法,咱們可以得出,一個文件的權限位,須要3x3=9
個標誌位表示。
咱們的文件名稱,叫作confirm777.sh,這個名字是隨便起的麼?固然不是,777
在linux表明特殊的含義,它表明文件對全部用戶具備可讀、可寫、可執行的權限。能夠想象,若是每一個文件都有這樣的權限,系統將無安全可言。那這一串數字是怎麼來的呢?能夠看下面的對照表。
r
4
讀w
2
寫x
1
執行對以上三個屬性進行任意組合,能夠獲得:
4
r--
4+0+06
rw-
4+2+05
r-x
4+0+12
-w-
0+2+03
-wx
0+2+11
--x
0+0+17
rwx
4+2+1下面介紹三個文件權限相關的命令。通常經常使用的,就是chown和chmod。
chown
更改文件的全部者。 chgrp
更改文件的組。 chmod
更改文件權限。
接下來,咱們把confirm777.sh
的全部者和組,修改爲剛剛建立的用戶zhang3
。
cd /tmp
[root@localhost tmp]# chown zhang3:zhang3 confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
複製代碼
給文件全部者增長執行權限。而後分別切換到zhang3
,li4
用戶執行一下。
經過
su
命令,能夠切換到其餘用戶,通常使用su -
進行環境變量的清理;而命令id
,可以看到當前正在執行的用戶信息。
[root@localhost tmp]# chmod u+x confirm777.sh
[root@localhost tmp]# su li4
[li4@localhost tmp]$ ./confirm777.sh
bash: ./confirm777.sh: Permission denied
[li4@localhost tmp]$ exit
exit
[root@localhost tmp]# su zhang3
[zhang3@localhost tmp]$ ./confirm777.sh
root
uid=1000(zhang3) gid=1000(zhang3) groups=1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
複製代碼
能夠看到,文件全部者zhang3能夠執行文件,但不相關的li4,提示沒有權限。接下來,咱們驗證用戶組相關的權限位。
# 去掉zhang3的執行權限
root@localhost tmp]# chmod u-x confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
# 增長zhang3組的執行權限,因爲li4在zhang3組裏,它擁有權限
[root@localhost tmp]# chmod g+x confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r-xr--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
# 切換到zhang3進行執行
[root@localhost tmp]# su - zhang3
[zhang3@localhost tmp]$ ./confirm777.sh
bash: ./confirm777.sh: Permission denied
[zhang3@localhost tmp]$ exit
exit
# 切換到li4進行執行
[root@localhost tmp]# su - li4
[li4@localhost tmp]$ ./confirm777.sh
root
uid=1001(li4) gid=1001(li4) groups=1001(li4),1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
複製代碼
從命令的執行結果能夠看出。此次,li4可以執行文件,相反的,zhang3卻不能。
咱們使用chmod命令來修改文件權限,使用的是相似於a+x
這樣的英文字母。拿第一個腳原本說,初始的權限是rw-r--r--
,也就是644
,在這種狀況下,下面的兩個腳本等效。
chmod u+x confirm777.sh
chmod 744 confirm777.sh
複製代碼
能夠看到,第二個命令,使用的是數字樣式的權限位,多了一步人腦轉換過程。這在平常的使用中,是很是不方便的。因此,使用符號法的表示方式,可以更加直觀,很是推薦。
爲了更直觀的表現這個過程,我專門製做了一張圖。
這裏有一個很是有意思的地方。把文件設置成可執行,能夠把普通文件變成腳本,目錄文件的可執行權限是什麼鬼?有什麼意義?對文件夾來講:
r
表示容許讀取目錄中的文件名,但不能進入該目錄w
表示容許用戶修改目錄,能夠建立、遷移、刪除、改名目錄下的文件x
能夠得到目錄下文件的列表,以及進入目錄,執行cd命令關於r和x的區別,能夠看下面的命令結果,仔細感覺一下它們的區別。通常的,幾乎全部的目錄,都擁有執行
權限,不要隨意對其進行設置。
[root@localhost tmp]# su - li4
[li4@localhost ~]$ cd /tmp
[li4@localhost tmp]$ mkdir nox
[li4@localhost tmp]$ touch nox/{a,b,c,d}
[li4@localhost tmp]$ chmod a-x nox
[li4@localhost tmp]$ ls nox
ls: cannot access nox/a: Permission denied
ls: cannot access nox/b: Permission denied
ls: cannot access nox/c: Permission denied
ls: cannot access nox/d: Permission denied
a b c d
[li4@localhost tmp]$ cat nox/a
cat: nox/a: Permission denied
[li4@localhost tmp]$ chmod a+x nox
[li4@localhost tmp]$ chmod a-r nox
[li4@localhost tmp]$ ls nox
ls: cannot open directory nox: Permission denied
複製代碼
接下來,咱們介紹一個比較燒腦的粘貼位。
假如你要刪除一個文件,你能夠沒有這個文件的寫權限,可是你必需要擁有這個文件上級目錄的寫權限。如何建立一個目錄,可讓任何人些人文件,可是又不能刪除其餘用戶的文件?這就是stick bit的做用。粘貼位通常只用於目錄上,對文件來講並無什麼用處。粘貼位通常使用t
表示。
咱們能夠看一個典型的目錄/tmp
[root@localhost tmp]# ls -dl /tmp
drwxrwxrwt. 9 root root 4096 Nov 7 06:27 /tmp
複製代碼
能夠看到,最後一位,顯示的是t,而不是x,意思是普通用戶不能刪除其餘用戶的文件。全部用戶在/tmp目錄中,均可以隨意建立文件,可是卻刪除不了其餘人的文件,即便文件的權限是
777
。
[root@localhost tmp]# touch /tmp/stick
[root@localhost tmp]# chown li4:li4 /tmp/stick
[root@localhost tmp]# chmod 777 /tmp/stick
[root@localhost tmp]# su - zhang3
[zhang3@localhost ~]$ rm /tmp/stick
rm: cannot remove ‘/tmp/stick’: Operation not permitted
複製代碼
本小節建立了兩個用戶zhang3和li4,並拿它們測試了chown和chmod命令,最後介紹了粘貼位。linux比較安全的緣由,就是由於有比較詳盡的權限劃分。但權限是枚雙刃劍,超權用戶一個命令就能夠搞垮系統,許多隱藏的木馬,經過提權運行在鮮爲人知的地方。
權限相關的幾個命令會常常被使用,下面舉幾個例子。
# 設置/var/lib/mysql的用戶和組爲mysql
chown -R mysql:mysql /var/lib/mysql
# 設置目錄可讀可寫,可以上傳文件
chmod 777 /var/www/uploads
# 增長本目錄下全部sh的執行權限
chomd a+x *.sh
# 變動file爲可讀可寫可執行
chmod u=rwx,g=rwx,o=rwx file
複製代碼
一、下面這個命令,執行之後,會發生什麼狀況?警告:不要執行,哪怕把000改爲其餘數字。
# R遍歷子目錄的意思
chmod -R 000 /
複製代碼
二、有一天,我看到一個命令chmod u+s file
,文中並無介紹s
是什麼意思,這是什麼意思?
三、如何刪除一個用戶的組?
Linux系統的命令是十分枯燥的。本系列不知不覺已經持續了8個周。和預想的同樣,它並未取得普遍的歡迎,從它和其餘文章迥然的閱讀量就能夠看出--標題就讓人失去了點擊的慾望。
技術類文章徹底不一樣於扯淡型的天馬行空,耗費的精力也是巨大的,尤爲對我一個對正確性有強迫症的人來講。有時候,我會產生迷茫。不知道這依靠興趣支撐的輸出,可以持續多久。
可以翻到結尾,翻到這裏的朋友,xjjdog很是感謝。還有幾篇就要結束了,加上之前關於Linux的一些文章,已經能夠成爲一個體繫了。若是你跟蹤至此,至少已經能夠在日常的工做中游刃有餘了。
xjjdog
接下來會找一些讓人歡迎的主題,而不是這麼枯燥的知識點。畢竟,有的時候,人家畢竟仍是個可愛的女孩紙嘛。
做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,進一步交流。