
我需要wget
一些東西(在 cwd 中產生壓縮檔案),然後我必須將其解壓縮,然後執行一些複製/移動/修改操作,最後可能執行腳本(從下載的檔案中)。
現在,所有這些任務直接(wget
、提取等)或間接(運行腳本)都會導致建立檔案和目錄(全部在目前工作目錄中)。我做所有這些事情root
(無法與最終的所需用戶一起做)。
問題是:進程中創建的任何內容都歸 root 或 sudo 用戶所有。當我完成後(有時是在中途),我必須發出一系列chmod
和chown
命令來使事情正確。
現在,如果您能以某種方式告訴系統“從現在開始,當我以 root 身份發出命令時創建的任何文件或目錄,您都將使用這樣那樣的所有權和權限來創建”,那就太好了。
答案1
當sudo -u username touch filename
您的腳本執行為root
.它通常不需要密碼,具體取決於您的sudoers
配置。
或者,運行su username -c touch filename
.附加參數被提供給使用者的 shell,並且-c
shell 的選項按照約定執行指定的命令。
某些命令(如mkdir
)支援參數來指定權限:
mkdir -m 0700 foo
預設情況下,檔案操作遵循umask
shell 的設定。它定義了哪些權限被拒絕。例如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