sudo命令使用的幾個場景

 

在linux系統下,普通用戶沒法直接執行root用戶權限下的命令,若是想讓普通用戶執行只有root用戶才能執行的操做命令。
下面羅列下常用sudo命令的幾個場景:html

1.用戶無權限執行root命令
普通用戶登陸 shell 以後,若是自身沒有權限訪問某個文件或執行某個命令時,若該用戶得到root受權,那麼就能夠在須要執行的命令以前加上 sudo,臨時切換到root用戶的權限,完成相關的操做。在sudo於1980年先後被寫出以前,通常用戶管理系統的方式是利用su切換爲超級用戶。可是使用su的缺點之一在於必需要先告知超級用戶的密碼,而sudo使通常用戶不須要知道超級用戶的密碼便可得到權限。linux

那麼哪些用戶能夠臨時得到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的不須要輸入密碼。shell

若是咱們想讓用戶wangshibo只能在本主機(主機名爲test-huanqiu)以root帳戶執行/bin/chown、/bin/chmod 兩條命令,那麼就應該這樣配置:
[root@test-huanqiu ~]# visudo
.......
# User privilege specification
wangshibo test-huanqiu=(root) /bin/chown,/bin/chmod
若是wangshibo用戶登陸以後運行sudo命令,不知足上面三個條件命令均失敗。vim

(2)受權給用戶組:
[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
和受權給單個用戶相似,只不過將用戶名在這裏換成%組名,全部在該組中的用戶都按照此規則進行受權。對於該例,全部在 sudo 組內的用戶都有在任何終端(第一個ALL)、以任何用戶(第二個ALL)、執行任何命令(第三個ALL)的權限,查看 /etc/group 文件能夠知道哪些用戶屬於 sudo 組。安全

實例說明:
若是當前賬號在/etc/sudoers文件中被授予sudo的權限,那麼你就能夠將任何root命令做爲sudo 命令的參數,使用root權限來執行該命令。bash

好比掛載一個文件系統只能由root來執行,可是一個普通用戶也可使用sudo來掛載:
[wangshibo@test-huanqiu ~]$ sudo mount /dev/sda7 /mnt
[sudo] password for wangshibo:
首次使用會要求你輸入當前用戶的密碼,系統確實輸入正確即以 root 權限來執行 mount 命令,接下來一段時間(默認爲5分鐘)再次使用 sudo 命令就不須要輸密碼了。ide

2.vim編輯後發現忘記使用sudo
有時常常會遇到這樣的一個囧境:
使用vim對某個文件進行編輯,編輯完以後,按 ESC 以後回到普通模式,再按:wq準備保存退出時,發現沒有權限對該文件進行修改,由於在使用vim 命令時忘記在前面加sudo了。出現這種問題,大多數人的作法是隻能不保存強退,再加上 sudo 從新編輯。ui

其實大可沒必要這麼愚蠢的作法了,巧妙的作法是:
在vim的普通模式下,按 :w !sudo tee % ,這樣就能夠 root 權限來保存文件了,你也無需由於本身一時忘記加個 sudo 而沮喪懊惱了!this

實例說明:
使用guohuihui用戶在/tmp目錄下建立了一個文件,默認狀況下,wangshibo用戶對這個文件是沒有操做權限的
[root@ops-server4 ~]# su - guohuihui
[guohuihui@ops-server4 ~]$ vim /tmp/guohuihui
[guohuihui@ops-server4 ~]$ cat /tmp/guohuihui
sdfasdfsdspa

如今給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 %                   //回車
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退出,查看發現剛纔輸入的內容已經保存下來了:
[wangshibo@ops-server4 ~]$ cat /tmp/guohuihui
sdfasdfsd
12345666

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系統下的權限知識梳理

相關文章
相關標籤/搜索