如何使用sudo将根文件重定向为非根文件



如何使用sudoers普通用户:

wget -q https://example.com/binary.tar.gz -O - | tar -xzO binary > /usr/local/bin/binary # Doesn't work because I can't write in /usr/local/bin as regular user

我不能使用sudo重定向>。那么,怎样做才是合适的呢?

辅助问题:我知道我可以在以下情况下使用tee:

echo "foo" > /etc/myapp.conf # Doesn't work
echo "foo" | sudo tee -a /etc/myapp.conf # Solution

但我知道这不是tee的目标。这里的问题是一样的,最佳解决方案是什么?

编辑:

  • 我不想使用像sudo sh -c 'my-command'这样的子shell。原因之一是尽可能限制以root身份启动的命令数量。
  • 这是一个需要在"linux标准"中找到解决方案的问题,而不是某种黑客攻击。
  • 我认为tee的目标是将输出写入一些文件和标准输出。我不想使用可以做到这一点的东西,而是使用已经存在的可以做到这一点的东西。

不能重定向到没有写访问权限的文件的原因是shell打开了该文件。如果只对具有特殊权限的进程使用sudo,请考虑以下示例:

$ sudo my-cmd --flag1 --flag2 > file

shell调用命令sudo,参数为:my-cmd--flag1--flag2,并尝试打开一个名为file的文件,并将sudo进程的标准输出连接到该文件的输入。

命令sudo将提升用户权限,并执行带参数--flag1--flag2的命令my-cmd

理解了这一点,也就清楚了为什么你不能用sudo作为前缀来写一个你没有权限的文件。

您可以,正如您已经发现的那样,使用tee,因为它可以将路径作为参数并打开它以进行写入。

或者你可以用特殊的权限调用另一个shell:

$ sudo sh -c 'my-cmd --flag1 --flag2 > file'

这将以升级的权限调用shellsh。然而,这变得相当乏味,因为您需要将整个命令放入sh的一个参数中。这将导致引号和glob难以正确编写。

最新更新