一、Linux檔案和目錄簡單操作
1.1 查看檔案
ls 查看當前目錄下的檔案
如:
-a 顯示所有檔案及目錄
(ls內定將檔案名或目錄名稱開頭為"."的視為隱藏檔,不會列出)
-l 除檔案名稱外,亦將檔案型態、權限、擁有者、檔案大小等資訊詳細列出
-r 將檔案以相反次序顯示(原定依英文字母次序)-t
將檔案依建立時間之先后次序列出
-A 同 -a ,老師 (父目錄)
-F 在列出的檔案名稱后加一符號;例如可執行檔則加 "*", 目錄則加 "/"
-R 若目錄下有檔案,則以下之檔案亦皆依序列出
1.2 創建檔案
touch + 檔案路徑/檔案名 創建普通檔案
(檔案路徑:可以是相對路徑也可以是絕對路徑)
mkdir + 目錄路徑/目錄名 創建目錄檔案
1.3 洗掉檔案
洗掉普通檔案:rm + 檔案路徑/檔案名
洗掉目錄檔案
1、 洗掉空目錄 rmdir + 目錄路徑/目錄名
rm -r +目錄路徑/ 目錄名 ( -r 是rm的引數)
2、 洗掉非空目錄
rm -r +目錄路徑/ 目錄名
1.4 檔案復制與重命名
檔案復制粘貼
語法: cp [options] source... directory
-a:此選項通常在復制目錄時使用,它保留鏈接、檔案屬性,并復制目錄下的所有內容,其作用等于dpR引陣列合,
-d:復制時保留鏈接,這里所說的鏈接相當于Windows系統中的快捷方式,
-f:覆寫已經存在的目標檔案而不給出提示,
-i:與-f選項相反,在覆寫目標檔案之前給出提示,要求用戶確認是否覆寫,回答"y"時目標檔案將被覆寫,
-p:除復制檔案的內容外,還把修改時間和訪問權限也復制到新檔案中,
-r:若給出的源檔案是一個目錄檔案,此時將復制該目錄下所有的子目錄和檔案,
-l:不復制檔案,只是生成鏈接檔案,
1.5 檔案移動
語法:mv [options] source... directory
-i: 若指定目錄已有同名檔案,則先詢問是否覆寫舊檔案;
-f: 在 mv 操作要覆寫某已有的目標檔案時不給任何指示;
二、Linux壓縮/解壓檔案操作
1.zip
壓縮檔案
zip test.zip test.jpg test.png
#將test.jpg和test.png壓縮成一個zip包
zip test.zip *.jpg
#將所有.jpg的檔案壓縮成一個zip包
壓縮目錄
zip -r test.zip test
#將檔案夾test壓縮成一個zip包
解壓縮
unzip test.zip
#將test.zip中的所有檔案解壓出來
#把/home目錄下面的mydata.zip解壓到mydatabak目錄里面
unzip mydata.zip -d mydatabak
2.rar
centos默認沒有安裝rar,需要安裝,
wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2.tar.gz
tar -zxvf rarlinux-x64-6.0.2.tar.gz
cd rar
make
如果wget的地址失效,到rar官網下載 http://www.rarsoft.com/download.htm
rar a test.rar test.jpg test.png
#這條命令是將test.jpg和test.png壓縮成一個rar包
rar a test.rar *.jpg
#這條命令是將所有.jpg的檔案壓縮成一個rar包
rar a test.rar test
#這條命令是將檔案夾test壓縮成一個rar包
解壓縮
unrar e test.rar
#這條命令是將test.rar中的所有檔案解壓出來
unrar e test.rar -w 解壓的指定目錄
3.tar
打包檔案
tar -cvf file.tar 目錄
#將目錄打包成file.tar
解包
tar xvf xxx.tar
- tar.gz
壓縮檔案
tar -zcvf xxx.tar.gz 目錄
#將目錄添加到xxx.tar.gz
引數說明:
-z:表示gz壓縮
-c:建立新的存檔
-x:從存檔展開檔案
-v:詳細顯示處理的檔案;
-f:指定存檔或設備
解壓縮
tar -zxvf xxx.tar.gz
5.xz
壓縮檔案
xz -z 要壓縮的檔案
#如果要保留被壓縮的檔案加上引數 -k ,如果要設定壓縮率加入引數 -0 到 -9調節壓縮率,如果不設定,默認壓縮等級是6.
解壓縮
xz -d 要解壓的檔案
# -k 引數保留被解壓縮的檔案
6.tar.xz
創建tar.xz檔案
#1.創建xxx.tar檔案
tar cvf xxx.tar xxx/
#2.將 xxx.tar壓縮成為 xxx.tar.xz
xz -z xxx.tar
解壓tar.xz檔案
#1.將 xxx.tar.xz解壓成 xxx.tar
xz -d xxx.tar.xz
#2.再用 tar xvf xxx.tar來解包
tar xvf xxx.tar
7 .bz2
解壓1:bzip2 -d FileName.bz2
解壓2:bunzip2 FileName.bz2
壓縮: bzip2 -z FileName
.tar.bz2
解壓:tar jxvf FileName.tar.bz2
壓縮:tar jcvf FileName.tar.bz2 DirName
8 .bz
解壓1:bzip2 -d FileName.bz
解壓2:bunzip2 FileName.bz
壓縮:未知
.tar.bz
解壓:tar jxvf FileName.tar.bz
壓縮:未知
9 .Z
解壓:uncompress FileName.Z
壓縮:compress FileName
.tar.Z
解壓:tar Zxvf FileName.tar.Z
壓縮:tar Zcvf FileName.tar.Z DirName
三、Linux的權限控制
3.1.基礎知識
Linux作為一種多用戶的作業系統(服務器系統),允許多個用戶同時登陸到系統上,并回應每個用戶的請求,
任何需要使用作業系統的用戶,都需要一個系統賬號,賬號分為:**管理員賬號與普通用戶賬號,**
在Linux中,作業系統**根據UID來判斷用!根據UID來判斷用戶!**
而不是用戶名!**只要id為0就是管理員,哪怕有多個id為0 的賬號**
系統在新建賬號時,會根據賬號型別,自動分配遞增賬號的UID與GID
(用戶身份編號,組編號),也可自行分配,**通常情況下,應當保證UID與GID唯一且不重復,**
3.1.1 組的類別
在Linux中,每個用戶必須有一個主組,當創建賬號時,系統會自動創建一個同名組作為該賬戶的主組,用戶必須屬于一個且只有一個主組,用戶可以屬于零個或者多個附加組,
3.1.2 用戶與組的組態檔
在Linux中,**萬物皆檔案**,所以用戶與組也以組態檔的形式保存在系統中,以下為用戶和組的主要組態檔詳解:
- /etc/passwd:用戶及其屬性資訊(名稱、 UID、主組ID等)
- /etc/group:組及其屬性資訊
- /etc/shadow:用戶密碼及其相關屬性
- /etc/gshadow:組密碼及其相關屬性
passwd檔案格式如下圖:

