你在使用 Linux 命令列時曾經得到過「拒絕存取(Permission denied)」的錯誤提示嗎?這可能是因為你正在嘗試執行一個需要 root 權限的操作。例如,下面的截圖展示了當我嘗試複製一個二進位到一個系統目錄時產生的錯誤。
#shell 的拒絕存取
那麼該怎麼解決這個錯誤?很簡單,使用 sudo 指令。
#用 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 嗎?不是。一個使用者要能使用 sudo ,應該在 /etc/sudoers 檔案裡有一條跟該使用者相關的資訊。下述摘自 Ubuntu 網站的一段能講得更清楚:
/etc/sudoers 檔案控制了誰能以哪個使用者的身分在哪個機器上執行什麼命令,還可以控制特別的情況,例如對於特定的命令是否需要輸入密碼。這個檔案由別名aliases(基本變數)和使用者識別user specifications(控制誰能執行什麼指令)所組成。
如果你正在使用 Ubuntu,讓一個使用者能執行 sudo 指令很容易:你所需要做的就是把帳號類型改成管理員administrator。這可直接在 系統設定System Settings -> 使用者帳戶 User Accounts裡完成。
#sudo 用戶
#首先解鎖該視窗:
#unlocking window
然後選擇你想改變用戶類型的用戶,然後將類型改成管理員administrator。
#choose sudo accounts
然而,如果你不使用 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
env_reset
然后在这行最后添加以下变量:
Defaults env_reset,timestamp_timeout=[new-value]
[new-value] 为想要 sudo 会话持续的时间数。例如,设数值为 40。
sudo timeout value
如果你希望每次使用 sudo 命令时都要求输入密码,你可以把这个变量赋值为 0 。想要 sudo 会话永远不过时,应赋值为 -1。
注意将 timestamp_timeout 的值赋为 “-1” 是强烈不推荐的。
sudo 密码你可能注意过,当 sudo 要求输入密码然后你开始输入时,不会显示任何东西 —— 甚至连常规的星号都没有。虽然这不是什么大问题,不过一些用户就是希望显示星号。
好消息是那有可能也很容易做到。所有你需要做的就是在 /etc/sudoers 文件里将下述的行:
Defaults env_reset
改成
Defaults env_reset,pwfeedback
然后保存文件。
现在,无论什么时候输入 sudo 密码,星号都会显示。
hide the sudo password
一些重要的 sudo 命令行参数除了 -u 命令行参数(我们已经在这篇教程的开始部分讨论过了),还有其他重要的 sudo 命令行参数值得注意。在这部分,我们将会讨论其中一些。
-k 参数考虑下这种情况:输入密码后你刚刚运行了几个 sudo 驱动的命令。现在,如你所知,sudo 会话默认保持 15 分钟。假设在这会话期间,你需要让某些人访问你的终端,但你不想让他们可以使用 sudo ,你将会怎么做?
还好,有 -k 命令行参数允许用户取消 sudo 权限。这是 sudo 帮助页面(man page)对此的解释:
-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 命令。
以上是解決Linux命令列錯誤提示的方法:使用sudo命令的詳細內容。更多資訊請關注PHP中文網其他相關文章!