权限取决于命令的执行位置

权限取决于命令的执行位置

我遇到了一个非常奇怪的行为,我不知道如何解决:操作权限取决于命令的执行位置。

我的情况:我在 Raspberry Pi 4 上设置了一个 Nextcloud 服务器。系统使用 SD 卡运行,Nextcloud 实例位于 SSD 上,通过 Docker 运行(使用 IOTstack)。就 Nextcloud 而言,一切都按预期运行。

当我想列出 Nextcloud 实例的内容时,我可能会使用 root 帐户,如下所示:

sudo ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
total 4.0K
drwxr-xr-x  3 www-data www-data 4K Nov  3 11:09  Documents

当然,这是因为root。当我尝试使用普通帐户时pi,我得到了以下信息:

ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
ls: cannot access '/media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files': Permission denied

这是因为一切都属于www-data,所以我尝试www-data并得到:

sudo -u www-data ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
ls: cannot access '/media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files': Permission denied

这不正常...我应该能够看到它们所属用户的文件。

我尝试cd安装 SSD(storage)并再次执行命令:

cd /media/pi/storage/
sudo -u www-data ls -lh ./IOTstack/volumes/nextcloud/html/data/solenoid/files
total 4.0K
drwxr-xr-x  3 www-data www-data 4K Nov  3 11:09  Documents

为什么?权限怎么会取决于命令执行的位置?为什么作为用户ls,我可以列出来自的文件,/media/pi/storage而不能列出来自的文件?应该在组中吗?/home/piwww-datawww-datapi

之前我将数据存储在 SD 卡上,/home/pi/IOTstack...但我想将文件存储在更安全的位置,同时保留更换硬件的选项。我没有遇到这个问题。

以这种“原始”方式访问文件的原因是为了通过网络将其备份到另一个存储介质。


编辑

回答@kamil-maciorowski

namei -nom /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
f: /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
 drwxr-xr-x root     root /
 drwxr-xr-x root     root media
 drwxr-x--- pi       pi   pi
 drwxr-xr-x pi       pi   storage
 drwxr-xr-x pi       pi   IOTstack
 drwxr-xr-x pi       pi   volumes
 drwxr-xr-x pi       pi   nextcloud
 drwxrwx--- www-data root html
                          data - Permission denied

答案1

有用的链接:

当你这样做

ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files

当 时pi,路径名被解析,/mediapistorageIOTstackvolumes, 并且nextcloud可以访问。然后程序进入html组件。 的所有权和模式分别htmlwww-data:rootdrwxrwx---。当您是pi(既不是www-data也不是 组root)时,最后一个三元组适用,它是---。这意味着您无法访问htmldata以及其他路径名组件。

当你这样做

ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files

当 时www-data,路径名被解析,/ 并且media可以被访问。然后程序进入pi组件。的所有权和模式分别pipi:pi和。当您是(既不是也不是 组)时,最后一个三元组适用,它是。这意味着您无法访问和进一步的路径名组件。rwxr-x---www-datapipi---pistorage

您说“这不正常”,但访问拒绝的机制与第一次尝试相同;唯一的区别是路径名组件是罪魁祸首:htmlpi。两种情况同样正常。

当您cd /media/pi/storage/作为时pi,您可以这样做,因为所有相关目录的模式都允许您这样做。

当你然后跑步

ls -lh ./IOTstack/volumes/nextcloud/html/data/solenoid/files

因为www-data, 的模式/media/pi无关紧要,因为路径名解析从 开始..IOTstack等等volumes。恰好www-data可以访问所有这些文件并因此ls起作用。

换句话说cd,执行 时,pi您将无法访问该组件www-data。然后由于 而变为pi,但工作目录不会改变。给定的路径从 开始,而不是从 开始,现在可以解析和访问它。请注意,如果您使用完整路径(即从 开始,如之前的尝试),那么无论当前工作目录如何,它仍然无法访问。www-datasudols.//

相关内容