依次含義為:
- 登錄用戶名
- 密碼
- UID
- GID
- 全名或注釋
- 用戶主目錄
- 用戶默認使用shell
group檔案格式如下圖:

依次含義為:
- 群組名稱
- 群組密碼(通常不需要設定,密碼被記錄在/etc/gshadow)
- GID:群組ID
- 附加組(以,來分割,該賬戶沒有附加組所以為空)
shadow檔案格式如下圖:

依次含義為:
- 登錄用戶名
- 密碼(通常使用shad512加密)
- 從1970年1月1日起計算到現在為止密碼最近一次被更改的時間
- 密碼再過幾天就可以被修改(0表示隨時可改)
- 密碼幾天后必須變更(99999表示永不過期)
- 密碼過期前多久提示用戶
- 密碼過期多久后賬戶將被鎖定
- 多少天后賬戶將失效(從1970-1-1算起)
gshadow檔案格式如下圖:

依次含義為:
- 群組名稱
- 群組密碼
- 組管理員串列
- 當前用戶的附加組
3.2.用戶賬號管理
在Linux,管理員在默認情況下為root賬戶,UID=0,普通用戶UID默認范圍為1-65535,在centos
6中,新建用戶,默認系統用戶的UID范圍為1-499,普通用戶為500+,在centos
7中,系統用戶范圍為1-999,普通用戶為1000+,**對系統的操作權限由用戶決定,**
通常對用戶賬號的操作分為添加,修改,洗掉,
3.2.1 添加賬戶
通過:useradd命令,來添加用戶語法如下:
useradd [opentions] login
引數說明:
-
-u UID 自定義UID (默認系統遞增)
-
-o 配合-u 選項,不檢查UID的唯一性(不建議)
-
-g GID:指明用戶所屬基本組,可為組名,也可以GID
-
-c comment 指定一段注釋性描述,
-
-d 目錄
指定用戶主目錄,如果此目錄不存在,則同時使用-m選項,可以創建主目錄, -
-g 用戶組 指定用戶所屬的用戶組,
-
-G 用戶組,用戶組 指定用戶所屬的附加組,
-
-s Shell檔案 指定用戶的登錄Shell,
-
-u 用戶號
指定用戶的用戶號,如果同時有-o選項,則可以重復使用其他用戶的標識號,
實體1
# useradd -d /usr/ddz ddz
創建了一個用戶ddz,并將他的家目錄設定到/user/ddz
實體2
groupadd 組名 添加用戶組 -g :添加組時指定組ID groupmod 組名 修改用戶組資訊 -n :修改組名 -g :修改組ID groupdel 組名 洗掉組 *如果一個組下有用戶,那么這個組是無法洗掉的,
# useradd -s /sbin/bash -g root –G mage,wang ddz
此命令新建了一個用戶ddz,設定該用戶使用的shell為/sbin/bash,設定他的主組屬于group用戶組,設定附加組為mage和wang,(**當設定組時,要保證組已經存在,否則請先創建該組**)
小技巧:
- 增加用戶賬號就是在/etc/passwd檔案中為新用戶增加一條記錄,同時系統會**自動更新**其他系統檔案如/etc/shadow,
/etc/group等, - 通常情況創建賬戶,賬戶ID會按照最大的值遞增,但是遞增的值必須在最大范圍內,
- 在部署軟體時,通常會需要使用賬戶,所以需要指定UID,來部署所有的賬號都用同一個UID,來方便管理,
- newusers [passwd格式檔案]
用于批量創建賬戶,只需要每一列賬戶資訊格式,按照passwd中書寫,之后上傳到Linux中替換即可, - chpasswd 批量修改用戶口令,將檔案格式寫為:user:passwd
,每行一個,之后倒入linux即可, - 創建賬戶的默認值設定位于:
/etc/default/useradd檔案中,該檔案記錄了創建用戶賬戶時的默認資訊,可通過修改該檔案來修改創建賬戶時的資訊,
3.2.2 洗掉帳號
如果一個用戶的賬號不再使用,可以從系統中洗掉,洗掉用戶賬號就是要將/etc/passwd等系統檔案中的該用戶記錄洗掉,必要時還洗掉用戶的主目錄,
通常在運維作業中,一般使用讓賬號失效,果然修改賬戶名的方式,來便捷的操作賬號,
洗掉一個已有的用戶賬號使用userdel命令,其格式如下:
userdel 選項 用戶名
常用的選項是 -r,它的作用是把用戶的主目錄一起洗掉,
例如:
# userdel -r sam
此命令洗掉用戶sam在系統檔案中(主要是/etc/passwd, /etc/shadow,
/etc/group等)的記錄,同時洗掉用戶的主目錄,
洗掉賬號需要該賬戶沒有人在使用,才能洗掉成功,請使用命令洗掉,不要去手動改檔案,
3.2.3 修改帳號
修改用戶賬號就是根據實際情況更改用戶的有關屬性,如用戶號、主目錄、用戶組、登錄Shell等,
修改已有用戶的資訊使用usermod命令,其格式如下:
usermod 選項 用戶名
常用的選項包括-c, -d, -m, -g, -G, -s, -u以及-o等,這些選項的意義與useradd命令中的選項一樣,可以為用戶指定新的資源值,
另外,有些系統可以使用選項:-l 新用戶名
這個選項指定一個新的賬號,即將原來的用戶名改為新的用戶名,
例如:
# usermod -s /bin/ksh -d /home/z -g developer sam
此命令將用戶sam的登錄Shell修改為ksh,主目錄改為/home/z,用戶組改為developer,
3.2.4 查詢賬號口令
id [opentions] [User]
相關引數:
- -u:顯示UID
- -g:顯示GID
- -G:顯示用戶所屬的組ID
- -n:顯示名稱
3.2.5 用戶口令的管理
用戶管理的一項重要內容是用戶口令的管理,用戶賬號剛創建時沒有口令,但是被系統鎖定,無法使用(在passwd檔案中,密碼列顯示為!!或者!表示用戶被鎖定,是無法登陸的),必須為其指定口令后才可以使用,即使是指定空口令,
指定和修改用戶口令的Shell命令是passwd,超級用戶可以為自己和其他用戶指定口令,普通用戶只能用它修改自己的口令,命令的格式為:
passwd 選項 用戶名
可使用的選項:
- -l 鎖定口令,即禁用賬號,
- -u 口令解鎖,
- -d 使賬號無口令,
- -f 強迫用戶下次登錄時修改口令,
如果默認用戶名,則修改當前用戶的口令,
例如,假設當前用戶是sam,則下面的命令修改該用戶自己的口令:
$ passwd
Old password:******
New password:*******
Re-enter new password:*******
如果是超級用戶,可以用下列形式指定任何用戶的口令:
# passwd sam
New password:*******
Re-enter new password:*******
普通用戶修改自己的口令時,passwd命令會先詢問原口令,驗證后再要求用戶輸入兩遍新口令,如果兩次輸入的口令一致,則將這個口令指定給用戶;而超級用戶為用戶指定口令時,就不需要知道原口令,
為了系統安全起見,用戶應該選擇比較復雜的口令,例如最好使用8位長的口令,口令中包含有大寫、小寫字母和數字,并且應該與姓名、生日等不相同,
為用戶指定空口令時,執行下列形式的命令:
# passwd -d sam
此命令將用戶sam的口令洗掉,這樣用戶sam下一次登錄時,系統就不再詢問口令,
passwd命令還可以用-l(lock)選項鎖定某一用戶,使其不能登錄,例如:
# passwd -l sam
利用組來簡化授權操作,當對整個組授權時,整個組下的賬號權限都會進行修改
其他 : 用戶相關的其他指令
chfn [USER] 修改用戶的備注檔案
chsh [Shell] 修改用戶的指定shell
3.用戶組
3.3.用戶組的管理
每個用戶都有一個用戶組,**系統可以對一個用戶組中的所有用戶進行集中管理**,不同Linux
系統對用戶組的規定有所不同,如Linux下的用戶屬于與它同名的用戶組,這個用戶組在創建用戶時同時創建,
用戶組的管理涉及用戶組的添加、洗掉和修改,組的增加、洗掉和修改實際上就是對/etc/group檔案的更新,
3.3.1增加組
1、增加一個新的用戶組使用groupadd命令,其格式如下:
groupadd 選項 用戶組
可以使用的選項有:
- -g GID 指定新用戶組的組標識號(GID),
- -o
一般與-g選項同時使用,表示新用戶組的GID可以與系統已有用戶組的GID相同, - -r 創建系統組
實體1:
# groupadd group1
此命令向系統中增加了一個新組group1,新組的組標識號是在當前已有的最大組標識號的基礎上加1,
實體2:
# groupadd -g 101 group2
此命令向系統中增加了一個新組group2,同時指定新組的組標識號是101,
3.3.2 洗掉組
2、如果要洗掉一個已有的用戶組,使用groupdel命令,其格式如下:
groupdel 用戶組
例如:
# groupdel group1
此命令從系統中洗掉組group1,**要想洗掉組,要確保該組不是主組,才能把這個組刪掉,**
3.3.3 修改組
3、修改用戶組的屬性使用groupmod命令,其語法如下:
groupmod 選項 用戶組
常用的選項有:
- -g GID 為用戶組指定新的組標識號,
- -o 與-g選項同時使用,用戶組的新GID可以與系統已有用戶組的GID相同,
- -n新用戶組 將用戶組的名字改為新名字
實體1:
# groupmod -g 102 group2
此命令將組group2的組標識號修改為102,
實體2:
# groupmod –g 10000 -n group3 group2
此命令將組group2的標識號改為10000,組名修改為group3,
3.3.4 切換組(臨時切換主組)
4、如果一個用戶同時屬于多個用戶組,那么用戶可以在用戶組之間切換,以便具有其他用戶組的權限,
用戶可以在登錄后,使用命令newgrp切換到其他用戶組,這個命令的引數就是目的用戶組,例如:
$ newgrp root
這條命令將當前用戶切換到root用戶組,前提條件是root用戶組確實是該用戶的主組或附加組,類似于用戶賬號的管理,用戶組的管理也可以通過集成的系統管理工具來完成,
3.5 更改查看組成員
5 、可以通過以下命令,來更改和查看組中的成員
#groupmems [opentions] [action]
引數如下:
- -g 更改為指定組(只有root可以使用)
- -a 指定用戶加入組
- -d 從組中洗掉該用戶
- -p 從組中清楚所有成員
- -l 顯示組成員串列
實體1
$groupmems -l -g root
此命令表示查看root組中存在的成員,
實體2
$groupmems -a Father -g root
此命令表示將Father用戶加入root組中,
小技巧:
- 一個用戶可以加入不同的組,但是有且只有一個主組,
- 一個用戶的權限為他所屬的多個組的累加權限 ,假設user賬戶附加組group1
= write group2 = read ,那么user就擁有 write + read權限, - 組和用戶的關系是多對多
一個用戶可以有多個組,一個組也可以有多個用戶, - 在windows中,只有管理員才允許對用戶組進行操作,但在Linux中,只要有組的口令,就可以讓賬號進入組,
- root組的權限與普通組權限大致相同!!賬號并不是加入root組就能獲得用戶權限!
3.4 檔案的權限控制
3.4.1 檔案權限與歸屬
在Linux系統中,每個檔案都有歸屬的所有者和所有組,并且規定了檔案的所有者、所有組以及其他人對檔案所擁有的讀(r)、寫(w)、執行(x)等權限,對于一般檔案來說,權限比較容易理解:"可讀"表示能夠讀取檔案的實際內容;"可寫"表示能夠編輯、新增、修改、洗掉檔案的實際內容;"可執行"則表示能夠運行一個腳本程式,但是,對于目錄檔案來說,理解其權限設定來就不那么容易了,很多資深Linux用戶其實也沒有真正搞明白,對目錄檔案來說,"可讀"表示能夠讀取目錄內的檔案串列;"可寫"表示能夠在目錄內新增、洗掉、重命名檔案;而"可執行"則表示能夠進入該目錄,可以參考表格5-5,幫助同學們理解當檔案和目錄被設定rwx權限后,能夠被執行的命令的區別:
表5-5 讀寫執行權限對于檔案與目錄可執行命令的區別

