Sudo 重定向 stdout 文件所有权

Sudo 重定向 stdout 文件所有权

我正在从 sudo 重定向 stdout。但是,输出文件的文件所有权属于运行 sudo 的用户,而不是 sudo 目标用户。

我以“root”身份登录并执行以下命令:

sudo -u w3svcsadm echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output  

输出文件由“root”所有者创建,但我希望“w3svcsadm”成为所有者(这给我们带来了权限问题)。我尝试了命令中的所有括号,但无法让其赋予目标用户所有权。

答案1

您需要的答案是按如下方式运行命令(或以类似的方式):

sudo -u w3svcsadm bash -c 'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'

区别在于:

  • 在您的版本中,sudo 表示以echo "TEST ran"的身份运行w3svcsadm> /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output以您当前的用户身份运行,显然是 root 用户。

  • 您实际上想要的是将整个块(包括重定向)作为 运行w3svcsadm。在我的建议中,我通过以 运行bash来实现这一点w3svcsadm,并告诉bash运行完整的命令行(echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output),然后退出。

或者,用更简单的术语来说:重定向是两个命令之间的一种管道形式,在您的情况下,您希望两个命令都由同一个用户运行。

>在心里用;(或)替换 可能有助于&&理解:命令一是echo,命令二是write standard input into this file

命令的前半部分(重定向之前)由 sudo 运行,其余部分则不运行。虽然我们通常将带有输出重定向的命令视为一个命令,但事实并非如此 - 它是两个命令,因此您需要确保这两个命令都由您想要的用户运行。

答案2

我以“root”身份登录,执行以下命令

有点奇怪的是:

  1. 使用 root 帐户运行用户任务
  2. 使用 sudo 删除 root 权限(其实只需使用 'su' 即可)

出现此问题的原因在于,您重定向了 sudo 命令的输出,而实际上您想要重定向 w3svcsadm 的输出:

sudo sudo -u w3svcsadm \
 'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'  

答案3

sudo仅适用于重定向之前的部分,使用

sudo -u w3svcsadm -c 'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'

或者你可以使用

echo "TEST ran" | sudo -u w3svcsadm tee /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output

答案4

感谢大家!

@Quantum,不幸的是我们的“sudo”版本没有“-c”选项。

@iwaseatenbyagrue 感谢您的深入解释。我知道一定是这样的,但从未想过用命令运行 bash。

@symcbean 权限的“降级”只是一个测试案例。我遇到的真正问题在于 cron 作业,当它以 root 身份创建文件时,这会导致问题。

相关内容