在 sudo 時建立具有特定所有者(使用者/群組)的檔案和目錄

在 sudo 時建立具有特定所有者(使用者/群組)的檔案和目錄

我需要wget一些東西(在 cwd 中產生壓縮檔案),然後我必須將其解壓縮,然後執行一些複製/移動/修改操作,最後可能執行腳本(從下載的檔案中)。

現在,所有這些任務直接(wget、提取等)或間接(運行腳本)都會導致建立檔案和目錄(全部在目前工作目錄中)。我做所有這些事情root(無法與最終的所需用戶一起做)。

問題是:進程中創建的任何內容都歸 root 或 sudo 用戶所有。當我完成後(有時是在中途),我必須發出一系列chmodchown命令來使事情正確。

現在,如果您能以某種方式告訴系統“從現在開始,當我以 root 身份發出命令時創建的任何文件或目錄,您都將使用這樣那樣的所有權和權限來創建”,那就太好了。

答案1

sudo -u username touch filename您的腳本執行為root.它通常不需要密碼,具體取決於您的sudoers配置。

或者,運行su username -c touch filename.附加參數被提供給使用者的 shell,並且-cshell 的選項按照約定執行指定的命令。


某些命令(如mkdir)支援參數來指定權限:

mkdir -m 0700 foo

預設情況下,檔案操作遵循umaskshell 的設定。它定義了哪些權限被拒絕。例如Aumask是這樣的0022不是設定群組和其他人的寫入權限。設定為0077以阻止群組和其他人獲得任何權限。


您可以設定setgid目錄,讓其中建立的所有檔案繼承其群組成員資格:

chmod g+s someDir

一些 Unix 系統支援setuid( )的行為相同chmod u+s,但 Linux 則不然。

答案2

還有另一種方式,我認為相當優雅。使用安裝(1)

例如,zabbix-agentd 需要 /var/run 內有一個子資料夾,但最近的發行版對 /var/run 使用 tmpfs,因此該目錄在重新啟動後無法儲存。我透過建立一個檔案 /etc/sysconfig/zabbix-agentd 解決了這個問題,其中包含:

install -g zabbix -o zabbix -d /var/run/zabbix

答案3

在類別 Unix 系統上,新建立的檔案和目錄由建立它們的進程的擁有者擁有。標準實用程式通常沒有選項來更改所建立文件的擁有者。

具有原始使用者的 UID 和 GID 的變量

如果重複執行某些命令,您可以使用變數$SUDO_UID$SUDO_GID來引用呼叫的使用者sudo

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

自動取得已建立的檔案和目錄列表

如果您想自動取得已建立的(以及可能修改的)檔案和目錄的列表,您可以在strace基於ptrace()系統呼叫的監視下執行命令:

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

或者你可以使用例如安裝手錶這是基於LD_PRELOAD機制的。

進一步工作的想法

基於上述方法,可以建立一個工具來自動變更所建立/修改的檔案的擁有者和可能的存取權限。使用可以很簡單:

sudo watch-chown do_something

相關內容