檔案的讀、寫、執行權限英文全稱分別是read、write、execute,可以簡寫為r、w、x,亦可分別用數字4、2、1來表示,檔案所有者,所屬組及其他用戶權限之間無關聯,如表5-6所示,
表5-6 檔案權限的字符與數字表示

檔案權限的數字法表示基于字符(rwx)的權限計算而來,其目的是簡化權限的表示方式,例如,若某個檔案的權限為**7**則代表可讀、可寫、可執行(4+2+1);若權限為6則代表可讀、可寫(4+2),我們來看這樣一個例子,現在有這樣一個檔案,其所有者擁有可讀、可寫、可執行的權限,其檔案所屬組擁有可讀、可寫的權限;而且其他人只有可讀的權限,那么,這個檔案的權限就是rwxrw-r--,數字法表示即為764,不過大家千萬別再將這三個數字相加,計算出7+6+4=17的結果,這是小學的數學加減法,不是Linux系統的權限數字表示法,三者之間沒有互通關系,
以rw-r-x-w-權限為例進行講解,要想轉換成數字法,首先要進行各個位之上的數字替代,如圖5-1所示,

圖5-1 字符與數字權限轉換示意圖
減號是占位符,代表這里沒有權限,數字法用0表示,也就是說rw-轉換后是420,r-x轉換后是401,-w-轉換后是020,三組數字之間每組數字進行相加后得出652便是轉換后的數字法權限,
而數字法轉回到字符權限相比來說就有些難度了,以652權限為例進行講解,首先數字6是由4+2得到的,不可能是4+1+1,因為每個權限只能占一位,所以數字5則是4+1得到的,2便是本身,沒有權限即是空值0,可以按照表5-6所示的格式填寫進去后得到420401020這樣一串數字,有了這些資訊就好辦了,如圖5-2所示,把他們都轉換回來,

