有没有办法告诉sudo将我的用户名设置为创建文件的所有者而不是root?


19

如果我执行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: $_

我更喜欢:

  1. 只需一个sudo命令即可完成。
  2. 无需指定我当前的用户(也许使用变量?)。

sudo cat /etc/foo.txt > ~/foo.txt。出于某种原因,文件通常只能由root用户读取,因此在使非root用户可以读取副本时,请记住该原因。
jw013 2014年

Answers:



14

POSIX兼容的cp,你可以sudo cp -p foo bar保存下列文件元数据复制时:

  • 访问时间
  • 修改时间
  • 用户身份
  • 组号
  • 模式

如果要设置其他用户,JennyD的解决方案是最好的。


2
这仅在原始文件归目标用户拥有时才有效。
珍妮D

4
我认为运行sudo的人不拥有原始文件,否则他们不需要使用sudo。
2014年

@EightBitTony您不需要sudo复制您不拥有的文件。毕竟,您只需要读取权限。
2014年

是的,我输错了-但是我认为有问题的用户ID也无法读取文件,因为他们仍然不需要sudo。因此,我们必须假定打算拥有最终文件的用户ID无法访问原始文件。无论哪种方式,这都不是sudo的“问题”。您的答案表明,不希望保留我们必须承担的所有者。
2014年

2
从理论上讲,文件可能是目标用户所有,但位于目标用户无权输入的目录中。但这不太可能:-)
珍妮·D

8

如果您这样做:

sudo cat /etc/foo.txt > ~/foo.txt

然后~/foo.txt将按您的方式(通过您的凭据创建)由外壳程序打开,然后sudo将其标准输出重定向到该外壳程序来执行。

最后,该文件将归您所有。

这种方法还有助于限制所做的工作root。在这里,root仅使用他的特权来打开/etc/foo.txt,而不做可能有害的事情(打开一个文件进行写入,例如,如果~/foo.txt是符号链接,则可能会带来不良后果)。


2
假设用户可以写入目标目录。
2014年

3

使用sudo,您切换到另一个用户。这就是命令的重点。我假设您没有对第一个文件的常规访问权限,因此您需要成为其他用户(root在这种情况下)才能获得访问权限。

有没有办法让sudo自己来管理,因为所有sudo正在做的是切换到你其他用户要执行的命令。

您将需要

  1. 继续使用两个命令(或一个复合命令)
  2. 查找另一个命令(例如,安装,在另一个答案中看到)
  3. 或编写脚本并通过执行脚本sudo

1

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“ /路径/到/一些*文件” /路径/到/目标/目录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.