來自:hazirhtml
轉載自:http://www.cnblogs.com/hazir/p/sudo_command.htmlshell
Linux 下使用 sudo
命令,可讓普通用戶也能執行一些或者所有的 root 命令。本文就對咱們經常使用到 sudo 操做情景進行簡單分析,經過一些例子來了解 sudo 命令相關的技巧。vim
普通用戶登陸 shell 以後,若是自身沒有權限訪問某個文件或執行某個命令時,若該用戶得到root受權,那麼就能夠在須要執行的命令以前加上 sudo,臨時切換到root用戶的權限,完成相關的操做。在sudo於1980年先後被寫出以前,通常用戶管理系統的方式是利用su切換爲超級用戶。可是使用su的缺點之一在於必需要先告知超級用戶的密碼,而sudo使通常用戶不須要知道超級用戶的密碼便可得到權限。安全
那麼哪些用戶能夠臨時得到 root 權限呢?這就須要在 /etc/sudoers 文件中進行配置:bash
受權給單個用戶:ide
# User privilege specification guohl ALL=(ALL) ALL
上面這個例子中:ui
若是咱們想讓用戶 test 只能在本主機(主機名爲guohl-pc)以 root 帳戶執行/bin/chown、/bin/chmod 兩條命令,那麼就應該這樣配置:this
# User privilege specification test guohl-pc=(root) /bin/chown,/bin/chmod
若是test 登陸以後運行 sudo 命令,不知足上面三個條件命令均失敗。spa
受權給用戶組:debug
# 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 來掛載:
$sudo mount /dev/sda7 /mnt [sudo] password for guohailin:
首次使用會要求你輸入當前用戶的密碼,系統確實輸入正確即以 root 權限來執行 mount 命令,接下來一段時間(默認爲5分鐘)再次使用 sudo 命令就不須要輸密碼了。
咱們常常會遇到這樣的一個囧境:使用 vim 對某個文件進行編輯,編輯完以後,按 ESC
以後回到普通模式,再按 :wq
準備保存退出時,發現沒有權限對該文件進行修改,咱們在使用 vim 命令時忘記在前面加 sudo 了。我就常常出現這種問題,以前的作法是隻能不保存強退,再加上 sudo 從新編輯。
可是從此咱們不再須要用這麼愚蠢的作法了,咱們能夠在 vim 的普通模式下,按 :w !sudo tee %
,這樣就能夠 root 權限來保存文件了,你也無需由於本身一時忘記加個 sudo 而沮喪懊惱了!
咱們還會遇到這樣稍微好一點的情形:輸入一個長長的命令,按 Enter
以後出現無權限操做,由於咱們忘記加 sudo 了。大多人的作法是按 ↑
回到上一條命令,在該命令以前加上 sudo,再執行該命令。
之後,咱們無需這樣了,只要輸入 sudo !!
便可,這裏的 !! 表明上一條命令。如:
$ head -n 4 /etc/sudoers head: cannot open `/etc/sudoers' for reading: Permission denied $ sudo !! sudo head -n 4 /etc/sudoers # /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. #
shell 是一個交互式的應用程序,在執行外部命令時經過 fork 來建立一個子進程,再經過 exec 來加載外部命令的程序來執行,可是若是一個命令是 shell 內置命令,那麼只能直接由 shell 來運行。sudo 的意思是,以別的用戶(如root)的權限來 fork 一個進程,加載程序並運行,所以 sudo 後面不能跟 shell 的內置命令,如:
$ sudo cd /sys/kernel/debugfs sudo: cd: command not found
在這種狀況,咱們又沒有 root 帳戶的密碼,咱們怎樣執行該命令呢?有種辦法就是使用 sudo 得到root shell 的權限,而後在root shell 中執行該命令。進入root shell 很簡單,輸入sudo bash
確認本用戶的密碼便可,此時你會發現命令提示符顯示當前是 root。一旦得到root shell,你能夠執行任何命令而不須要在每條命令前輸入sudo了。
另外,經常使用的shell 內置命令在這裏 有簡單介紹,咱們可使用 type 命令來查看命令的類型,如:
$ type ls ls is /bin/ls $ type umask umask is a shell builtin
做爲一個 Linux 系統的管理員,不只可讓指定的用戶或用戶組做爲root用戶或其它用戶來運行某些命令,還能將指定的用戶所輸入的命令和參數做詳細的記錄。而sudo的日誌功能就能夠用戶跟蹤用戶輸入的命令,這不只能增進系統的安全性,還能用來進行故障檢修。可是要記錄sudo的日誌還要一些簡單的配置:
建立sudo日誌文件
咱們將sudo日誌文件放置在 /var/log/sudo.log
文件中:
$ sudo touch /var/log/sudo.log
修改 /etc/rsyslog.conf
配置文件
我使用系統爲Ubuntu13.04 爲更名字,但有些系統名爲/etc/syslog.conf
,注意不一樣發行版之間的差異,在該文件加入下面一行:
local2.debug /var/log/sudo.log #空白不能用空格,必須用tab
/etc/sudoers
配置文件Defaults logfile=/var/log/sudo.log
$ sudo service rsyslog restart
查看 sudo 日誌記錄:
通過上面的配置,sudo 的全部成功和不成功的sudo
命令都記錄到文件/var/log/sudo.log 中,例如我運行幾條sudo 命令以後,查看該文件的記錄以下:
$ cat sudo.log Sep 20 22:10:51 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/cat /etc/sudoers Sep 20 22:11:36 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/sbin/service rsyslog restart Sep 20 22:11:45 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/ls Sep 20 22:12:08 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/ls /root/