我有一个关于权限的问题。
发行版:Debian GNU/Linux 6.0.4 (压缩)
所以我有一个包含 php 脚本的文件夹。文件夹和文件均归 User1 所有
如果我这样做:
php script.php
我收到权限被拒绝错误。很公平;我是用户2,不是用户1。如果我做
sudo php script.php
这是有效的,因为我的用户帐户是为此设置的。
所以我编写了这个脚本来接受可选参数来输出一些东西,比如“调试”模式,所以如果我这样做:
sudo php script.php debug
它向 CLI 输出一些内容。到目前为止,一切都很好。
但有时脚本的输出太长,我无法向上滚动以查看开头的输出,因此我希望能够将输出重定向到文件。
所以我尝试了以下方法:
这给了我一个权限被拒绝的错误。
sudo php script.php debug >> results.txt
这有效
sudo touch results.txt
sudo chown User1 results.txt
sudo chmod 777 results.txt
sudo php script.php debug >> results.txt
或者,这有效
sudo su -
php script.php debug >> results.txt
所以我想知道的是......为什么第一个给我一个权限被拒绝的错误?我认为 sudo 前缀的要点是我以 root 身份运行命令,这适用于运行 php 脚本...但在我看来,这并没有扩展到执行重定向?有人可以解释为什么吗?
编辑:
所以我发现了一些东西另一个帖子在这里这样可行:
sudo php script.php debug | sudo tee results.txt
那里的答案证实了我对重定向仍在我的用户而不是 sudo 下运行的怀疑,但它没有解释为什么......任何人都可以解释为什么吗?
答案1
在命令行上工作时,shell 首先执行重定向,然后执行外部命令。这意味着重定向是在用户权限不变的情况下执行的(因为 shell 不关心 sudo 稍后介入)。
可以轻松执行的 sudo 命令>> results.txt
看不到这一点,而只是获取 /dev/stdout 的更改文件描述符。
两种可能性:
- 您重定向到您(用户2)可写的文件/目录。
- 您编写一个包装器脚本来执行此操作并通过 sudo 调用该包装器脚本。