我正在遵循第 6 章中的示例重定向的Linux 命令行(2012)。我尝试将ls
命令的标准输出重定向到文本文件。我一直收到权限被拒绝的错误。我使用的是 Ubuntu 13.04。见下文:
ta2tyrants@Vaio:/$ ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied
我尝试使用 root 访问权限运行此命令并出现相同的错误:
ta2tyrants@Vaio:/$ sudo ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied
我做错了什么? 有办法解决这个问题吗?
答案1
解决方案 1:重定向到可以写入的文件
您当前的工作目录是/
,默认情况下只能由 root 修改。输入cd ~
以更改为您的主文件夹,或cd
后跟您要更改的目录的路径能写完后再重复一遍。
解决方案 2:重定向sh
至sudo
Shell 重定向不会传递给程序。这意味着即使在 下执行程序sudo
,重定向(如>>
)仍将在您的帐户下执行。以下是发生的情况:
sudo ls -l /usr/bin >>/ls-output.txt
-------------------------------------------------------
| execute external program | redirect stdout | what your shell sees
| sudo | command to execute as root | what sudo sees
如果您想要sudo
重定向,则需要以 root 身份运行 shell。您可以这样做:
sudo sh -c ' ls -l /usr/bin >>/ls-output.txt '
-------------------------------------------------------------------------------
| execute external program (pass the single-quoted string verbatim) | your shell
| sudo | command to execute as root | sudo
| sh | -c | execute external program | redirect stdout | root shell
这样,重定向就是sh
在 下完成的调用的一部分sudo
。
解决方案 3:重定向tee
至sudo
ls -l /usr/bin | sudo tee /ls-output.txt
-------------------------------------------------------------------------
| execute external program | pipe | execute external program | your shell
| sudo | command to execute as root | sudo
请注意,tee
在 下执行sudo
,但不在 下执行ls
。这是因为tee
需要 root 权限(写入/ls-output.txt
),而ls
不需要。如果程序生成输出做过需要 root 权限,所以你需要这sudo
两者。
sudo ls -l /root | sudo tee /ls-output.txt
--------------------------------------------------------------------------------
| execute external program | pipe | execute external program | your shell
| sudo | command to execute as root | sudo #1
| sudo | command to execute as root | sudo #2
另外,如果您不想在屏幕上显示输出,您可以将其添加>/dev/null
到行的最末尾。