|
在linux系統(tǒng)下,普通用戶無法直接執(zhí)行root用戶權(quán)限下的命令,如果想讓普通用戶執(zhí)行只有root用戶才能執(zhí)行的操作命令。 下面羅列下經(jīng)常使用sudo命令的幾個場景:
1.用戶無權(quán)限執(zhí)行root命令 普通用戶登錄 shell 之后,如果自身沒有權(quán)限訪問某個文件或執(zhí)行某個命令時,若該用戶獲得root授權(quán),那么就可以在需要執(zhí)行的命令之前加上 sudo,臨時切換到root用戶的權(quán)限,完成相關(guān)的操作。在sudo于1980年前后被寫出之前,一般用戶管理系統(tǒng)的方式是利用su切換為超級用戶。但是使用su的缺點之一在于必須要先告知超級用戶的密碼,而sudo使一般用戶不需要知道超級用戶的密碼即可獲得權(quán)限。
那么哪些用戶可以臨時獲得root權(quán)限呢?這就需要在/etc/sudoers文件中進行配置(或者直接使用visudo命令,不過只能在root用戶下執(zhí)行): (1)授權(quán)給單個用戶: [root@test-huanqiu ~]# visudo ..... # User privilege specification wangshibo ALL=(ALL) ALL 參數(shù)解釋: 1)第一個字段wangshibo指定的是用戶:可以是用戶名,也可以是別名。每個用戶設置一行,多個用戶設置多行,也可以將多個用戶設置成一個別名后再進行設置。 2)第二個字段ALL指定的是用戶所在的主機:可以是ip,也可以是主機名,表示這個sudo設置后的文件即/etc/sudoers只在這個主機上生效,ALL表示在所有主機上都生效!限制的一般都是本機,也就是限制使用這個文件的主機;如果指定為"192.168.1.88="表示這個文件只有在這臺主機上生效,如果拷貝到別的機子上是不起作用的!一般都指定為"ALL"表示所有的主機,不管文件拷到那里都可以用。 3)第三個字段(ALL)括號里指定的也是用戶:指定以什么用戶身份執(zhí)行sudo,即使用sudo后可以享有所有賬號下的權(quán)限。如果要排除個別用戶,可以在括號內(nèi)設置,比如ALL=(ALL,!root,!ops)。也可以設置別名 4)第四個字段ALL指定的是執(zhí)行的命令:即使用sudo后可以執(zhí)行所有的命令。也可以設置別名。NOPASSWD: ALL表示使用sudo的不需要輸入密碼。
如果我們想讓用戶wangshibo只能在本主機(主機名為test-huanqiu)以root賬戶執(zhí)行/bin/chown、/bin/chmod 兩條命令,那么就應該這樣配置: [root@test-huanqiu ~]# visudo ....... # User privilege specification wangshibo test-huanqiu=(root) /bin/chown,/bin/chmod 如果wangshibo用戶登錄之后運行sudo命令,不滿足上面三個條件命令均失敗。
(2)授權(quán)給用戶組: [root@test-huanqiu ~]# visudo ..... # 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 和授權(quán)給單個用戶類似,只不過將用戶名在這里換成%組名,所有在該組中的用戶都按照此規(guī)則進行授權(quán)。對于該例,所有在 sudo 組內(nèi)的用戶都有在任何終端(第一個ALL)、以任何用戶(第二個ALL)、執(zhí)行任何命令(第三個ALL)的權(quán)限,查看 /etc/group 文件可以知道哪些用戶屬于 sudo 組。
實例說明: 如果當前賬號在/etc/sudoers文件中被授予sudo的權(quán)限,那么你就可以將任何root命令作為sudo 命令的參數(shù),使用root權(quán)限來執(zhí)行該命令。
比如掛載一個文件系統(tǒng)只能由root來執(zhí)行,但是一個普通用戶也可以使用sudo來掛載: [wangshibo@test-huanqiu ~]$ sudo mount /dev/sda7 /mnt [sudo] password for wangshibo: 首次使用會要求你輸入當前用戶的密碼,系統(tǒng)確實輸入正確即以 root 權(quán)限來執(zhí)行 mount 命令,接下來一段時間(默認為5分鐘)再次使用 sudo 命令就不需要輸密碼了。
2.vim編輯后發(fā)現(xiàn)忘記使用sudo 有時經(jīng)常會遇到這樣的一個囧境: 使用vim對某個文件進行編輯,編輯完之后,按 ESC 之后回到普通模式,再按:wq準備保存退出時,發(fā)現(xiàn)沒有權(quán)限對該文件進行修改,因為在使用vim 命令時忘記在前面加sudo了。出現(xiàn)這種問題,大多數(shù)人的做法是只能不保存強退,再加上 sudo 重新編輯。
其實大可不必這么愚蠢的做法了,巧妙的做法是: 在vim的普通模式下,按 :w !sudo tee % ,這樣就可以 root 權(quán)限來保存文件了,你也無需因為自己一時忘記加個 sudo 而沮喪懊惱了!
實例說明: 使用guohuihui用戶在/tmp目錄下創(chuàng)建了一個文件,默認情況下,wangshibo用戶對這個文件是沒有操作權(quán)限的 [root@ops-server4 ~]# su - guohuihui [guohuihui@ops-server4 ~]$ vim /tmp/guohuihui [guohuihui@ops-server4 ~]$ cat /tmp/guohuihui sdfasdfsd
現(xiàn)在給wangshibo用戶設置了sudo權(quán)限,編輯上面文件時,忘了在命令前面加sudo命令了 [wangshibo@ops-server4 ~]$ vim /tmp/guohuihui 編輯完,直接輸入w保存時,會報錯說沒有權(quán)限: "/tmp/guohuihui" "/tmp/guohuihui" E212: Can't open file for writing Press ENTER or type command to continue
這個時候可以按:w !sudo tee %就可以正常保存了。輕松搞定??!效果如下: :w !sudo tee % //回車 sdfasdfsd 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退出,查看發(fā)現(xiàn)剛才輸入的內(nèi)容已經(jīng)保存下來了: [wangshibo@ops-server4 ~]$ cat /tmp/guohuihui sdfasdfsd 12345666
3.執(zhí)行root 命令忘記加sudo 還會遇到這樣稍微好一點的情形:輸入一個長長的命令,按Enter之后出現(xiàn)無權(quán)限操作,因為在命令前面忘記加sudo了。 大多人的做法是按 ↑ 回到上一條命令,在該命令之前加上sudo,再執(zhí)行該命令。
其實,也大可不必這樣,巧妙的做法是: 只要輸入 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內(nèi)置命令使用sudo shell是一個交互式的應用程序,在執(zhí)行外部命令時通過fork來創(chuàng)建一個子進程,再通過exec來加載外部命令的程序來執(zhí)行。 但是如果一個命令是shell內(nèi)置命令,那么只能直接由shell 來運行。 sudo 的意思是,以別的用戶(如root)的權(quán)限來fork一個進程,加載程序并運行,因此sud 后面不能跟shell 的內(nèi)置命令。
實例說明: [wangshibo@ops-server4 ~]$ sudo cd cd /sys/kernel/debug/ sudo: cd: command not found 在這種情況,我們又沒有root賬戶的密碼,我們怎樣執(zhí)行該命令呢? 有種辦法就是使用sudo獲得root shell 的權(quán)限,然后在root shell中執(zhí)行該命令。 進入root shell 很簡單,輸入sudo bash確認本用戶的密碼即可(如果/etc/sudoers里配置了無密碼使用sudo,就不需要駛?cè)朊艽a),此時你會發(fā)現(xiàn)命令提示符顯示當前 root。一旦獲得root shell,你就可以執(zhí)行任何命令而不需要在每條命令前輸入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系統(tǒng)的管理員,不僅可以讓指定的用戶或用戶組作為root用戶或其它用戶來運行某些命令,還能將指定的用戶所輸入的命令和參數(shù)作詳細的記錄。 而sudo的日志功能就可以用戶跟蹤用戶輸入的命令,這不僅能增進系統(tǒng)的安全性,還能用來進行故障檢修。 但是要記錄sudo的日志還要一些簡單的配置: 1)創(chuàng)建sudo日志文件 我們將sudo日志文件放置在/var/log/sudo.log 文件中: [wangshibo@ops-server4 ~]$ sudo touch /var/log/sudo.log 2)修改/etc/rsyslog.conf配置文件(有些版本系統(tǒng)的這個文件名為/etc/syslog.conf),在該文件加入下面一行: [wangshibo@ops-server4 ~]$ sudo vim /etc/rsyslog.conf ......... local2.debug /var/log/sudo.log //空白不能用空格,必須用tab 3)修改/etc/sudoers 配置文件 注意網(wǎng)上很多關(guān)于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日志記錄了: 經(jīng)過上面的配置,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下的其他權(quán)限可以參考:linux系統(tǒng)下的權(quán)限知識梳理
|