命令前加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 susudo su -isu -usudo -usudo 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 |