我最近尝试移动文件以进行覆盖/dev/null
并遇到了Permission denied
错误。从过去几年使用 Ubuntu 的经验来看,我知道如果遇到此错误,我需要sudo
调用命令,然后它才会成功。这/dev/null
也是我覆盖的方法。
然而,艺术布里斯托尔发布了一个在那里发表评论说盲目调用sudo
来运行命令不是一个好习惯,我们应该在继续之前知道为什么我们被拒绝运行该命令。我倾向于同意他以及所有大力支持该评论的人的观点。但我不知道如何继续了解“为什么”。
最近,我偶然发现了这个答案并尝试运行上述命令(文件393222
的 inode 是):examples.desktop
~
$ find . -inum 393222 -exec nano {} \;
find: `./.gvfs': Permission denied
find: `./.cache/dconf': Permission denied
运行上述命令确实打开了examples.desktop
中的文件nano
,但也给出了Permission denied
两个文件夹。以下是两个文件夹的属性( 的截断输出ls -la
):
drwx------ 2 root root 4096 Mar 11 21:04 .gvfs
drwx------ 2 root root 4096 Mar 11 21:04 dconf
是否有任何一般的指导原则可以遵循,以便了解“为什么”运行特定命令时出现权限被拒绝错误?
答案1
你必须稍微动动脑子,问自己一个问题:
该应用程序实际上想要做什么?
对此问题不会有一个单一的答案,因为“权限被拒绝”错误超越了文件系统、网络和身份验证机制(仅举三例)......没有单一的方法可以找到问题......除了说“您可能没有权限做你正在做的事情”。
但我们可以看看你的例子,找出其中的问题所在。
您mv testfile /dev/null
正在读取./testfile
并写入/dev/
(取代/dev/null
)。mv
这就是当您尝试将一个文件移动至另一个文件时。
快速stat testfile /dev/null /dev/
向您显示:
File: ‘testfile’
Size: 7944 Blocks: 16 IO Block: 4096 regular file
Device: fc01h/64513d Inode: 5284807 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ oli) Gid: ( 1000/ oli)
Access: 2014-03-19 11:35:42.027427288 +0000
Modify: 2014-03-19 12:25:17.343476867 +0000
Change: 2014-03-19 12:25:17.343476867 +0000
Birth: -
File: ‘/dev/null’
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: 5h/5d Inode: 31128501 Links: 1 Device type: 1,3
Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-03-18 14:33:16.742165089 +0000
Modify: 2014-03-18 14:33:16.742165089 +0000
Change: 2014-03-18 14:33:16.742165089 +0000
Birth: -
File: ‘/dev/’
Size: 4740 Blocks: 0 IO Block: 4096 directory
Device: 5h/5d Inode: 1025 Links: 17
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-03-20 09:51:04.408762425 +0000
Modify: 2014-03-20 09:51:04.396762425 +0000
Change: 2014-03-20 09:51:04.396762425 +0000
Birth: -
- 您有阅读权限
./testfile
- 您有写权限进入/dev/null 伪字符设备。
- 您没有权限写入 /dev/(您需要用 /dev/null 替换它)
- 没有权限。
第二个示例更容易阅读。从您的输出来看:
drwx------ 2 root root 4096 Mar 11 21:04 .gvfs
drwx------ 2 root root 4096 Mar 11 21:04 dconf
这些目录归 root 所有,不允许任何其他人读取或进入。find
由于没有进入权限,所以只会弹出。
答案2
是否有任何一般的准则可供遵循,以便了解“为什么”在运行特定命令时出现权限被拒绝错误?
一般情况下,这些目录不属于您搜索时使用的用户,也不属于该组。因此,该命令会通知您无法进入该目录执行查找。/home 中有一些不属于该用户的文件。
你可以使用这个:
find /home/ -uid 0
(或类似命令ls -la| awk '{ if ($3 == "root") print $9}'
:)查找 /home 中所有由 root 拥有的文件。文件本身不会在 find 时给出错误,只有目录才会出错,因此您可以将其扩展为find /home/ -type d -uid 0
(-type f
仅用于文件)。
对于这个例子:
drwx------ 2 root root 4096 Mar 11 21:04 .gvfs
drwx------ 2 root root 4096 Mar 11 21:04 dconf
在这种情况下,您的命令应该包含sudo
阻止该消息,因为这两个不属于您的用户名,并且组和其他人都被排除在读(读)之外。所以...
sudo find . -inum 393222 -exec nano {} \;
但权限通知本身是无害的。你甚至可以通过2>/dev/null
在 find 中添加内容来隐藏错误消息。
是的,我们都同意,任何命令都需要事先检查。不过,有一些常见的东西需要注意:例如rm
或mv
,/dev/null
,/dev/random
以及 forkbombs 之类的东西(不举例了 :) )。
答案3
这完全取决于命令在做什么。这个列表很长。让我们以上面的例子为例。
您正尝试使用nano
打开一个名为.gvfs。除非您root
(通过sudo
),否则您将无法做到。
为什么?
查看左侧的文件权限。
第一个字符是d
。这意味着.gvfs是一个目录。在文本编辑器中打开目录不会给你带来太多好处,但仍然是可能的。
接下来的三个字符是rwx
。R=read、W=write 和 X=execute。这意味着用户root
对该目录具有读、写和执行权限。
我们怎么知道只root
拥有这些权限?
通常,文件权限有 10 个字符。在本例中,它们是drwx------
。
在第一个字符之后,权限以 3 个块为单位读取。前 3 个是所有者权限,接下来的 3 个是组权限,最后 3 个是世界权限。
因此,如我们所见,该目录归用户所有root
,并且组属性也root
由位可见root root
。因此,只有root
用户才有权执行任何操作.gvfs. 组内的任何其他用户root
都没有任何权限 - 从第二块 3 个文件权限可以看出:---
. 对于任何其他用户,无论其组成员身份如何,情况也是如此,从第三块 3 个文件权限可以看出:---
.
如果.gvfs拥有 的权限drwxrw-r--
,则适用以下内容:
rwx
= 目录的所有者(root
)对该目录具有读、写和执行权限。rw-
= 该组中的任何用户都root
具有读、写权限,但没有执行权限。r--
= 任何其他用户都具有只读权限。没有写入或执行权限。
每当您收到权限被拒绝错误时,您需要知道您或您正在执行的命令正在尝试做什么。
有时仅root
具有运行命令的权限,或者仅root
具有执行您以其他用户身份运行的命令所尝试执行的指令的权限 - 例如编辑系统配置文件。
我希望这没有让你更加困惑。