圖5-2 數字與字符權限轉換示意圖
心中牢記------檔案的所有者、所有組和其他人權限之間無關聯,不要寫成rrwwx----的樣子,一定要把rwx權限位對應到正確的位置,寫成rw-r-x-w-,
Linux系統的檔案權限相當復雜,但是用途很廣泛,建議大家把它徹底搞清楚之后再學習下一節的內容,現在來練習一下,請各位讀者分別計算數字表示法764、652、153、731所對應的字符表示法,然后再把rwxrw-r--、rw--w--wx、rw-r--r--轉換成數字表示法,
下面我們利用上文講解的知識,一起分析圖5-3中所示的檔案資訊,

圖5-3 通過ls命令查看到的檔案屬性資訊
在圖5-3中,包含了檔案的型別、訪問權限、所有者(屬主)、所屬組(屬組)、占用的磁盤大小、最后修改時間和檔案名稱等資訊,通過分析可知,該檔案的型別為普通檔案,所有者權限為可讀、可寫(rw-),所屬組權限為可讀(r--),除此以外的其他人也只有可讀權限(r--),檔案的磁盤占用大小是34298位元組,最近一次的修改時間為4月2日的凌晨23分,檔案的名稱為install.log,
其中排在權限前面的減號(-)是檔案型別,新手經常會把它跟無權限混淆,盡管在Linux系統中一切都是檔案,但是不同的檔案由于作用不同,因此型別也不盡相同,有一點點像Windows系統的后綴名,常見的檔案型別包括有:普通檔案(-)、目錄檔案(d)、鏈接檔案(l)、管道檔案(p)、塊設備檔案(b)以及字符設備檔案(c),
普通檔案的范圍特別廣泛,比如純文本資訊、服務配置資訊、日志資訊以及Shell腳本等等都包含在內,所以幾乎在每個目錄下都能看到普通檔案(-)和目錄檔案(d)的身影,塊設備檔案(b)和字符設備檔案(c)一般是指硬體設備,比如滑鼠、鍵盤、光驅、硬碟等等都是設備檔案,主要集中在/dev/目錄中最為常見,不過其實很少會對滑鼠鍵盤進行硬體級別的管理吧~
3.4.2 檔案的特殊權限
在復雜多變的生產環境中,單純設定檔案的rwx權限無法滿足我們對安全和靈活性的需求,因此便有了SUID、SGID與SBIT的特殊權限位,這是一種對檔案權限進行設定的特殊功能,可以與一般權限同時使用,以彌補一般權限不能實作的功能,
下面具體解釋這3個特殊權限位的功能以及用法,
1. SUID
SUID是一種對二進制程式進行設定的特殊權限,能夠讓二進制程式的執行者臨時擁有屬主的權限(僅對擁有執行權限的二進制程式有效),例如,所有用戶都可以執行passwd命令來修改自己的用戶密碼,而用戶密碼保存在/etc/shadow檔案中,仔細查看這個檔案就會發現它的默認權限是000,也就是說除了root管理員以外,所有用戶都沒有查看或編輯該檔案的權限,但是,在使用passwd命令時如果加上SUID特殊權限位,就可讓普通用戶臨時獲得程式所有者的身份,把變更的密碼資訊寫入到shadow檔案中,這很像在古裝劇中見到的手持尚方寶劍的欽差大臣,他手持的尚方寶劍代表的是皇上的權威,因此可以懲戒貪官,但這并不意味著他永久成為了皇上,因此這只是一種有條件的、臨時的特殊權限授權方法,
查看passwd命令屬性時發現所有者的權限由rwx變成了rws,其中x改變成s就意味著該檔案被賦予了SUID權限,另外有讀者會好奇,那么如果原本的權限是rw-呢?如果原先權限位上沒有x執行權限,那么被賦予特殊權限后將變成大寫的S,
[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1312 Jul 21 05:08 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd
醒目的紅色提醒告誡著用戶一定要小心這個權限,因為一旦某個命令檔案被設定上了SUID權限,那么就意味著凡是執行的人都可以臨時獲取到更高的權限,千萬不要設定到vim、cat、rm等命令上面!!!
2. SGID
SGID特殊權限有兩種應用場景,當對二進制程式進行設定時,能夠讓執行者臨時獲取到檔案所有組的權限;而對目錄進行設定時,則是讓目錄內新創建的檔案自動繼承該目錄原有用戶組的名稱,
第一種功能是參考SUID而設計的,不同點在于執行程式的用戶獲取的不再是檔案所有者的臨時權限,而是獲取到檔案所屬組的權限,舉例來說,在早期的Linux系統中,/dev/kmem是一個字符設備檔案,用于存盤內核程式要訪問的資料,權限為:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
大家看出問題了嗎?除了root管理員或屬于system組成員外,所有用戶都沒有讀取該檔案的權限,由于在平時我們需要查看系統的行程狀態,為了能夠獲取到行程的狀態資訊,可在用于查看系統行程狀態的ps命令檔案上增加SGID特殊權限位,查看ps命令檔案的屬性資訊:
-r-xr-**s**r-x 1 bin system 59346 Feb 11 2017 ps
這樣一來,由于ps命令被增加了SGID特殊權限位,所以當用戶執行該命令時,也就臨時獲取到了system用戶組的權限,從而順利地讀取到了設備檔案,
前文提到,每個檔案都有其歸屬的所有者和所屬組,當創建或傳送一個檔案后,這個檔案就會自動歸屬于執行這個操作的用戶(即該用戶是檔案的所有者),如果現在需要在一個部門內設定共享目錄,讓部門內的所有人員都能夠讀取目錄中的內容,那么就可以創建部門共享目錄后,在該目錄上設定SGID特殊權限位,這樣,部門內的任何人員在里面創建的任何檔案都會歸屬于該目錄的所屬組,而不再是自己的基本用戶組,此時,用到的就是SGID的第二個功能,即在某個目錄中創建的檔案自動繼承該目錄的用戶組(只可以對目錄進行設定),
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x. 2 root root 6 Oct 27 23:44 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir
[root@linuxprobe tmp]# chmod -R g+s testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx. 2 root root 6 Oct 27 23:44 testdir
在使用上述命令設定好目錄的777權限(確保普通用戶可以向其中寫入檔案),并為該目錄設定了SGID特殊權限位后,就可以切換至一個普通用戶,然后嘗試在該目錄中創建檔案,并查看新創建的檔案是否會繼承新創建的檔案所在的目錄的所屬組名稱:
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Oct 27 23:47 test
除了上面提到的SGID的這兩個功能,再介紹兩個與本小節內容相關的命令:chmod和chown,
chmod命令用于設定檔案的一般權限及特殊權限,英文全稱為:"change
mode",語法格式為:"chmod [引數] 檔案名",
這是一個與日常設定檔案權限強相關的命令,例如要把一個檔案的權限設定成其所有者可讀可寫可執行、所屬組可讀可寫、其他人沒有任何權限,則相應的字符法表示為rwxrw----,其對應的數字法表示為760,
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
chown命令用于設定檔案的所有者和所有組,英文全稱為:"change
own",語法格式為:"chown 所有者:所有組 檔案名",
chmod和chown命令是用于修改檔案屬性和權限的最常用命令,它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫引數-R來表示遞回操作,即對目錄內所有的檔案進行整體操作,
使用"所有者:所有組"的格式輕松把剛剛那個檔案的所屬資訊修改一下,變更后的效果如下:
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 linuxprobe linuxprobe 1407 Jul 21 05:09 anaconda-ks.cfg
3. SBIT
現在,大學里的很多老師都要求學生將作業上傳到服務器的特定共享目錄中,但總是有幾個"破壞分子"喜歡洗掉其他同學的作業,這時就要設定SBIT(Sticky
Bit)特殊權限位了(也可以稱之為特殊權限位之粘滯位),SBIT特殊權限位可確保用戶只能洗掉自己的檔案,而不能洗掉其他用戶的檔案,換句話說,當對某個目錄設定了SBIT粘滯位權限后,那么該目錄中的檔案就只能被其所有者執行洗掉操作了,
最初不知道是哪位非資深技術人員將Sticky
Bit直譯成了"粘滯位",劉遄老師建議將其稱為"保護位",這既好記,又能立刻讓人了解它的作用,RHEL
8系統中的/tmp作為一個共享檔案的目錄,默認已經設定了SBIT特殊權限位,因此除非是該目錄的所有者,否則無法洗掉這里面的檔案,
與前面所講的SUID和SGID權限顯示方法不同,當目錄被設定SBIT特殊權限位后,檔案的其他人權限部分的x執行權限就會被替換成t或者T,原本有x執行權限則會寫成t,原本沒有x執行權限則會被寫成T,
/tmp目錄上的SBIT權限默認已經存在,體現為"其他用戶"權限欄位的權限變為rwt:
[root@linuxprobe ~]# ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Oct 28 00:29 /tmp
其實,檔案能否被洗掉并不取決于自身的權限,而是看其所在目錄是否有寫入權限(其原理會在下個章節講到),為了避免現在很多讀者不放心,所以下面的命令還是賦予了這個test檔案最大的777權限(rwxrwxrwx):
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# echo "Welcome to linuxprobe.com" > test
[root@linuxprobe tmp]# chmod 777 test
[root@linuxprobe tmp]# ls -al test
-rwxrwxrwx. 1 root root 26 Oct 29 14:29 test
隨后,切換到一個普通用戶身份下,嘗試洗掉這個其他人創建的檔案就會發現,即便讀、寫、執行權限全開,但是由于SBIT特殊權限位的緣故,依然無法洗掉該檔案:
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ rm -f test
rm: cannot remove 'test': Operation not permitted
作業中對特殊權限善加使用,能夠實作很多巧妙的功能,chmod命令設定特殊權限時的引數如表5-7所示,
表5-7 SUID、SGID、SBIT特殊權限的設定引數
引數 作用
u+s 設定SUID權限
u-s 取消SUID權限
g+s 設定SGID權限
g-s 取消SGID權限
o+t 設定SBIT權限
o-t 取消SBIT權限
切換回root管理員的身份下,在家目錄中創建一個名為linux的新目錄,隨后設定上SBIT權限吧:
[linuxprobe@linuxprobe tmp]$ exit
Logout
[root@linuxprobe tmp]# cd ~
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
上面的o+t引數是在一般權限已經設定完畢的前提下,又新增了一項特殊權限,那如果我們想一般權限和特殊權限一起設定,有什么高效率的方法呢?
其實SUID、SGID與SBIT也有對應的數字法表示,分別即是4、2、1,也就是說777還不是最大權限,滿權限應該是7777,第一個數字代表的是特殊權限位,既然知道了數字表示法是由"特殊權限+一般權限"構成的,那就以上面linux目錄的權限為例為同學們梳理下計算方法吧,
在"rwxr-xr-t"權限中,最后一位是t,代表該檔案的一般權限為"rwxr-xr-x",并帶有SBIT特殊權限,對于讀(r)、寫(w)、執行(x)權限的數字計算方法大家應該很熟悉了------即755,而SBIT特殊權限位是1,合并后結果為1755,
再增加點難度,如果權限是"rwsrwSr--"呢?首先不要慌,看到大寫S代表原先沒有執行權限,因此一般權限為"rwxrw-r--",數字法計算后結果是764,帶有的SUID和SGID特殊權限數字法表示是4和2,心算得出結果是6,合并后結果為6764,這個示例確實難度高一些,讀者們可以參考學習圖5-4的計算程序,搞明白了再往下看,

圖5-4 權限的字符表示法轉數字表示法
將數字法轉換成回字符法難度略微高一些,以5537為例為大家講解,首先特殊權限的5是由4+1組成的,意味著是有SUID和SBIT,SUID和SGID的寫法是原先有執行權限則是小寫s,如果沒有執行權限則是大寫S,而SBIT的寫法則是原先有執行權限是小寫t,沒有執行權限是大寫T,一般權限的537進行字符轉換后應為"r-x-wxrwx",然后在此基礎上增加SUID和SGID特殊權限,合并后結果是"r-s-wxrwt",可以參考圖5-5所示的計算程序來學習理解,

圖5-5 權限的數字表示法轉字符標識法
3.4.3 檔案的隱藏屬性
Linux系統中的檔案除了具備一般權限和特殊權限之外,還有一種隱藏權限,即被隱藏起來的權限,默認情況下不能直接被用戶發覺,有用戶曾經在生產環境和RHCE考試題目中碰到過明明權限充足但卻無法洗掉某個檔案的情況,或者僅能在日志檔案中追加內容而不能修改或洗掉內容,這在一定程度上阻止了黑客篡改系統日志的圖謀,因此這種"奇怪"的檔案也保障了Linux系統的安全性,
既然叫隱藏權限了,那肯定不能用常規的ls命令就讓我們看到它的真面目,專用的設定命令是chattr,專用的查看命令是lsattr,
1. chattr命令
chattr命令用于設定檔案的隱藏權限,英文全稱為:"change
attributes",語法格式為:"chattr [引數] 檔案名稱",
如果想要把某個隱藏功能添加到檔案上,則需要在命令后面追加"+引數",如果想要把某個隱藏功能移出檔案,則需要追加"-引數",chattr命令中可供選擇的隱藏權限引數非常豐富,具體如表5-8所示,
表5-8 chattr命令中的引數及其作用
引數 作用
i 無法對檔案進行修改;若對目錄設定了該引數,則僅能修改其中的子檔案內容而不能新建或洗掉檔案
a 僅允許補充(追加)內容,無法覆寫/洗掉內容(Append Only)
S 檔案內容在變更后立即同步到硬碟(sync)
s 徹底從硬碟中洗掉,不可恢復(用0填充原檔案所在硬碟區域)
A 不再修改這個檔案或目錄的最后訪問時間(atime)
b 不再修改檔案或目錄的存取時間
D 檢查壓縮檔案中的錯誤
d 使用dump命令備份時忽略本檔案/目錄
c 默認將檔案或目錄進行壓縮
u 當洗掉該檔案后依然保留其在硬碟中的資料,方便日后恢復
t 讓檔案系統支持尾部合并(tail-merging)
x 可以直接訪問壓縮檔案中的內容
為了讓讀者能夠更好地見識隱藏權限的效果,我們先來創建一個普通檔案,然后立即嘗試洗掉(這個操作肯定會成功):
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
實踐是檢驗真理的唯一標準,如果您沒有親眼見證過隱藏權限強大功能的美妙,就一定不會相信原來Linux系統會如此安全,接下來再次新建一個普通檔案,并為其設定不允許洗掉與覆寫(+a引數)權限,然后再嘗試將這個檔案洗掉:
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# chattr +a linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
rm: cannot remove ‘linuxprobe’: Operation not permitted
可見,上述操作失敗了,
2. lsattr命令
lsattr命令用于查看檔案的隱藏權限,英文全稱為:"list
attributes",語法格式為:"lsattr [引數] 檔案名稱",
在Linux系統中,檔案的隱藏權限必須使用lsattr命令來查看,平時使用的ls之類的命令則看不出端倪:
[root@linuxprobe ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe
一旦使用lsattr命令后,檔案上被賦予的隱藏權限馬上就會原形畢露:
[root@linuxprobe ~]# lsattr linuxprobe
-----a---------- linuxprobe
此時按照顯示的隱藏權限的型別(字母),使用chattr命令將其去掉:
[root@linuxprobe ~]# chattr -a linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
---------------- linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
一般我們會將-a引數設定到日志檔案(/var/log/messages)上面,這樣在不影響系統正常寫入日志的前提下,還可以防止駭客清理自己的作案證據,如果希望徹底的保護起某個檔案,不允許任何人修改和洗掉它的話,不妨加上-i引數試試,效果特別好,
在熱映美劇《越獄》的第一季中,主人公邁克爾·斯科菲爾德(Scofield)把裝有越獄計劃的硬碟開窗扔進了湖中,結果在第二季被警探打撈出來恢復了資料,又有了第二、第三、第四、第五季......他和哥哥的逃亡故事,所以想徹底洗掉某個檔案時,可以使用-s引數來保證其被洗掉后不可恢復,檔案的硬碟資料會被用零塊重新填充,那就更保險了,
3.4.4 檔案訪問控制串列
不知道大家是否發現,前文講解的一般權限、特殊權限、隱藏權限其實有一個共性------權限是針對某一類用戶設定的,能夠對很多人同時生效,如果希望對某個指定的用戶進行單獨的權限控制,就需要用到檔案的訪問控制串列(FACL,File
Access Control
Lists)了,通俗來講,基于普通檔案或目錄設定ACL訪問控制其實就是針對指定的用戶或用戶組設定檔案或目錄的操作權限,更加精準的派發權限,另外,如果針對某個目錄設定了ACL,則目錄中的檔案會繼承其權限;若針對檔案設定了ACL,則檔案不再繼承其所在目錄的權限,
為了更直觀地看到ACL對檔案權限控制的強大效果,我們先切換到普通用戶,然后嘗試進入root管理員的家目錄中,在沒有針對普通用戶對root管理員的家目錄設定ACL之前,其執行結果如下所示:
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ cd /root
-bash: cd: /root: Permission denied
[gerry@gerry root]$ exit
1. setfacl命令
setfacl命令用于管理檔案的ACL權限規則,英文全稱為:"set files
ACL",語法格式為:" setfacl [引數] 檔案名稱",
ACL權限提供的是在所有者、所屬組、其他人的讀/寫/執行權限之外的特殊權限控制,使用setfacl命令可以針對單一用戶或用戶組、單一檔案或目錄來進行讀/寫/執行權限的控制,其中,針對目錄檔案需要使用-R遞回引數;針對普通檔案則使用-m引數;如果想要洗掉某個檔案的ACL,則可以使用-b引數,setfacl命令的常用引數如表5-9所示:
表5-9 setfacl命令中的引數以及作用
引數 作用
-m 修改權限
-M 從檔案中讀取權限
-x 洗掉某個權限
-b 洗掉全部權限
-R 遞回子目錄
例如我們原本是無法進入到/root目錄中的,現在給這位普通用戶單獨設定下權限吧:
[root@gerry ~]# setfacl -Rm u:gerry:rwx /root
隨后再切換到這位普通用戶的身份下,就能正常進入了呢:
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ cd /root
[gerry@linuxprobe root]$ ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[gerry@gerry root]$ exit
是不是覺得效果很酷呢?但是現在有這樣一個小問題---怎么去查看檔案上有那些ACL呢?常用的ls命令是看不到ACL表資訊的,但是卻可以看到檔案的權限最后一個點(**.**)變成了加號(**+**),這就意味著該檔案已經設定了ACL了,現在大家是不是感覺學得越多,越不敢說自己精通Linux系統了吧?就這么一個不起眼的點(.),竟然還表示這么一種重要的權限,
[root@gerry ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2020 /root
2. getfacl命令
getfacl命令用于查看檔案的ACL權限規則,英文全稱為:"get files
ACL",語法格式為:" getfacl [引數] 檔案名稱",
getfacl命令用于顯示檔案上設定的ACL資訊,格式為"getfacl
檔案名稱",Linux系統中的命令就是這么又可愛又好記,想要設定ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令,下面使用getfacl命令顯示在root管理員家目錄上設定的所有ACL資訊,
[root@gerry ~]# getfacl /root
ggetfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
ACL權限還可以針對某個用戶組來設定,例如允許某個組的用戶都可以讀寫/etc/fstab個檔案:
[root@gerry ~]# setfacl -m g:gerry:rw /etc/fstab
[root@gerry ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:gerry:rw-
mask::rw-
other::r--
設定錯了想洗掉?沒問題!清空所有ACL權限用-b引數,指定洗掉某一條權限就用-x引數:
[root@gerry ~]# setfacl -x g:gerry /etc/fstab
[root@gerry ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
對于ACL權限的設定都是立即且永久生效的,不需要再編輯什么組態檔,這點特別方便~但是也有個安全隱患,如果我們不小心設定錯了權限怎么辦?就會覆寫掉檔案原始的權限資訊,并且永遠都找不回來了,
操作前備份一下,總是好的習慣,
例如將/home目錄上的ACL權限備份一份,要用-R遞回引數,這樣不僅能夠把目錄本身的權限備份了,里面的檔案權限也都能自動備份,另再外加上第3章節學習過的輸出重定向操作就可以實作,需要注意getfacl在備份目錄權限時不能使用絕對路徑的形式,因此我們需要先切換到最上層根目錄,然后再進行操作:
[root@linuxprobe ~]# cd /
[root@linuxprobe /]# getfacl -R home > backup.acl
[root@linuxprobe /]# ls -l
-rw-r--r--. 1 root root 834 Jul 18 14:14 backup.acl
ACL權限的恢復也很簡單,使用的是"--restore"引數,由于備份時已經指定了是對home目錄進行的操作,所以不需要寫對應的目錄名稱,它能夠自動找到要恢復的物件:
[root@linuxprobe /]# setfacl --restore backup.acl
3.4.5 su命令與sudo服務
各位讀者在實驗環境中很少遇到安全問題,并且為了避免因權限因素導致配置服務失敗,從而建議使用root管理員來學習本書,但是在生產環境中還是要對安全多一份敬畏之心,不要用root管理員去做所有事情,因為一旦執行了錯誤的命令,可能會直接導致系統崩潰,這樣一來,不但客戶指責、領導批評,沒準獎金也會雞飛蛋打,但轉頭一想,盡管Linux系統為了安全性考慮,使得許多系統命令和服務只能被root管理員來使用,但是這也讓普通用戶受到了更多的權限束縛,從而導致無法順利完成特定的作業任務,
su命令可以解決切換用戶身份的需求,使得當前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:
[root@linuxprobe ~]# su - gerry
[gerry@gerry ~]$ id
uid=1000(gerry) gid=1000(gerry) groups=1000(gerry) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
細心的讀者一定會發現,上面的su命令與用戶名之間有一個減號(-),這意味著完全切換到新的用戶,即把環境變數資訊也變更為新用戶的相應資訊,而不是保留原始的資訊,強烈建議在切換用戶身份時添加這個減號(-),
另外,當從root管理員切換到普通用戶時是不需要密碼驗證的,而從普通用戶切換成root管理員就需要進行密碼驗證了;這也是一個必要的安全檢查:
[linuxprobe@linuxprobe ~]$ su - root
Password: 此處輸入管理員密碼
[root@linuxprobe ~]#
盡管像上面這樣使用su命令后,普通用戶可以完全切換到root管理員身份來完成相應作業,但這將暴露root管理員的密碼,從而增大了系統密碼被黑客獲取的幾率;這并不是最安全的方案,
接下來將介紹如何使用sudo命令把特定命令的執行權限賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的作業,也可以避免泄露root管理員密碼,我們要做的就是合理配置sudo服務,以便兼顧系統的安全性和用戶的便捷性,
Tips
授權原則:在保證普通用戶完成相應作業的前提下,盡可能少地賦予額外的權限,
sudo命令用于給普通用戶提供額外的權限,語法格式為:" sudo [引數]
用戶名",
使用sudo命令可以給普通用戶提供額外的權限來完成原本只有root管理員才能完成的任務,可以限制用戶執行指定的命令、記錄用戶執行過的每一條命令、集中的管理用戶與權限(/etc/sudoers)以及驗證密碼后一段時間內免驗證的方便措施,常見的sudo命令可用引數如表5-10所示:
表5-10 sudo命令中的可用引數以及作用
引數 作用
-h 列出幫助資訊
-l 列出當前用戶可執行的命令
-u 用戶名或UID值 以指定的用戶身份執行命令
-k 清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證
-b 在后臺執行指定的命令
-p 更改詢問密碼的提示語
當然,如果擔心直接修改組態檔會出現問題,則可以使用sudo命令提供的visudo命令來配置用戶權限,
visudo命令用于編輯配置用戶sudo權限檔案,語法格式為:" visudo [引數]",
這是一潭訓自動呼叫vi編輯器來配置/etc/sudoers權限檔案的命令,能夠解決多個用戶同時修改權限而導致的沖突問題,不僅如此,visudo命令還可以對組態檔內的引數進行語法檢查,在發現引數錯誤時進行報錯提醒,比用戶直接修改檔案更友好、安全、方便,
>>> /etc/sudoers: syntax error near line 1 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
使用visudo命令配置權限檔案時,其操作方法與Vim編輯器中用到的方法完全一致,因此在撰寫完成后記得在末行模式下保存并退出,配置權限檔案時,按照下面的格式將第101行(大約)填寫上指定的資訊:
誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的串列
誰可以使用:稍后要為那位用戶進行命令授權,
允許使用的主機:可以填寫ALL代表不限制來源主機,亦可填寫如192.168.10.0/24的網段限制來源地址,只有從允許網段登錄時才能使用sudo命令,
以誰的身份:可以填寫ALL代表系統最高權限,也可以是另外一位用戶的名字,
可執行命令的串列:可以填寫ALL代表不限制命令的串列,亦可填寫如/usr/bin/cat的檔案名稱來限制命令串列,多個命令檔案之間用逗號(,)間隔,
在Linux系統中配置服務檔案時,雖然沒有硬性規定,但從經驗來講新增的引數位置不建議太靠上,避免服務一些必要的功能沒加載完成時,我們填寫的新引數不被執行成功,一般會在組態檔中找一下相似的引數,然后在相鄰位置進行新的修改,或者選擇檔案的中下部位置,
[root@gerry ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 gerry ALL=(ALL) ALL
在填寫完畢后記得要先保存再退出,然后切換至指定的普通用戶身份,此時就可以用sudo
-l命令查看到所有可執行的命令了(下面的命令中,驗證的是該普通用戶的密碼,而不是root管理員的密碼,請讀者不要搞混了):
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for linuxprobe: 此處輸入linuxprobe用戶的密碼
Matching Defaults entries for linuxprobe on localhost:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User linuxprobe may run the following commands on localhost:
(ALL) ALL
接下來是見證奇跡的時刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的檔案資訊的,但是,只需要在想執行的命令前面加上sudo命令就行了:
[linuxprobe@linuxprobe ~]$ ls /root
ls: cannot open directory '/root': Permission denied
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果立竿見影!但是考慮到生產環境中不允許某個普通用戶擁有整個系統中所有命令的最高執行權(這也不符合前文提到的權限賦予原則,即盡可能少地賦予權限),因此ALL引數就有些不合適了,因此只能賦予普通用戶具體的命令以滿足作業需求,這也受到了必要的權限約束,如果需要讓某個用戶只能使用root管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑,否則系統會識別不出來,這時可以先使用whereis命令找出命令所對應的保存路徑:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# whereis reboot
reboot: /usr/sbin/reboot /usr/share/man/man2/reboot.2.gz /usr/share/man/man8/reboot.8.gz
然后使用visudo命令繼續編輯權限檔案,將原先101行所新增的引數作如下修改,多個命令之間用逗號(,)間隔,
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot
在編輯好后依然是先保存再退出,再次切換到指定的普通用戶,然后嘗試正常查看某個系統檔案的內容,此時系統提示沒有權限(Permission
denied),再使用sudo命令就能順利地查看檔案內容了:
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
[sudo] password for linuxprobe: 此處輸入linuxprobe用戶的密碼
root:$6$tTbuw5DkOPYqq.vI$RMk9FCGHoJOq2qAPRURTQm.Qok2nN3yFn/i4f/falVGgGND9XoiYFbrxDn16WWiziaSJ0/cR06U66ipEoGLPJ.::0:99999:7:::
bin:*:17784:0:99999:7:::
daemon:*:17784:0:99999:7:::
adm:*:17784:0:99999:7:::
lp:*:17784:0:99999:7:::
sync:*:17784:0:99999:7:::
shutdown:*:17784:0:99999:7:::
halt:*:17784:0:99999:7:::
………………省略部分輸出資訊………………
[linuxprobe@linuxprobe ~]$ exit
logout
大家千萬不要以為到這里就結束了,劉遄老師還有更壓箱底的寶貝,不知大家是否發覺在每次執行sudo命令后都會要求驗證一下密碼,雖然這個密碼就是當前登錄用戶的密碼,但是每次執行sudo命令都要輸入一次密碼其實也挺麻煩的,這時可以添加NOPASSWD引數,使得用戶下次再執行sudo命令時就不用密碼驗證啦~
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot
這樣,當切換到普通用戶后再執行命令時,就不用再頻繁地驗證密碼了,我們在日常作業中也就痛快至極了,
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ reboot
User root is logged in on tty2.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
[linuxprobe@linuxprobe ~]$ sudo reboot
同學們請細心留意上面的用戶身份變換,visudo命令只有root管理員才可以執行,普通用戶使用會提示權限不足,
3.5 組和權限設定的命令(chown,chmod)
chown
chmod
:::
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/543365.html
標籤:其他
上一篇:Linux常用命令
下一篇:docker-swarm搭建
