我正在从 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”身份登录,执行以下命令
有点奇怪的是:
- 使用 root 帐户运行用户任务
- 使用 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 身份创建文件时,这会导致问题。