sudo 入門指南
你在使用 Linux 命令行時曾經得到過「 拒絕訪問 」的錯誤提示嗎?這可能是因為你正在嘗試執行一個需要 root 許可權的操作。例如,下面的截圖展示了當我嘗試複製一個二進位文件到一個系統目錄時產生的錯誤。
那麼該怎麼解決這個錯誤?很簡單,使用 sudo
命令。
用戶運行此命令後會被提示輸入他們(自己)的登錄密碼。一旦輸入了正確的密碼,操作將會成功執行。
毫無疑問,sudo
是任何在 Linux 上使用命令行的人都必須知道的命令。但是,為了更負責、更有效地使用該命令,你還是要知道一些相關(及深入)的細節。這正是我們將會在這篇文章中討論的。
在我們繼續之前,值得提一下的是,這篇文章所提到的所有命令指示都已經在 Ubuntu 14.04 LTS 下的 4.3.11 版 Bash 下通過測試。
什麼是 sudo
正如你們大部分人所知道的,sudo
用來執行需要提升許可權(通常是作為 root 用戶)的命令。在這篇文章之前的簡介部分已經討論過這樣的一個例子。然而,如果你想的話,你能用 sudo
以其它(非 root )用戶運行命令。
這是由工具提供的 -u
命令行選項所實現的。舉個例子,如下例所展示的那樣,我(himanshu
)嘗試將一個在其他用戶(howtoforge
)的 Home 目錄中的文件重命名,但是得到一個「訪問拒絕」的錯誤。然後我加上 sudo -u howtoforge
後用同樣的「mv」命令,命令成功執行了:
任何人都能用 sudo 嗎?
不是。一個用戶要能使用 sudo
,應該在 /etc/sudoers
文件里有一條跟該用戶相關的信息。下述摘自 Ubuntu 網站的一段能講得更清楚:
/etc/sudoers
文件控制了誰能以哪個用戶的身份在哪個機器上運行什麼命令,還可以控制特別的情況,例如對於特定的命令是否需要輸入密碼。這個文件由 別名 (基本變數)和 用戶標識 (控制誰能運行什麼命令)組成。
如果你正在使用 Ubuntu,讓一個用戶能運行 sudo
命令很容易:你所需要做的就是把賬戶類型改成 管理員 。這可直接在 系統設置 -> 用戶賬戶 里完成。
首先解鎖該窗口:
然後選擇你想改變用戶類型的用戶,然後將類型改成 管理員 。
然而,如果你不使用 Ubuntu,或者你的發行版沒有提供這個特性,你可以手動編輯 /etc/sudoers
文件來實現此改變。要在文件中添加這樣的一行:
[user] ALL=(ALL:ALL) ALL
無需贅言,[user]
應該用你想提升 sudo 許可權的用戶的用戶名所代替。在這裡值得提到的一件重要的事情是,官方建議通過 visudo
命令編輯該文件 —— 你需要做的就是運行下述命令:
sudo visudo
為了說清究竟是怎麼一回事,這裡有段從 visudo
手冊里的摘要:
visudo
以安全的模式編輯sudoers
文件。visudo
鎖定sudoers
文件以防多個編輯同時進行,提供基本的檢查(sanity checks)和語法錯誤檢查。如果sudoers
文件現在正在被編輯,你將會收到一個信息提示稍後再試。
關於 visudo 的更多信息,前往這裡。
什麼是 sudo 會話
如果你經常使用 sudo
命令,你肯定注意到過當你成功輸入一次密碼後,可以不用輸入密碼再運行幾次 sudo
命令。但是一段時間後,sudo
命令會再次要求你的密碼。
這種現象跟運行 sudo
命令數目無關,跟時間有關。是的,sudo
默認在輸入一次密碼後 15 分鐘內不會再次要求密碼。15 分鐘後,你會再次被要求輸入密碼。
然而,如果你想的話,你能改變這種現象。用以下命令打開 /etc/sudoers
文件:
sudo visudo
找到這一行:
Defaults env_reset
然後在這行最後添加以下變數:
Defaults env_reset,timestamp_timeout=[new-value]
[new-value]
為想要 sudo
會話持續的時間數。例如,設數值為 40。
如果你希望每次使用 sudo
命令時都要求輸入密碼,你可以把這個變數賦值為 0 。想要 sudo
會話永遠不過時,應賦值為 -1。
注意將 timestamp_timeout
的值賦為 「-1」 是強烈不推薦的。
sudo 密碼
你可能注意過,當 sudo
要求輸入密碼然後你開始輸入時,不會顯示任何東西 —— 甚至連常規的星號都沒有。雖然這不是什麼大問題,不過一些用戶就是希望顯示星號。
好消息是那有可能也很容易做到。所有你需要做的就是在 /etc/sudoers
文件里將下述的行:
Defaults env_reset
改成
Defaults env_reset,pwfeedback
然後保存文件。
現在,無論什麼時候輸入 sudo
密碼,星號都會顯示。
一些重要的 sudo 命令行參數
除了 -u
命令行參數(我們已經在這篇教程的開始部分討論過了),還有其他重要的 sudo
命令行參數值得注意。在這部分,我們將會討論其中一些。
-k 參數
考慮下這種情況:輸入密碼後你剛剛運行了幾個 sudo
驅動的命令。現在,如你所知,sudo 會話默認保持 15 分鐘。假設在這會話期間,你需要讓某些人訪問你的終端,但你不想讓他們可以使用 sudo
,你將會怎麼做?
還好,有 -k
命令行參數允許用戶取消 sudo
許可權。這是 sudo
幫助頁面 對此的解釋:
-k
,--reset-timestamp
不帶任何命令使用時,撤銷用戶緩存的憑據。換句話講,下一次使用
sudo
將會要求輸入密碼。使用這個參數不需要密碼,也可以放到一個.logout
文件中來撤銷 sudo 許可權。當與一個命令,或者一個可能需要密碼的操作一起用時,這個參數將會導致
sudo
忽略用戶緩存的憑據。結果是sudo
要求輸入密碼(如果這是被安全策略所要求的),而且不會更新用戶緩存的憑據。
-s 參數
有時你的工作要求你運行一堆需要 root 許可權的命令,你不想每次都輸入密碼。你也不想通過改變 /etc/sudoers
文件調整 sudo
會話的過期時限。
這種情況下,你可以用 sudo
的 -s
參數。這是 sudo
幫助頁面對此的解釋:
-s
,--shell
如果設置了 SHELL 環境變數或者調用用戶的密碼資料庫指定了 shell,就運行該 shell 。如果指定了命令,命令將會通過 shell 的
-c
參數將命令傳遞給該 shell 執行。如果沒有指定命令,會執行一個互動式 shell。
所以,基本上這命令參數做的是:
- 啟動一個新的 shell - 至於是哪一個 shell,參照 SHELL 環境變數賦值。如果
$SHELL
是空的,將會用/etc/passwd
中定義的 shell。 - 如果你用
-s
參數傳遞了一個命令名(例如sudo -s whoami
),實際執行的是sudo /bin/bash -c whoami
。 - 如果你沒有嘗試執行其他命令(也就是說,你只是要運行
sudo -s
),你將會得到一個有 root 許可權的互動式的 shell。
請記住,-s
命令行參數給你一個有 root 許可權的 shell,但那不是 root 環境 —— 還是執行的你自己的 .bashrc
。例如,在 sudo -s
運行的新 shell 里,執行 whoami
命令仍會返回你的用戶名,而非 root 。
-i 參數
-i
參數跟我們討論過的 -s
參數相像。然而,還是有點區別。一個重要的區別是 -i
給你的是 root 環境,意味著你的(用戶的).bashrc
被忽略。這就像沒有顯式地用 root 登錄也能成為 root 。此外,你也不用輸入 root 用戶密碼。
重要:請注意 su
命令也能讓你切換用戶(默認切換到 root )。這個命令需要你輸入 root 密碼。為了避免這一點,你可以使用 sudo
執行它(sudo su
),這樣你只需要輸入你的登錄密碼。然而,su
和 sudo su
有隱含的區別 —— 要了解它們,以及它們和 sudo -i
的區別,請看這裡 。
總結
我希望現在你至少知道了 sudo
的基本知識,以及如何調整 sudo
的默認行為。請按我們解釋過的那樣去嘗試調整 /etc/sudoers
。同時也瀏覽一下論壇討論來更深入了解 sudo
命令。
via: https://www.howtoforge.com/tutorial/sudo-beginners-guide/
作者:Himanshu Arora 譯者:ypingcn 校對:jasminepeng
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive