Sudo创建一个环境变量“ SUDO_USER”,您可以使用它来查找已登录的用户(实际上是运行Sudo的用户)。
假设您将Sudo设置为root(也可以使用Sudo访问其他用户),则可以编写脚本来自动执行以下两个步骤。
cp source target
chown $SUDO_USER target
(如果您对非root用户进行sudo,则此方法将无效,因为只有root才能放弃文件。)
自动化将需要一些工作。如果源是单个文件,而目标不是目录,那么您的工作就完成了。我假设您是问这个问题的,因为问题只是在更复杂的情况下才是实际问题,例如,在执行以下操作时:
cp /path/source/some*files /path/target/directory/
一个复杂的脚本可以确定要传递的文件和目录,预先存在的文件,实际被覆盖的文件,以及仅写入成功复制的文件的所有权。
这项工作已经完成。您可以使用cpio
-在sudo生成根目录之后,使用cpio复制文件。cpio需要复制文件的列表,因此这是一个两步过程。下面我使用ls
生成要复制的文件列表。
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
的-pdm
意思是“直通模式,根据需要创建目录,保持文件修改时间”
--owner $SUDO_USER"
使指定的用户拥有文件。
最终操作数是cpio必须在其中存储文件的目录。
要了解有关cpio令人敬畏的更多信息,请转到此处的CPIO手册页
在单个sudo命令中执行此操作也是可能的。假设您的用户有权访问文件,则仅将sudo用于cpio部分,如下所示:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
在上述情况下,我使用$ USER代替$ SUDO_USER,因为它是在Sudo运行之前进行评估的。或者,如果用户无权列出文件,则将其放入包装器脚本中,然后使用sudo运行包装器。这可能会变得更加困难,但在最简单的情况下,包装器需要两个参数,即源和目标。
这进入“ cp_as_user”包装器:
ls $1 | cpio -pdm --owner $SUDO_USER $2
然后像这样使用包装器:
sudo cp_as_user“ /路径/到/一些*文件” /路径/到/目标/目录
sudo cat /etc/foo.txt > ~/foo.txt
。出于某种原因,文件通常只能由root用户读取,因此在使非root用户可以读取副本时,请记住该原因。