如果我执行 a ,则会以所有者身份sudo cp /etc/foo.txt ~/foo.txt
创建新文件。root
现在,除了使用最后两个命令(ls
以澄清用例)之外,我看不出有什么办法可以解决这个问题:
belmin@server1$ ls /etc/foo.txt
> -rw------- 1 root root 3848 Mar 6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_
我会比较喜欢:
- 用一个命令完成它
sudo
。 - 不必指定我当前的用户(也许使用变量?)。
答案1
使用install
而不是cp
:
sudo install -o belmin /etc/foo.txt ~/foo.txt
答案2
答案3
如果你这样做:
sudo cat /etc/foo.txt > ~/foo.txt
然后~/foo.txt
将被外壳打开为你(因此使用您的凭据创建),然后sudo
将执行其标准输出重定向到该。
最终,该文件将归您所有。
这种方法也有助于限制root
.在这里,root
仅使用他的权限来打开/etc/foo.txt
,它不会做潜在有害的事情(打开文件进行写入,~/foo.txt
例如,如果是符号链接,则可能会产生不良后果)。
答案4
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 到 root 后,使用 cpio 来复制文件。 cpio 需要要复制的文件列表,因此这是一个两步过程。下面我用它ls
来生成要复制的文件列表。
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
意思-pdm
是“直通模式,根据需要创建目录,维护文件修改时间”
--owner $SUDO_USER"
使指定的用户拥有这些文件。
最后一个操作数是 cpio 必须存储文件的目录。
要了解有关 cpio 强大功能的更多信息,请访问CPIO 手册页在这里
也可以在单个 sudo 命令中执行此操作。假设您的用户有权访问这些文件,请仅对 cpio 部分使用 sudo,如下所示:
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 "/path/to/some*files" /path/to/target/directory