Ash*_*ary 33 linux root permissions chmod chown
我需要wget
一些东西(在 cwd 中产生一个压缩文件),然后我必须提取它,然后做一些复制/移动/修改的事情,也许最后执行一个脚本(从下载的存档)。
现在,所有这些任务直接(wget
、提取等)或间接(运行脚本)都会导致创建文件和目录(都在当前工作目录中)。我做所有这些事情root
(无法与最终的所需用户一起做)。
问题是:在进程中创建的任何东西都归 root 或 sudo 用户所有。当我完成(有时在中途)时,我必须发出一系列chmod
和chown
命令来使事情正确。
现在,如果能以某种方式告诉系统“从现在起,当我以 root 用户身份发出命令时创建的任何文件或目录,您将创建具有这样那样的所有权和权限”,那就太好了。
Dan*_*eck 32
您可以随时sudo -u username touch filename
在你的脚本为执行root
。它通常不需要密码,具体取决于您的sudoers
配置。
或者,运行su username -c touch filename
. 附加参数提供给用户的外壳程序,外壳程序的-c
选项按照约定执行指定的命令。
一些命令(如mkdir
)支持参数来指定权限:
mkdir -m 0700 foo
Run Code Online (Sandbox Code Playgroud)
默认情况下,文件操作尊重umask
shell的设置。它定义了哪些权限被拒绝。一个umask
的0022
例如做不为组和其他组写权限。设置为0077
阻止组和其他人获得任何权限。
您可以将setgid
目录设置为让所有在其中创建的文件继承其组成员身份:
chmod g+s someDir
Run Code Online (Sandbox Code Playgroud)
某些 Unix支持setuid
( chmod u+s
)的相同行为,但不支持 Linux。
小智 15
还有另一种方式,我认为非常优雅。使用安装(1)
例如,zabbix-agentd 需要 /var/run 中的一个子文件夹,但最近的发行版使用 tmpfs 作为 /var/run,因此该目录在重新启动后无法生存。我通过创建一个文件 /etc/sysconfig/zabbix-agentd 来解决它,其中包含:
install -g zabbix -o zabbix -d /var/run/zabbix
Run Code Online (Sandbox Code Playgroud)
在类 Unix 系统上,新创建的文件和目录由创建它们的进程的所有者拥有。标准实用程序通常没有更改所创建文件的所有者的选项。
如果您重复运行某些命令,则可以使用变量$SUDO_UID
并$SUDO_GID
引用调用的用户sudo
:
sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"
Run Code Online (Sandbox Code Playgroud)
如果您想自动获取已创建(和可能已修改)的文件和目录的列表,您可以在strace
基于ptrace()
系统调用的监视下运行您的命令:
strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something
Run Code Online (Sandbox Code Playgroud)
或者您可以使用例如基于该机制的InstallwatchLD_PRELOAD
。
基于上述方法,可以创建一个工具,该工具将自动更改创建/修改文件的所有者和可能的访问权限。使用可以很简单:
sudo watch-chown do_something
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
110552 次 |
最近记录: |