什麼決定了哪些 Linux 命令需要 root 訪問權限?
什麼決定了哪些 Linux 命令需要 root 訪問權限?我理解為什麼它是可取的,比如說,
apt-get
應該要求root
特權;但是這些命令與其他命令有何區別?這僅僅是執行檔的所有權和執行權限的問題嗎?
在 linux 中,root 的特權在某一時刻被劃分為“功能”,因此您可以通過查看該文件獲得 root 特權的完整列表:
man 7 capabilities
.要回答您的問題,當命令需要這些權限之一時,它需要以 root 身份執行,並且其非腳本執行檔在其文件元數據中沒有設置相關功能(例如,如果 python 腳本需要該功能,則該功能需要在shebang行中指定的python解釋器中)。
請注意,一些需要 root 訪問權限的命令不需要類似的東西,
sudo
因為它們在其執行檔中設置了 SUID 位。當任何具有執行訪問權限的人執行時,該位會導致執行檔以所有者(通常是 root)身份執行。一個例子就是sudo
它本身,因為更改使用者是它需要執行的特權操作。編輯:我從您的問題中註意到,您可能有這樣的想法,即您可以在執行命令之前確定命令是否需要 root 訪問權限。事實並非如此。程序有時可能需要 root 權限,有時則不需要,這可能是程序根據執行時提供的數據做出的決定。例如,呼叫
vim
,就像不帶參數的那樣,然後通過一系列按鍵和粘貼,告訴它向它沒有寫入權限的文件寫入一些東西,或者執行另一個本身需要 root 權限的命令。執行之前的任何命令都無法表明它最終需要 root 訪問權限。這只能在它嘗試做一些需要它的事情時才能確定。無論如何,這裡是來自 root 權限的參考手冊頁中的極少數範例:
對程序 UID 進行任意操作(setuid(2)、setreuid(2)、setresuid(2)、setfsuid(2));
繞過文件讀取、寫入和執行權限檢查。(DAC 是“自主訪問控制”的縮寫。)
繞過發送信號的權限檢查(參見 kill(2))。這包括使用 ioctl(2) KDSIGACCEPT 操作。
執行各種網路相關操作:
- 介面配置;
- IP防火牆、偽裝和會計的管理;
- 修改路由表;
將套接字綁定到 Internet 域特權埠(埠號小於 1024)。
載入和解除安裝核心模組(參見 init_module(2) 和 delete_module(2));
設置系統時鐘(settimeofday(2)、stime(2)、adjtimex(2));設置實時(硬體)時鐘。
執行一系列系統管理操作,包括:quotactl(2)、mount(2)、umount(2)、swapon(2)、swapoff(2)、sethostname(2) 和 setdomainname(2);
使用 reboot(2) 和 kexec_load(2)。
使用 chroot(2)。
提高程序nice值(nice(2),setpriority(2))並更改任意程序的nice值;
這主要是工具或程序做什麼的問題。請記住,非超級使用者只能觸摸它擁有或有權訪問的文件,任何需要能夠深入了解所有內容的工具都需要超級使用者訪問才能執行它所做的事情。可能需要超級使用者訪問權限的快速範例包括但不限於:
- 在低於 1024 的埠上打開偵聽 TCP 套接字
- 更改系統配置(例如 中的任何內容
/etc
)- 添加新的全域可訪問的庫 (
/lib
and/usr/lib
) 或二進製文件 (/bin
,/usr/bin
)- 觸摸任何不屬於進行觸摸的使用者所有且沒有足夠許可模式的文件
- 更改其他使用者文件的所有權
- 提升流程優先級(例如
renice
)- 啟動或停止大多數服務
- 核心配置(例如調整swappiness)
- 調整文件系統配額
- 寫入“完整”磁碟(大多數文件系統為 root 使用者保留一些空間)
- 以其他使用者的身份執行操作