天天看點

sudo 入門指南

你在使用 linux 指令行時曾經得到過“拒絕通路permission denied”的錯誤提示嗎?這可能是因為你正在嘗試執行一個需要 root 權限的操作。例如,下面的截圖展示了當我嘗試複制一個二進制檔案到一個系統目錄時産生的錯誤。

sudo 入門指南

shell 的拒絕通路

那麼該怎麼解決這個錯誤?很簡單,使用 <code>sudo</code> 指令。

sudo 入門指南

用 sudo 運作指令

使用者運作此指令後會被提示輸入他們(自己)的登入密碼。一旦輸入了正确的密碼,操作将會成功執行。

毫無疑問,<code>sudo</code> 是任何在 linux 上使用指令行的人都必須知道的指令。但是,為了更負責、更有效地使用該指令,你還是要知道一些相關(及深入)的細節。這正是我們将會在這篇文章中讨論的。

在我們繼續之前,值得提一下的是,這篇文章所提到的所有指令訓示都已經在 ubuntu 14.04 lts 下的 4.3.11 版 bash 下通過測試。

<a target="_blank"></a>

正如你們大部分人所知道的,<code>sudo</code> 用來執行需要提升權限(通常是作為 root 使用者)的指令。在這篇文章之前的簡介部分已經讨論過這樣的一個例子。然而,如果你想的話,你能用 <code>sudo</code> 以其它(非 root )使用者運作指令。

這是由工具提供的 <code>-u</code> 指令行選項所實作的。舉個例子,如下例所展示的那樣,我(<code>himanshu</code>)嘗試将一個在其他使用者(<code>howtoforge</code>)的 home 目錄中的檔案重命名,但是得到一個“通路拒絕”的錯誤。然後我加上<code>sudo -u howtoforge</code> 後用同樣的“mv”指令,指令成功執行了:

sudo 入門指南

什麼是 sudo

不是。一個使用者要能使用 <code>sudo</code> ,應該在 <code>/etc/sudoers</code> 檔案裡有一條跟該使用者相關的資訊。下述摘自 ubuntu 網站的一段能講得更清楚:

<code>/etc/sudoers</code> 檔案控制了誰能以哪個使用者的身份在哪個機器上運作什麼指令,還可以控制特别的情況,例如對于特定的指令是否需要輸入密碼。這個檔案由别名aliases(基本變量)和使用者辨別user specifications(控制誰能運作什麼指令)組成。

如果你正在使用 ubuntu,讓一個使用者能運作 <code>sudo</code> 指令很容易:你所需要做的就是把賬戶類型改成管理者administrator。這可直接在 系統設定system settings -&gt; 使用者賬戶user accounts裡完成。

sudo 入門指南

sudo 使用者

首先解鎖該視窗:

sudo 入門指南

unlocking window

然後選擇你想改變使用者類型的使用者,然後将類型改成管理者administrator。

sudo 入門指南

choose sudo accounts

然而,如果你不使用 ubuntu,或者你的發行版沒有提供這個特性,你可以手動編輯 <code>/etc/sudoers</code> 檔案來實作此改變。要在檔案中添加這樣的一行:

<code>[user] all=(all:all) all</code>

無需贅言,<code>[user]</code> 應該用你想提升 sudo 權限的使用者的使用者名所代替。在這裡值得提到的一件重要的事情是,官方建議通過 <code>visudo</code> 指令編輯該檔案 —— 你需要做的就是運作下述指令:

<code>sudo visudo</code>

為了說清究竟是怎麼一回事,這裡有段從 <code>visudo</code> 手冊裡的摘要:

<code>visudo</code> 以安全的模式編輯 <code>sudoers</code> 檔案。<code>visudo</code> 鎖定 <code>sudoers</code> 檔案以防多個編輯同時進行,提供基本的檢查(sanity checks)和文法錯誤檢查。如果 <code>sudoers</code> 檔案現在正在被編輯,你将會收到一個資訊提示稍後再試。

如果你經常使用 <code>sudo</code> 指令,你肯定注意到過當你成功輸入一次密碼後,可以不用輸入密碼再運作幾次 <code>sudo</code>指令。但是一段時間後,<code>sudo</code> 指令會再次要求你的密碼。

這種現象跟運作 <code>sudo</code> 指令數目無關,跟時間有關。是的,<code>sudo</code> 預設在輸入一次密碼後 15 分鐘内不會再次要求密碼。15 分鐘後,你會再次被要求輸入密碼。

