sudo的用法


sudo的存在意義

在linux系統下,普通用戶無法直接執行root用戶權限下的命令,如果想讓普通用戶執行只有root用戶才能執行的操作命令,就需要用到sudo。
下面羅列下經常使用sudo命令的幾個場景:
 

授權普通用戶執行root指令

普通用戶登錄 shell 之后,如果自身沒有權限訪問某個文件或執行某個命令時,若該用戶獲得root授權,那么就可以在需要執行的命令之前加上 sudo,臨時切換到root用戶的權限,完成相關的操作。在sudo於1980年前后被寫出之前,一般用戶管理系統的方式是利用su切換為超級用戶。但是使用su的缺點之一在於必須要先告知超級用戶的密碼,而sudo使一般用戶不需要知道超級用戶的密碼即可獲得權限。
那么哪些用戶可以臨時獲得root權限呢?這就需要在/etc/sudoers文件中進行配置(或者直接使用visudo命令,不過只能在root用戶下執行):
[root@test-huanqiu ~]# visudo
.....
# User privilege specification
zhangj ALL=(ALL) ALL
 
參數解釋:
1)第一個字段zhangj指定的是用戶:可以是用戶名,也可以是別名。每個用戶設置一行,多個用戶設置多行,也可以將多個用戶設置成一個別名后再進行設置。
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 兩條命令,那么就應該這樣配置:
[root@test-huanqiu ~]# visudo
.......
# User privilege specification
zhangj test-huanqiu=(root) /bin/chown,/bin/chmod                                    #注意這里指令要用絕對路勁
如果zhangj用戶登錄之后運行sudo命令,不滿足上面三個條件之一的操作都將失敗。
 
此時,你在非root用戶的登錄時,就能夠通過
sudo -u root chmod 755 ***
此時回車,會讓你輸入你登錄用戶的密碼,而不是root的密碼,這樣就安全多了。
 
免密操作:
安全是安全了,但很麻煩,每次執行指令都要輸入密碼,若要消除密碼輸入操作,修改配置文件:
使用root用戶
visudo
zhangj       ALL=(root)      NOPASSWD:/usr/bin/vim            #這里的NOPASSWD就是配置支持免密執行的字段
這里設置的是vim指令能夠無密碼執行!
 

授權給用戶組:

[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 組。
 
普通用戶編輯文件沒法保存的情況:
有時經常會遇到這樣的一個囧境:
使用vim對某個文件進行編輯,編輯完之后,按 ESC 之后回到普通模式,再按:wq准備保存退出時,發現沒有權限對該文件進行修改,因為在使用vim 命令時忘記在前面加sudo了。出現這種問題,大多數人的做法是只能不保存強退,再加上 sudo 重新編輯保存,
其實大可不必這么愚蠢的做法了,巧妙的做法是:
在vim的普通模式下,按 :w !sudo tee % ,這樣就可以 root 權限來保存文件了,你也無需因為自己一時忘記加個 sudo 而沮喪懊惱了!
親測可行;
但是在下圖中:
 
 
這里選擇L,表示加載文件,再用q!退出就保存了。
 

 執行root命令忘記加sudo:

還會遇到這樣稍微好一點的情形:輸入一個長長的命令,按Enter之后出現無權限操作,因為在命令前面忘記加sudo了。
大多人的做法是按 ↑ 回到上一條命令,在該命令之前加上sudo,再執行該命令。
其實,也大可不必這樣,巧妙的做法是:
只要輸入 sudo !! 即可,這里的 !! 代表上一條命令。如:
[zhangjian@test-huanqiu ~]$ cat test
cat: test: Permission denied
[zhangjian@test-huanqiu ~]$ sudo !!
sudo cat test
lala
xiixixi'
nihao
ok,拿到了test文件的內容!
 

shell內置命令,沒法使用sudo

shell是一個交互式的應用程序,在執行外部命令時通過fork來創建一個子進程,再通過exec來加載外部命令的程序來執行。
但是如果一個命令是shell內置命令,那么只能直接由shell 來運行。
sudo 的意思是,以別的用戶(如root)的權限來fork一個進程,加載程序並運行,因此sudo后面不能跟shell 的內置命令。
實例說明:
[zhangj@test-huanqiu ~]$ sudo 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了。
[zhangj@test-huanqiu ~]$ sudo bash                   //或者sudo su - 或者 sudo -s,其實就使用sudo命令從當前用戶切換到root用戶
[root@test-huanqiu debug]# cd /sys/kernel/debug/
[root@test-huanqiu debug]#
 

sudo操作記入日志

作為一個Linux系統的管理員,不僅可以讓指定的用戶或用戶組作為root用戶或其它用戶來運行某些命令,還能將指定的用戶所輸入的命令和參數作詳細的記錄。
而sudo的日志功能就可以用戶跟蹤用戶輸入的命令,這不僅能增進系統的安全性,還能用來進行故障檢修。
1)創建sudo日志文件
我們將sudo日志文件放置在/var/log/sudo.log 文件中:
[zhangj@ops-server4 ~]$ sudo touch /var/log/sudo.log
2)修改/etc/rsyslog.conf配置文件(有些版本系統的這個文件名為/etc/syslog.conf),在該文件加入下面一行:
[zhangj@ops-server4 ~]$ sudo vim /etc/rsyslog.conf
.........
local2.debug /var/log/sudo.log //空白不能用空格,必須用tab
3)修改/etc/sudoers 配置文件
注意網上很多關於sudo日志文件配置都缺少這一步!在該文件中加入下面一行:
[zhangj@ops-server4 ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
4)重啟 syslog 服務:
[zhangj@ops-server4 ~]$ sudo service rsyslog restart
 
5)最后,就可以查看sudo日志記錄了:
經過上面的配置,sudo的所有成功和不成功的sudo命令都記錄到文件/var/log/sudo.log 中。
例如我上面運行幾條sudo 命令之后,查看該文件的記錄如下:
[zhangj@ops-server4 ~]$ cat /var/log/sudo.log
Dec 3 11:28:38 : zhangj: TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/sbin/service rsyslog restart
Dec 3 11:29:49 : zhangj : TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/bin/cat /etc/passwd
Dec 3 11:29:56 : zhangj : TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/usr/bin/vim /root/a.sh
Dec 3 11:30:35 : zhangj : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.shsa
Dec 3 11:30:47 : zhangj : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.sh
誰做了什么操作,一目了然!
很強勢!
 

為多個用戶分配不同的組:

在root用戶的情況下,編輯/etc/group文件,這個文件就是控制系統的組和用戶所屬組情況的。
groupadd sudo                 #因為沒有指定gid,所以就按着文件中的gid往后推的
sudo:x:504:                    #添加完之后在該文件中就出現了這條字段。
修改為:
sudo:x:504:batman,test            #此時,用戶batman和test的附屬組就是sudo了
此時再visudo
%sudo   ALL=(root)      NOPASSWD:/usr/bin/vim
%sudo   ALL=(root)      NOPASSWD:/bin/cat
保存退出,可以用:
visudo -c    來檢查語法
返回OK,沒問題
檢測:
-rw-------. 1 root root 1595 Jul 24 05:00 rsyncd.conf
-rw-------. 1 root root    8 Jul 24 05:00 rsyncd.pass
-rw-------. 1 root root   14 Jul 24 05:00 rsyncd.pwd
這三個文件,只有root有操作權限,現在
[test@zj rsync]$ sudo vim rsyncd.conf
發現也是ok的。
說明配置成功!
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM