使用 sudo 將文件寫入使用者家中
$HOME
我最初使用as登錄/home/oleg
我需要用 sudo 執行一個命令——這恰好是一個 npm install 命令——
sudo npm install -g suman
但是,目前配置的 suman 模組的 postinstall 腳本會寫入原始使用者的主目錄
/home/oleg/.suman
….但是因為我使用 sudo 執行上述 npm install 命令,所以我無權訪問/home/oleg/.suman
.有沒有希望讓 root 使用者訪問該
/home/oleg/.suman
目錄?還是應該將 suman 的 postinstall 腳本簡單地安裝到 root 使用者的主目錄?
看起來,因為我寫了 suman :),所以我可以用 777 編寫 .suman 目錄的內容,並以這種方式授予 root 使用者的完全訪問權限。我猜想為 .suman 目錄定義的最低文件權限是什麼,以便僅授予 root 使用者和登錄使用者的讀/寫/執行訪問權限?
TL,DR:你的建議都不好。相反,當以 root 身份執行時,將狀態文件儲存在
/var
(類似/var/lib/suman
)下。Root 已經有權限
Root 具有訪問系統中所有文件的權限。所以不要更改目錄的權限:它不會對 root 有任何影響,但它會允許其他人在該目錄中讀取和寫入。儘管普遍認為,
chmod 777
做任何有用的事情都極為罕見。Root有權訪問系統中的所有文件,通常這就足夠了。有一些例外與某些文件系統類型有關,這些文件系統類型處理使用者的方式與“正常”文件系統不同。兩種主要情況是:
- NFS:客戶端上的 root 通常映射到伺服器上的不同使用者,通常是
nobody
. 這意味著當 root 打開一個文件時,它是使用nobody
.- FUSE(包括 ecryptfs,通常用於加密主目錄):除非另外配置(使用選項
allow_other
,只有 root 可以使用),否則 FUSE 文件系統僅對安裝它們的使用者可用。在這些情況下,儘管有明顯的權限,但 root 無法直接訪問某些文件。Root 仍然可以通過切換到擁有文件的帳戶來有效地訪問文件——這些是實施限制,而不是安全限制——但這有點不方便。
但是 root 應該謹慎使用該權限
如果您有一個通常以 root 身份呼叫但
HOME
設置為另一個使用者的主目錄的程序,您應該盡量避免在使用者的主目錄中創建使用者無法訪問的文件。如果
/home/oleg/.suman
已經存在並且歸 oleg 所有,那麼是否在其中寫入文件都沒有關係,因為目錄的所有者始終可以擦除該目錄中的文件(需要的是寫入權限,並且所有者始終可以授予自己權限) . 當 oleg 執行相同的程序時,如果這些文件需要被覆蓋,它將替換根擁有的文件。但是,不要創建子目錄:即使它們是空的,oleg 也無法訪問或刪除它們。問題是,如果您第一次以 root 身份執行該程序,它會創建
/home/oleg/.suman
. 簡而言之,不要那樣做——問題是如何避免它。解決方案
如果您執行
sudo -H
,則HOME
環境變數設置為 root 的主目錄,因此程序將無法訪問/home/oleg
.但有時以 root 身份執行程序是有意義的(因為它需要 root 權限)但將主目錄設置為您自己的(以讀取您的配置文件)。當然,這僅適用於以 root 身份執行的程序可以讀取該配置文件的情況——使用者界面自定義很好,但配置文件不應包含可執行程式碼之類的內容(例如,沒有 shell 通過預處理進行轉義)。如果是這種情況,程序應該讀取文件
$HOME
而不是寫入文件。如果程序需要儲存一些狀態文件,那麼當它以 root 身份執行時,它應該將它們儲存在系統目錄中(在 下
/var
),而不是使用者的主目錄。