標籤:

命令前加sudo執行和用真正的root用戶執行有什麼區別?

我每次在執行的命令前面加上sudo也能獲得root許可權。問題就是為什麼有sudo這個命令?有這個命令後,root用戶好像就沒有存在的意義了不是嗎?


sudo可以用用戶的環境。

例如,假如我在用戶pansz環境中為vim配好了一套很習慣的配置,直接用root的話,那麼vim就使用root用戶的環境了,我為pansz用戶定製的屌炸天的插件都沒有了,vim成了原始配置。而用sudo則可以保持用戶的環境。

如果用切換賬號登錄的方式使用root跟普通用戶,那麼你勢必需要為root跟自己的普通用戶同步配置兩套環境,所有的常用的軟體的配置都需要兩套,久而久之,你發現維護兩套環境太累了,這樣的同步不如直接用root方便。然後,就變成了直接用root裸奔了。因而切換用戶的機制實際上鼓勵用root裸奔。

但有了sudo之後,就可以只為用戶配置一套環境。獲得root許可權時仍然使用用戶環境。這樣,允許用戶一直保持普通用戶環境。

同理,當一個主機有多個管理員時,每個人可能都不喜歡別人給root環境中指定的配置,可能導致root用戶的配置文件被改來改去,直至發生系統管理員之間的惡性衝突流血事件(逃)。

有了sudo之後,每個人在root許可權下都可以使用自己用戶的環境配置,就可以只用定義自己用戶的環境不修改root用戶的配置文件,從而互相不影響了。


sudo 執行方式, 不需要知道root的密碼,這才是sudo存在的最大意義,換言之,你可以讓某個用戶某個時間段擁有某些命令(或全部命令)的root操作許可權,但又不用給他root密碼;

當然,樓上其它幾位也說了一些用途,如可帶入用戶環境變數,這些我覺得是附加的便利,並不是關鍵特性;

sudo還有一個用途,就是可以只限制該用戶有限的命令有root許可權, 而不是給所有root的命令許可權給該用戶,具體用法可參照visudo的配置指南;

當然,sudo還可以便於審計,系統審計日誌會記錄具體對應用戶執行的命令;如果幾個人共用root賬號,事後審計稍微比較麻煩;

評論有人提到可以用sudo passwd root, sudo su 來修改密碼或繞過限制,首先,如上面我提到,可以限制這些操作,另外,這些操作也會明確記錄在系統audit log(刪除log或其它繞過系統限制的行為,正常需有其它安全工具來預防);第二,「可以修改密碼」和「修改密碼的操作」是完全不同兩回事,從系統管理員的角度來看,系統管理員(或資料庫管理員)有許可權查看、修改或拿走公司的數據,和實際進行這些操作是完全不同的一回事;


區別挺大的,但共同點,我的理解主要就一個——進程許可權。

linux進程許可權涉及三個進程屬性:real user ID、effective user ID(euid)、saved set-user-ID。一般linux裡面判斷進程許可權都是基於euid來判斷的,如果你的進程euid是0,那麼你的進程就有root許可權了。

sudo命令做的事,就是把你自己的命令進程euid改成0,然後視情況保留一些當前用戶(你)的環境變數。具體參考命令前加sudo執行和用真正的root用戶執行有什麼區別? - lixin liu 的回答。

正如命令前加sudo執行和用真正的root用戶執行有什麼區別? - aiirii wong 的回答提到的,sudo最重要的意義在於,你可以在不知道root密碼的情況下,使用root許可權,但通常需要輸入你當前用戶自己的密碼。

這裡比較有趣的是,如果你忘了root密碼,可以:

sudo passwd


根據 systemd 作者 Lennart Poettering 的說法,su / sudo 的語義不清晰,是有毛病的。 RFE: machinectl to provide starting new session on local machine · Issue #825 · systemd/systemd

因為它們做了部分隔離,在現代 Linux 系統上會導致各種問題(比如連不上 D-Bus、輸入法),使用了意料之外的 HOME 目錄等。更甚的是,有些發行版在 sudo 的 PAM 配置里載入了會話模塊 pam_systemd.so 而另一些沒有……

所以 systemd 給出了 machinectl 取代 su、polkit 取代 sudo 的解決方案。

不過我還是很少用它們,主要是:

* machinectl 命令太長

* polkit 不喜歡暫時記住密碼,一條 systemctl 命令可能得輸入兩遍密碼……

最後回到原問題。其區別取決於你的 sudo 的配置(reset / 保留了哪些環境變數、載入了哪些 PAM 模塊等等)……


sudo 並不是專用於切換到 root 用戶的,我們可以切換到其他非特權的用戶許可權下,不管哪個用戶只需要我們自己的密碼。

