在sudo下以bash创建的文件和目录的默认用户

时间:2014-04-28 09:54:15

标签: macos bash permissions sudo setuid

我正在编写一个在Mac OSX下创建目录和复制文件的bash脚本。其中一些目录和文件需要放在系统拥有的文件夹中,例如 / Library / Audio / Plug-Ins ,因此我在 sudo 下运行脚本。这样的脚本可能如下所示:

copy-plugins.sh:

#!/usr/bin/env bash
mkdir -p /Library/Audio/Plug-Ins/My-Plugins
cp plugin-A.dylib /Library/Audio/Plug-Ins/My-Plugins
cp plugin-B.dylib /Library/Audio/Plug-Ins/My-Plugins

并致电:

$ sudo ./copy-plugins.sh

但是,在sudo下运行时,所有创建的目录和复制的文件都归root所有。

我希望能够在sudo下运行脚本并让文件归我的用户所有。 我可以在创建或复制每个文件/目录后调用chown

copy-plugins-cumbersome.sh:

#!/usr/bin/env bash
mkdir -p /Library/Audio/Plug-Ins/My-Plugins
chown 501:501 /Library/Audio/Plug-Ins/My-Plugins

cp plugin-A.dylib /Library/Audio/Plug-Ins/My-Plugins
chown 501:501 /Library/Audio/Plug-Ins/My-Plugins/plugin-A.dylib

cp plugin-B.dylib /Library/Audio/Plug-Ins/My-Plugins
chown 501:501  /Library/Audio/Plug-Ins/My-Plugins/plugin-B.dylib

但我希望有一个更通用的解决方案。

据我所知,bash没有setuid。

2 个答案:

答案 0 :(得分:2)

使用cp -p选项保留文件属性。

请注意,这将保留用户,群组权限文件的修改和访问时间。

答案 1 :(得分:1)

由于您需要sudo复制到您在脚本中复制到的目录,这意味着您需要root用户才能复制这些目录中的任何内容。

执行sudo时,您是该特定命令或脚本的root用户,因此无论创建或执行的任何内容都具有root权限。直到你指定的时间。

在不改变任何事情的情况下摆脱它的可能方式:

  1. 您正在使用的那个,
  2. 使用-p-acp
  3. 的其他人
  4. rsync -go <source file> <destination file>

    -g用于保存组和 -o用于保护所有权。

  5. 注意如果您执行chown脚本,则必须专门执行sudo chown,因为您要触摸的文件属于root。