当我有一个以 root 身份运行的进程,生成一个作为 www-data 的子进程,然后访问 root 拥有的目录以及 www-data 拥有的子文件夹时,我会收到权限错误,该子文件夹具有符号链接到 www-data 组中的用户所拥有的目录,然后该目录......你明白了。
我到底怎么知道在这个极其复杂的链条中它失败在哪里?我得到的只是没有权限
在不陷入这种特殊情况的细节的情况下,如何开始在 Unix 上调试这样的问题呢?
我只想说
debug_permissions.sh www-data /my/long/symlink/chain
我希望它通过符号链接链并告诉我终点在哪里(www-data 没有权限)。
我知道有一个工具
namei -l /path/
但这并不是很有帮助,因为它不允许我以另一个用户的身份运行(或者至少我不知道如何运行)。
如果我跑步sudo su www-data
,我会得到该帐户当前不可用。
我希望能够“成为”www-data 并cd
到目录周围看看我看不到的东西。但这并不允许我这样做,而且我不想创建一个新用户只是为了这样做。
答案1
啊哈,这样做是这样的:
sudo -H -u www-data namei /my/long/symlink/chain
www-data
我正在尝试调试的用户在哪里
答案2
一般来说,我有几种策略来调试文件系统权限问题。
假设一个名为 的示例用户userWhoShouldHaveAccess
应该能够列出目录的内容/dir/with/access/issues
,我将在终端中运行它来了解我尝试的任何内容是否有效:
watch sudo -u userWhoShouldHaveAccess ls /dir/with/access/issues
下面让我关注从根目录到我希望用户访问的目录的权限:
cd / && watch namei -l /dir/with/access/issues
我会记住,为了列出目录中的文件,用户必须遍历整个路径/dir/with/access/issues
,这意味着用户必须在目标目录中具有可执行权限以及所有父目录。
我会记住,对用户的组更改只有在注销并再次登录后才有效,尽管有解决方法为了那个原因。
我可以显示用户 ID 和用户所属的组id userWhoShouldHaveAccess
。
由于还有访问控制列表除了确定访问权限的所有者/组/其他权限之外,我还将检查这些权限
getfacl /dir/with/access/issues
如果用户应该能够编写,我可以在后台运行它来学习编写工作:
while true; do sudo -u userWhoShouldHaveAccess bash -c '(echo "Test at $(date) by $(whoami)" >> /dir/with/access/issues/test_file);sleep 1';done
这里是 Linux 上文件权限的一些基础知识。