我遇到了一个非常奇怪的行为,我不知道如何解决:操作权限取决于命令的执行位置。
我的情况:我在 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/pi
www-data
www-data
pi
之前我将数据存储在 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
,路径名被解析,/
,media
,pi
,storage
,IOTstack
,volumes
, 并且nextcloud
可以访问。然后程序进入html
组件。 的所有权和模式分别html
为www-data:root
和drwxrwx---
。当您是pi
(既不是www-data
也不是 组root
)时,最后一个三元组适用,它是---
。这意味着您无法访问html
,data
以及其他路径名组件。
当你这样做
ls -lh /media/pi/storage/IOTstack/volumes/nextcloud/html/data/solenoid/files
当 时www-data
,路径名被解析,/
并且media
可以被访问。然后程序进入pi
组件。的所有权和模式分别pi
为pi:pi
和。当您是(既不是也不是 组)时,最后一个三元组适用,它是。这意味着您无法访问和进一步的路径名组件。rwxr-x---
www-data
pi
pi
---
pi
storage
您说“这不正常”,但访问拒绝的机制与第一次尝试相同;唯一的区别是路径名组件是罪魁祸首:html
或pi
。两种情况同样正常。
当您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-data
sudo
ls
.
/
/