我遇到了一个非常奇怪的行为我不知道如何解决:操作权限取决于命令执行的位置。
我的情况:我在 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
有用的链接:
我真的需要递归
chmod
来限制对文件夹的访问吗?路径名解析
当你这样做
如
pi
,路径名已解析,/
,media
,pi
,storage
,IOTstack
,volumes
, ,nextcloud
可以访问。然后程序进入html
组件。html
arewww-data:root
和drwxrwx---
分别的所有权和模式。当你是pi
(既不在组www-data
中也不在root
组中)时,最后一个三元组适用,它是---
. 这意味着您无法访问html
和data
其他路径名组件。当你这样做
as
www-data
,路径名被解析,/
并且media
可以访问。然后程序进入pi
组件。pi
arepi:pi
和rwxr-x---
分别的所有权和模式。当你是www-data
(既不在组pi
中也不在pi
组中)时,最后一个三元组适用,它是---
. 这意味着您无法访问pi
和storage
其他路径名组件。你说“这不正常”,但是拒绝访问的机制和第一次尝试的一样;唯一的区别是路径名组件是罪魁祸首:
html
或pi
. 这两种情况同样正常。当你
cd /media/pi/storage/
aspi
时,你可以这样做,因为所有相关目录的模式都允许你这样做。当你然后运行
因为
www-data
的模式/media/pi
无关紧要,因为路径名解析从.
:.
、IOTstack
等开始volumes
。碰巧www-data
可以访问所有这些文件,因此ls
可以工作。换句话说
cd
,执行为pi
使您www-data
无法访问该组件。然后pi
变成了www-data
感谢sudo
,但工作目录没有改变。给定的路径ls
从 开始.
,而不是从开始/
,现在可以解析和访问它。请注意,如果您使用了完整路径(即从 开始/
,就像在以前的尝试中一样),那么无论当前工作目录如何,它仍然无法访问。