是否有任何一般的准则可供遵循,以便了解为什么在运行特定命令时出现权限被拒绝错误?

是否有任何一般的准则可供遵循,以便了解为什么在运行特定命令时出现权限被拒绝错误?

我最近尝试移动文件以进行覆盖/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 中添加内容来隐藏错误消息。

是的,我们都同意,任何命令都需要事先检查。不过,有一些常见的东西需要注意:例如rmmv/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具有执行您以其他用户身份运行的命令所尝试执行的指令的权限 - 例如编辑系统配置文件。

我希望这没有让你更加困惑。

相关内容