在linux系統下,普通使用者無法直接執行root使用者權限下的指令,如果想讓普通使用者執行隻有root使用者才能執行的操作指令。
下面羅列下經常使用sudo指令的幾個場景:
1.使用者無權限執行root指令
普通使用者登入 shell 之後,如果自身沒有權限通路某個檔案或執行某個指令時,若該使用者獲得root授權,那麼就可以在需要執行的指令之前加上 sudo,臨時切換到root使用者的權限,完成相關的操作。在sudo于1980年前後被寫出之前,一般使用者管理系統的方式是利用su切換為超級使用者。但是使用su的缺點之一在于必須要先告知超級使用者的密碼,而sudo使一般使用者不需要知道超級使用者的密碼即可獲得權限。
那麼哪些使用者可以臨時獲得root權限呢?這就需要在/etc/sudoers檔案中進行配置(或者直接使用visudo指令,不過隻能在root使用者下執行):
(1)授權給單個使用者:
[root@test-huanqiu ~]# visudo
.....
# User privilege specification
wangshibo ALL=(ALL) ALL
參數解釋:
1)第一個字段wangshibo指定的是使用者:可以是使用者名,也可以是别名。每個使用者設定一行,多個使用者設定多行,也可以将多個使用者設定成一個别名後再進行設定。
2)第二個字段ALL指定的是使用者所在的主機:可以是ip,也可以是主機名,表示這個sudo設定後的檔案即/etc/sudoers隻在這個主機上生效,ALL表示在所有主機上都生效!限制的一般都是本機,也就是限制使用這個檔案的主機;如果指定為"192.168.1.88="表示這個檔案隻有在這台主機上生效,如果拷貝到别的機子上是不起作用的!一般都指定為"ALL"表示所有的主機,不管檔案拷到那裡都可以用。
3)第三個字段(ALL)括号裡指定的也是使用者:指定以什麼使用者身份執行sudo,即使用sudo後可以享有所有賬号下的權限。如果要排除個别使用者,可以在括号内設定,比如ALL=(ALL,!root,!ops)。也可以設定别名
4)第四個字段ALL指定的是執行的指令:即使用sudo後可以執行所有的指令。也可以設定别名。NOPASSWD: ALL表示使用sudo的不需要輸入密碼。
如果我們想讓使用者wangshibo隻能在本主機(主機名為test-huanqiu)以root賬戶執行/bin/chown、/bin/chmod 兩條指令,那麼就應該這樣配置:
.......
wangshibo test-huanqiu=(root) /bin/chown,/bin/chmod
如果wangshibo使用者登入之後運作sudo指令,不滿足上面三個條件指令均失敗。
(2)授權給使用者組:
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL
和授權給單個使用者類似,隻不過将使用者名在這裡換成%組名,所有在該組中的使用者都按照此規則進行授權。對于該例,所有在 sudo 組内的使用者都有在任何終端(第一個ALL)、以任何使用者(第二個ALL)、執行任何指令(第三個ALL)的權限,檢視 /etc/group 檔案可以知道哪些使用者屬于 sudo 組。
執行個體說明:
如果目前帳号在/etc/sudoers檔案中被授予sudo的權限,那麼你就可以将任何root指令作為sudo 指令的參數,使用root權限來執行該指令。
比如挂載一個檔案系統隻能由root來執行,但是一個普通使用者也可以使用sudo來挂載:
[wangshibo@test-huanqiu ~]$ sudo mount /dev/sda7 /mnt
[sudo] password for wangshibo:
首次使用會要求你輸入目前使用者的密碼,系統确實輸入正确即以 root 權限來執行 mount 指令,接下來一段時間(預設為5分鐘)再次使用 sudo 指令就不需要輸密碼了。
2.vim編輯後發現忘記使用sudo
有時經常會遇到這樣的一個囧境:
使用vim對某個檔案進行編輯,編輯完之後,按 ESC 之後回到普通模式,再按:wq準備儲存退出時,發現沒有權限對該檔案進行修改,因為在使用vim 指令時忘記在前面加sudo了。出現這種問題,大多數人的做法是隻能不儲存強退,再加上 sudo 重新編輯。
其實大可不必這麼愚蠢的做法了,巧妙的做法是:
在vim的普通模式下,按 :w !sudo tee % ,這樣就可以 root 權限來儲存檔案了,你也無需因為自己一時忘記加個 sudo 而沮喪懊惱了!
使用guohuihui使用者在/tmp目錄下建立了一個檔案,預設情況下,wangshibo使用者對這個檔案是沒有操作權限的
[root@ops-server4 ~]# su - guohuihui
[guohuihui@ops-server4 ~]$ vim /tmp/guohuihui
[guohuihui@ops-server4 ~]$ cat /tmp/guohuihui
sdfasdfsd
現在給wangshibo使用者設定了sudo權限,編輯上面檔案時,忘了在指令前面加sudo指令了
[wangshibo@ops-server4 ~]$ vim /tmp/guohuihui
編輯完,直接輸入w儲存時,會報錯說沒有權限:
"/tmp/guohuihui"
"/tmp/guohuihui" E212: Can't open file for writing
Press ENTER or type command to continue
這個時候可以按:w !sudo tee %就可以正常儲存了。輕松搞定!!效果如下:
:w !sudo tee % //回車
12345666
W12: Warning: File "/tmp/guohuihui" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
這個時候回車,然後再輸入q退出,檢視發現剛才輸入的内容已經儲存下來了:
[wangshibo@ops-server4 ~]$ cat /tmp/guohuihui
3.執行root 指令忘記加sudo
還會遇到這樣稍微好一點的情形:輸入一個長長的指令,按Enter之後出現無權限操作,因為在指令前面忘記加sudo了。
大多人的做法是按 ↑ 回到上一條指令,在該指令之前加上sudo,再執行該指令。
其實,也大可不必這樣,巧妙的做法是:
隻要輸入 sudo !! 即可,這裡的 !! 代表上一條指令。如:
[wangshibo@ops-server4 ~]$ cat /etc/sudoers|tail -3
cat: /etc/sudoers: Permission denied
[wangshibo@ops-server4 ~]$ sudo !!
sudo cat /etc/sudoers|tail -3
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
----------------------------------------------------------
在linux終端下:
輸入!! 表示上一個指令
輸入Esc+.(符号點) 表示上一個指令中的最後一部分
cd - 表示切換到上一個路徑下
cd和cd ~ 表示切換到目前使用者家目錄下
4.shell内置指令使用sudo
shell是一個互動式的應用程式,在執行外部指令時通過fork來建立一個子程序,再通過exec來加載外部指令的程式來執行。
但是如果一個指令是shell内置指令,那麼隻能直接由shell 來運作。
sudo 的意思是,以别的使用者(如root)的權限來fork一個程序,加載程式并運作,是以sud 後面不能跟shell 的内置指令。
[wangshibo@ops-server4 ~]$ sudo cd cd /sys/kernel/debug/
sudo: cd: command not found
在這種情況,我們又沒有root賬戶的密碼,我們怎樣執行該指令呢?
有種辦法就是使用sudo獲得root shell 的權限,然後在root shell中執行該指令。
進入root shell 很簡單,輸入sudo bash确認本使用者的密碼即可(如果/etc/sudoers裡配置了無密碼使用sudo,就不需要駛入密碼),此時你會發現指令提示符顯示目前 root。一旦獲得root shell,你就可以執行任何指令而不需要在每條指令前輸入sudo了。
[wangshibo@ops-server4 ~]$ sudo bash //或者sudo su - 或者 sudo -s,其實就使用sudo指令切換到root下
[root@ops-server4 wangshibo]# cd /sys/kernel/debug/
[root@ops-server4 debug]#
我們可以使用 type 指令來檢視指令的類型,如:
[wangshibo@ops-server4 ~]$ type cd
cd is a shell builtin
[wangshibo@ops-server4 ~]$ type umask
umask is a shell builtin
5.sudo 操作記錄日志
作為一個Linux系統的管理者,不僅可以讓指定的使用者或使用者組作為root使用者或其它使用者來運作某些指令,還能将指定的使用者所輸入的指令和參數作詳細的記錄。
而sudo的日志功能就可以使用者跟蹤使用者輸入的指令,這不僅能增進系統的安全性,還能用來進行故障檢修。
但是要記錄sudo的日志還要一些簡單的配置:
1)建立sudo日志檔案
我們将sudo日志檔案放置在/var/log/sudo.log 檔案中:
[wangshibo@ops-server4 ~]$ sudo touch /var/log/sudo.log
2)修改/etc/rsyslog.conf配置檔案(有些版本系統的這個檔案名為/etc/syslog.conf),在該檔案加入下面一行:
[wangshibo@ops-server4 ~]$ sudo vim /etc/rsyslog.conf
.........
local2.debug /var/log/sudo.log //空白不能用空格,必須用tab
3)修改/etc/sudoers 配置檔案
注意網上很多關于sudo日志檔案配置都缺少這一步!在該檔案中加入下面一行:
[wangshibo@ops-server4 ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
4)重新開機 syslog 服務:
[wangshibo@ops-server4 ~]$ sudo service rsyslog restart
5)最後,就可以檢視sudo日志記錄了:
經過上面的配置,sudo的所有成功和不成功的sudo指令都記錄到檔案/var/log/sudo.log 中。
例如我上面運作幾條sudo 指令之後,檢視該檔案的記錄如下:
[wangshibo@ops-server4 ~]$ cat /var/log/sudo.log
Dec 3 11:28:38 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/sbin/service rsyslog restart
Dec 3 11:29:49 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/bin/cat /etc/passwd
Dec 3 11:29:56 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/usr/bin/vim /root/a.sh
Dec 3 11:30:35 : guohuihui : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.shsa
Dec 3 11:30:47 : guohuihui : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.sh
linux下的其他權限可以參考:linux系統下的權限知識梳理
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************