我目前正在学习 shell 命令,其中一个练习是创建一个包含各种目录和子目录的结构。
我写道ls -laR > hello
,它应该创建一个名为的文本文件。但是,即使我在开始时输入 sudo,hello
我也会收到以下消息。bash: hello: permission denied
该命令在另一个 Linux 发行版中有效。另外,几分钟前我ls -la
在要创建文件的目录中使用了它,它给了我以下内容:
drwxr-xr-x 2 root root 4096 Nov 26 10:56 .
drwxr-xr-x 5 root root 4096 Nov 26 10:56 ..
根据第一个三元组,我有写作特权吗?
答案1
因为root是您要创建hello
文件的目录的所有者并且与该组用户及其他用户没有在该目录中写入的权限,所以bash: hello: permission denied
运行时会出现错误ls -laR > hello
。
sudo
此外,当你在前面使用 运行相同的命令时,你会得到完全相同的错误。这是因为输出重定向(>
操作符)由 shell 完成,而不是ls
,所以sudo
对它没有影响。sudo
只对 有影响ls -laR
。为了防止这种情况,您必须以 root 身份登录:
sudo -i
然后您可以使用重定向:
ls -laR > hello
否则,您可以以 root 权限在子 shell 中运行 bash 命令:
sudo bash -c "ls -laR > hello"
最后,还有另一种选择,不是通过操作员使用重定向>
,而是使用tee
命令:
ls -laR | sudo tee hello
在这种情况下您不必使用sudo
forls
命令,因为与 root 同一组的用户和所有其他用户都对该目录具有读取和执行权限。
答案2
将 hello 文件放在可写目录中,例如:
ls -laR > /tmp/hello
或者,如果您确实想在不属于您的目录中创建文件,请运行:
sudo sh -c "ls -laR > hello"