sshfs 文件写入不尊重 UID/GID 映射

Nat*_*nce 5 linux home-directory sshfs

我正在使用 sshfs 远程安装我的 /home 目录。由于服务器和客户端上的 UID 和 GID 不同,因此我使用idmap=file. 此外,由于应用程序要求,我必须安装所有 /home 而不是单个用户目录。

sshfs_uids:

user1:1001
user2:1000
Run Code Online (Sandbox Code Playgroud)

sshfs_gids:

user1:1001
user2:1000
Run Code Online (Sandbox Code Playgroud)

挂载命令:

sudo sshfs -o nonempty -o transform_symlinks -o hard_remove -o allow_other -o nomap=ignore -o idmap=file -o uidfile=/root/sshfs_uids -o gidfile=/root/sshfs_gids root@myserver:/home /home
Run Code Online (Sandbox Code Playgroud)

读取文件时,一切都按预期工作(应该由 user1:user1 拥有的文件确实如此)。但是,当我以 user1 身份写入时,会发生这种情况:

user1@myclient:~$ touch foo
user1@myclient:~$ ls -l foo
-rw-r--r--. 1 root root 0 Jun 13 13:54 foo
Run Code Online (Sandbox Code Playgroud)

我的用户以 root 身份写入文件!即使执行ls -lfrom myserver 也会出现相同的 root 所有权。不过我可以手动修复它:

user1@myclient:~$ chown user1:user1 foo
user1@myclient:~$ ls -l foo
-rw-r--r--. 1 user1 user1 0 Jun 13 13:54 foo
Run Code Online (Sandbox Code Playgroud)

是否可以使用 sshfs 或 fusion 选项,使新文件归创建它们的用户所有?如果没有,我可以让 sshfs 或 fusionr 在每次写入文件时调用自定义脚本,以便我可以使用 chown 修复文件的所有权吗?

编辑:
如果以上都不可能,任何人都可以推荐一些替代的远程文件系统软件,即:

  • 可安全地通过公共互联网使用
  • 对用户/脚本透明(设置后)(所以不是普通的 scp)

  • Nat*_*nce -1

    对于遇到类似问题的其他人,我发现 ssh-tunneling nfs 可以解决问题。

    /etc/exports 上myserver

    /home localhost(insecure,rw,sync,no_subtree_check,no_root_squash)
    
    Run Code Online (Sandbox Code Playgroud)

    /etc/idmap.conf 上myservermyclient引用):

    ...
    Domain = localdomain
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    /etc/modprobe.d/nfsd.conf 上myserver

    options nfsd nfs4_disable_idmapping=0
    
    Run Code Online (Sandbox Code Playgroud)

    /etc/modprobe.d/nfs.conf 上myclient

    options nfs nfs4_disable_idmapping=0
    
    Run Code Online (Sandbox Code Playgroud)

    上述两个文件在启动时将/sys/module/nfsd/parameters/nfs4_disable_idmapping和设置/sys/module/nfs/parameters/nfs4_disable_idmapping为“N”(引用)。

    重新启动,或者重新启动两台计算机上的 nfs/idmap 相关服务并运行nfsidmap -c. 然后,建立隧道连接

    user1@myclient:~$ ssh -fN -L 3049:localhost:2049 user1@myserver
    user1@myclient:~$ sudo mount -t nfs4 -o port=3049 localhost:/home /home
    
    Run Code Online (Sandbox Code Playgroud)

    此时,防火墙只需myserver在端口 22 上打开,nfs 流量将像 ssh 一样安全。

    编辑:
    这不起作用,但似乎起作用。显然,虽然人们可能认为 idmap 应该映射 ID,但事实并非如此。至少,它只在高层次上这样做,所以某些操作会被忽略。