然而,如果你想的話,你能改變這種現象。用以下指令打開 <code>/etc/sudoers</code> 檔案:

找到這一行:

<code>defaults env_reset</code>

sudo 入門指南

env_reset

然後在這行最後添加以下變量:

<code>defaults env_reset,timestamp_timeout=[new-value]</code>

<code>[new-value]</code> 為想要 <code>sudo</code> 會話持續的時間數。例如,設數值為 40。

sudo 入門指南

sudo timeout value

如果你希望每次使用 <code>sudo</code> 指令時都要求輸入密碼,你可以把這個變量指派為 0 。想要 <code>sudo</code> 會話永遠不過時,應指派為 -1。

注意将 <code>timestamp_timeout</code> 的值賦為 “-1” 是強烈不推薦的。

你可能注意過,當 <code>sudo</code> 要求輸入密碼然後你開始輸入時,不會顯示任何東西 —— 甚至連正常的星号都沒有。雖然這不是什麼大問題,不過一些使用者就是希望顯示星号。

好消息是那有可能也很容易做到。所有你需要做的就是在 <code>/etc/sudoers</code> 檔案裡将下述的行:

<code>defaults env_reset</code>

改成

<code>defaults env_reset,pwfeedback</code>

然後儲存檔案。

現在,無論什麼時候輸入 <code>sudo</code> 密碼,星号都會顯示。

sudo 入門指南

hide the sudo password

除了 <code>-u</code> 指令行參數(我們已經在這篇教程的開始部分讨論過了),還有其他重要的 <code>sudo</code> 指令行參數值得注意。在這部分,我們将會讨論其中一些。

考慮下這種情況:輸入密碼後你剛剛運作了幾個 <code>sudo</code> 驅動的指令。現在,如你所知,sudo 會話預設保持 15 分鐘。假設在這會話期間,你需要讓某些人通路你的終端,但你不想讓他們可以使用 <code>sudo</code> ,你将會怎麼做?

還好,有 <code>-k</code> 指令行參數允許使用者取消 <code>sudo</code> 權限。這是 <code>sudo</code> 幫助頁面man page對此的解釋:

<code>-k</code>, <code>--reset-timestamp</code> 不帶任何指令使用時,撤銷使用者緩存的憑據。換句話講,下一次使用 <code>sudo</code> 将會要求輸入密碼。使用這個參數不需要密碼,也可以放到一個 <code>.logout</code> 檔案中來撤銷 sudo 權限。 當與一個指令,或者一個可能需要密碼的操作一起用時,這個參數将會導緻 <code>sudo</code> 忽略使用者緩存的憑據。結果是 <code>sudo</code> 要求輸入密碼(如果這是被安全政策所要求的),而且不會更新使用者緩存的憑據。

有時你的工作要求你運作一堆需要 root 權限的指令,你不想每次都輸入密碼。你也不想通過改變<code>/etc/sudoers</code> 檔案調整 <code>sudo</code> 會話的過期時限。

這種情況下,你可以用 <code>sudo</code> 的 <code>-s</code> 參數。這是 <code>sudo</code> 幫助頁面對此的解釋:

<code>-s</code>, <code>--shell</code> 如果設定了 shell 環境變量或者調用使用者的密碼資料庫指定了 shell,就運作該 shell 。如果指定了指令,指令将會通過 shell 的 <code>-c</code> 參數将指令傳遞給該 shell 執行。如果沒有指定指令,會執行一個互動式 shell。

是以,基本上這指令參數做的是:

啟動一個新的 shell - 至于是哪一個 shell,參照 shell 環境變量指派。如果 <code>$shell</code> 是空的,将會用<code>/etc/passwd</code> 中定義的 shell。

如果你用 <code>-s</code> 參數傳遞了一個指令名(例如 <code>sudo -s whoami</code>),實際執行的是 <code>sudo /bin/bash -c whoami</code>。

如果你沒有嘗試執行其他指令(也就是說,你隻是要運作 <code>sudo -s</code>),你将會得到一個有 root 權限的互動式的 shell。

請記住,<code>-s</code> 指令行參數給你一個有 root 權限的 shell,但那不是 root 環境 —— 還是執行的你自己的<code>.bashrc</code> 。例如,在 <code>sudo -s</code> 運作的新 shell 裡,執行 <code>whoami</code> 指令仍會傳回你的使用者名,而非 root 。

原文釋出時間為:2017-03-08

本文來自雲栖社群合作夥伴“linux中國”