重定向 shell 中的输出、权限

重定向 shell 中的输出、权限

我有一个关于权限的问题。

发行版: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 的更改文件描述符。

两种可能性:

  1. 您重定向到您(用户2)可写的文件/目录。
  2. 您编写一个包装器脚本来执行此操作并通过 sudo 调用该包装器脚本。

相关内容