所以最近我遇到了我很难找到的权限问题。是否有工具或某种方法可以找出未授予权限的原因。我想象这是如何工作的:
sudo why <user> <command to test>
sudo why voidcrawler touch foo
voidcrawler is not the owner or part of groups: root, other_user
这样的事情存在吗?
答案1
这有两个部分,据我所知,没有一个工具可以同时完成这两个部分:
- 当遇到权限被拒绝错误时,该命令正在做什么?
- 为什么会导致权限被拒绝错误?
命令在做什么?
对于像 之类的命令rm
,它通常非常明显,但其他命令的输出相当差,并且它们实际上并没有告诉您权限被拒绝错误与什么相关。
命令斯特雷斯对此非常有用。它列出了进程发出的所有系统调用和接收的信号。它可以将其中一些信息解码为人类可读的输出。
默认情况下,它将所有内容写入 stderr,但可以配置为使用开关将其写入文件-o
。
举一个简单的例子。我们可以设置一个简单的案例来rm
失败:
$ sudo mkdir foo
$ sudo touch foo/bar
$ rm -rf foo
rm: cannot remove 'foo/bar': Permission denied
为了展示 strace 如何在这里提供帮助,我们运行相同的rm
命令:
$ strace -o trace_file rm -rf foo
$ grep EACCES trace_file
unlinkat(4, "bar", 0) = -1 EACCES (Permission denied)
所以这表明调用取消链接bar
无法从已打开的目录中删除文件。
虽然我们已经知道会出现这种情况,但我们还是让它失败了。这对于诊断输出较差的更复杂的命令很有用。
我不知道有什么工具可以确定为什么某些事情会导致权限被拒绝错误,但是原因相对较少。
文件权限是迄今为止最常见的。时间这些都有详细记录所以不值得在这里列出。
另外两个可以定期发现人们的来源是:
答案2
基于命令进行检查没有多大意义,因为您必须知道该命令将要执行的操作:
- 创建新文件或目录
- 读取现有文件
- 写入现有文件
- 执行现有文件
- 删除或重命名现有文件或目录
- 更改到目录
权限并不关心哪个程序尝试这些操作。同一命令可能会根据其参数或环境执行不同的操作。