可以決定我們用 sudo 執行哪些命令,比如只被允許執行重新載入 apache 的配置,而不是重啟 apache。或者可以重啟 Nginx 不需要密碼,但是卻切換不到 root 的 shell 里。等等…

sudo 的每一條命令都會被記錄,可以用於安全審計。

……

這和 root 用戶存在與否是兩件不同的事情,只是平時太常見很多人濫用 sudo 了,比如有不少人就是用 sudo 切換到 root 的 shell 裡面。所以大家會有這個錯覺。


主要是運用方式的問題。

一般來說,root被認為是一種極其危險的存在,root一條命令失誤可能毀了整個系統。萬一你輸入rm -rf xxxxx 的時候不小心多按個 /呢。很多東西還是右鍵粘貼,不小心黑窗口上按個右鍵,碰巧你又剛複製過網頁的內容,呵呵自祈多福吧。

不要笑,這都是實際發生過的事。

所以我們在以root身份幹活的時候都需要w-check,也就是一個人輸命令另外一個人盯著,按回車之前要倆個人都確認了才能按。

sudo的其中一個作用就是,讓你明確知道這條命令很可能有風險,掂量掂量再按。

另一個重要作用就是渡讓少量許可權給非root用戶,比如你需要在網頁上控制一個服務重啟,你難道要用root身份啟動apache嗎?這個時候就可以配置sudo讓apache用戶可以以root身份執行某條特定的指令。


兩個層面上的事情,sudo執行就是用root許可權執行,sudo是幫助你切換到root許可權的工具,它本身並不是另一套執行機制。就像你不能說支付寶這麼方便,為什麼還需要人民幣,這就不是一個層面上的問題……

實際上就是對應到Windows下面的以其他用戶身份啟動、以管理員身份啟動這樣的功能。順便能幫你做一些許可權控制、審計日誌、免輸root密碼這樣的事情,可以讓你更好地管理高許可權命令。但不要忘了它的本質就是將一個進程以root用戶的身份執行這件事情。


環境變數不同,參考資料如下,下面有個表格比較清晰,上面不想看可以跳過。

RootSudo - Community Help Wiki


類似於Windows,直接用root相當於XP時代的管理員賬號直接用,sudo相當於UAC


真正的在系統層面的區別我說不上來,沒研究過,但至少

/***************************

* 不是所有命令都能加sudo前綴的。你試試cd

* 上述錯誤被好多熱心的小夥伴指出啦,修正如下

***************************/

sudo許可權沒法帶進目錄,user和group為root的目錄就只能在su的情況下進,sudo cd是不允許的

sudo的存在意義就不說了,普通用戶的存在是為了安全,sudo則讓普通用戶能有root級許可權去做一些事,但又能讓你區分出這並不是你應該常常做的。

當然,對於你的個人電腦,你要直接用root帳號登錄並使用是你的自由。一切誤操作損失自負。

當然,也有一些軟體出於安全考慮不允許在sudo/root下使用。


sudo su

sudo su -i

su -u

sudo -u

sudo su -u

sudo su -u -i


很簡單吧?

sudo (switch user do)是讓你暫時以另外一個用戶許可權施行一條命令。

就是在這個之前用戶的空間內以更高許可權處理事情。

如果換成 root 或其他用戶,su (switch user),這就進入了另外一個空間。或者說新的一個shell instance。之前的變數等等都沒有了。也需要刻意退出才能回到之前的用戶空間(instance)。

這些轉換用戶什麼的也可以設置不需要密碼的。但是不建議 (我這樣導致各種被hack,三次)


sudo 如朕親臨


虎符總歸是要還的。


可以隨便翻一下很老的UNIX手冊中都有說明

用戶許可權分為實效用戶和實際用戶,實際用戶就是你登錄的用戶許可權,實效用戶就是你當前使用用戶的許可權,可以大於實際用戶。

(有錯誤我知道我知道,勉強理解一下就行了)


—————————————————

From Quora.


sudo是為了讓普通用戶也有root的許可權


sudo可以讓你短暫的和文件的所有者root擁有相同的權利


只要在那個組裡,輸入自己的密碼,就能達到root的許可權~


我的理解就是WINDOWS里的給予管理員許可權執行,然而這只是暫時的。。。


推薦閱讀:

chmod -x /bin/chmod執行上述命令後,如何恢復?
如何評價微軟PowerShell將支持SSH?
非同步io有什麼優勢?
2017 年 Linux 在桌面平台上有前景嗎?
如何說服後端技術人員放棄 SQL Server 轉向 MySQL?

TAG:Linux |