我用SSHFS将远程文件夹从另一台服务器挂载到本地服务器。使用以下命令可以顺利挂载远程文件夹:
sshfs -o allow_other someServerFromSSHConfig:/home/data/somefolder/ /some/local/folder
问题是我无法使用 chown 更改文件的所有者(无论 root 权限如何)我总是得到:
chown: changing ownership of ‘/somefolder/file.img’: Permission denied
访问该文件夹的用户是 fuse 组的成员。即使我在 sshfs 中添加了其他挂载选项来设置所有者,我也无法使用和使用userx:groupx
更改权限userx
chown -R userx:groupx [...]
我希望能够为已安装文件夹中的文件设置用户权限,但事实并非如此。
答案1
正如您在评论中所说,您以 data@remote_server 的身份进行连接 这意味着您chown
根本无法连接。sshfs 只是一个粗略的抽象,您只能执行您可以在其中执行的操作sftp data@remote_server
所有抽象都是有漏洞的,这个也是如此。
只有 root@remote_server 可以chown
登录 remote_server。在 local_server 上您是哪个用户并不重要。
请注意,sftp root@remote_server
您通常需要PermitRoot yes
或PermitRoot without-password
在远程,/etc/ssh/sshd_config
这是有风险的。
PS. 默认情况下,由于PermitRoot no
选项,sshd 根本不允许 root 登录。因此通常您无法 sshfs root@remote_host。如果您想通过 root 测试 chown 行为,我建议设置PermitRoot without-password
。这意味着当将公钥添加到时,root 可以登录/root/.ssh/authorized_keys
。使用此设置,root 不能仅通过提供 root 密码来登录,因此它有点安全。
PS2. 如果您需要更高的安全性,您可以仅为此文件共享设置另一个 sshd 实例;使用ForceCommand internal-sftp
它chroot
可以大大提高根安全性,但它需要使用新的 TCP 端口和新的防火墙例外。
答案2
如果您想为 sshfs 挂载文件夹设置特定文件所有权,则需要使用uid=USER_ID_N,gid=USER_GID_N
和
idmap=user
选项来执行此操作。
- uid, gid - 将文件的报告所有权设置为给定值;uid 是您的用户的数字用户 ID,gid 是您的用户的数字组 ID。
- idmap - 使用带有用户值的 idmap 选项来转换连接用户的 UID。
# sshfs -o idmap=user sessy@mycomputer:/home/sessy /mnt/sessy -C -p 9876
这会将远程用户“sessy”的 UID 映射到运行此进程的本地用户(上例中的“root”),而 GID 保持不变。
需要注意的一点是,您的 UID(用户 ID,即系统上用户的唯一编号)在两个主机上不一定相同。当您使用 ls -l 时,与每个文件关联的用户名会打印在第三列中。但是,在文件系统中只存储 UID,ls 只是查找 UID 并找到与其关联的用户名。在 Unix 中,重要的是 UID,而不是用户名。因此,如果您在本地主机上是 1000,在远程主机上是 1003,则 sshfs 挂载目录会为您的文件显示不同的用户名。但这不是问题,因为远程计算机上的 ssh 服务器实际上是在读取和写入文件。因此,即使它在 ls -l 中显示为不同的 UID,任何更改都将通过远程主机上的 ssh 服务器完成,该服务器将使用远程计算机的正确 UID。如果您尝试使用查看文件 UID 的程序(例如 ls 打印错误的用户名),则可能出现问题。
这idmap=用户选项确保远程用户拥有的文件归本地用户所有。如果您不使用 idmap=user,则挂载目录中的文件可能看起来归其他人所有,因为您的计算机和远程计算机对于与每个用户名关联的数字用户 ID 有不同的看法。idmap=user 不会为其他用户转换 UID。
答案3
虽然我没有测试您的具体用例chown
,但我认为我有一个类似的用例,即root
在以不同用户身份连接时读取远程服务器上的文件。经过一番搜索,我发现另一个问题正是针对这。
sudo
一个技巧是,对于 SSHFS,将启动所需 SFTP 服务器的用户特定实例。SSHFS 允许配置要启动的服务器二进制文件,并且很可能sudo
在远程计算机上。因此,只需将其配置为启动所需的 SFTP 服务器,root
连接用户的权限就不再那么重要了。就我而言,我可以轻松读取之前被拒绝权限的所有文件。
sshfs -F /[...]/.ssh/config -o sftp_server='/usr/bin/sudo /usr/lib/openssh/sftp-server' []:/mnt/[...] /mnt/[...]
重要的是将二进制文件的绝对路径配置为 sudo,并根据/etc/sudoers.d/some_user
需要进行选择配置。
bindfs
其他有趣的建议是bindfs
在远程服务器上使用 SSH,然后在绑定目录上使用 SSHFS。bindfs
可以简单地忽略权限。在阅读等情况下,它可能会有所帮助,但不确定在应用更改的情况下会如何,例如chmod
。