我正在编写一个在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。
答案 0 :(得分:2)
使用cp -p
选项保留文件属性。
请注意,这将保留用户,群组权限和文件的修改和访问时间。
答案 1 :(得分:1)
由于您需要sudo复制到您在脚本中复制到的目录,这意味着您需要root用户才能复制这些目录中的任何内容。
执行sudo
时,您是该特定命令或脚本的root用户,因此无论创建或执行的任何内容都具有root权限。直到你指定的时间。
在不改变任何事情的情况下摆脱它的可能方式:
-p
或-a
与cp
rsync -go <source file> <destination file>
-g用于保存组和 -o用于保护所有权。
注意如果您执行chown
脚本,则必须专门执行sudo chown
,因为您要触摸的文件属于root。