我可以将包含由3个不同用户拥有的文件的子树移动到sshfs挂载点吗?

我有一个文件和文件夹树,其中大部分是由主要用户拥有,我们称之为“月桂树”。 其中一个子树由另一个用户“hardy”完全拥有。 最后,因为像mysql这样的Laurel&Hardy,有一个由“mysql”用户拥有的mysql数据目录。 所有三个用户都存在于系统中,尽pipe“mysql”没有loginshell。

(让我们把子树放在~/subtree 。)

我想将该子树移动到共享系统。 我在远程服务器/ data / main上创build了一个dir /mnt/data和dir,并使用以下命令将remote:/data/main (由远程用户“ubuntu”拥有) /mnt/data/mnt/data

 sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=$HOME/.ssh/id_rsa ubuntu@$IP:/data/main /mnt/data 

但是,我不知道如何让我的3拥有者文件树进入远程系统,或者即使我可以。 如果我运行cp -r ~/subtree /mnt/data/我在〜/ subtree中的某些mysql文件上得到权限被拒绝的错误,这些文件有perm 0700:

 cp: cannot open `mysql/data/ib_logfile0' for reading: Permission denied 

如果我运行sudo cp -r ~/subtree /mnt/data/则生成的文件现在由laurel拥有,并且mysqld将不再工作,因为它希望文件由mysql拥有。 如果我运行sudo cp -r -p ~/subtree /mnt/data/ ,我得到这些错误信息:

 cp: failed to preserve ownership for `/mnt/data/mysql/data/ib_logfile0': Permission denied ... # and on and on for every other file owned by mysql 

我build立了一个可行的系统,但是很糟糕。 我在我的服务器上创build了3个非系统用户,在那里复制了密钥,并对sshfs进行了3个独立的调用来设置它们:

 # As laurel: sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=$HOME/.ssh/id_rsa ubuntu@$IP:/data/main-laurel /mnt/data-main sudo -u hardy sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=/home/hardy/.ssh/id_rsa hardy@$IP:/data/main-hardy /mnt/data-hardy sudo -u mysql sshfs -o idmap=user -o reconnect -o allow_other -o ServerAliveInterval=15 -o IdentityFile=/home/mysql/.ssh/id_rsa ubuntu@$IP:/data/main-mysql /mnt/data-mysql cd ~/subtree cd mysql sudo -u mysql cp -r data /mnt/data-mysql/ sudo -u mysql rm -fr data cd ../ sudo -u hardy cp -r hardy /mnt/data-hardy/ sudo -u hardy rm -fr hardy cd .. cp -r subtree /mnt/data-main/ rm -fr subtree # And now link everything back together ln -s /mnt/data-main/subtree . cd /mnt/data-main/subtree ln -s ../../data-hardy/hardy . cd mysql ln -s /mnt/data-mysql/data . 

我有没有提到,我必须在两台机器上设置“mysql”和“laurel”作为非系统用户? 否则sshfs不起作用。

这工作,但还有一个复杂的。 这是一个喜剧服务器,用户可以创build新的容器类对象,每个对象都有自己的新创build的所有者。 所以当用户试图创build一个新的对象时,比如keaton ,它会立即失败,因为sshfs链接不会识别新的所有者,期望新的对象被laurel所拥有。 除非在用户创build一个新对象之前,他们首先在远程服务器上创build它,然后系统可以build立另一个链接,就像我上面显示的那个。 我不认为这会得到很好的结果。

你想要发生的事情对于SSHFS来说是不可能的。 主要原因是SSHFS作为远程主机上的特定用户运行,并且该用户不允许更改位于远程主机上的文件的所有者信息。 我不知道SSHFS甚至是否支持这个,如果你使用root作为远程用户(我不build议这样做,即使它工作,所以我没有testing它)。

如果可能的话,使用远程文件的另一种解决scheme会更好。 NFS或CIFS(Samba)都能正常工作,但需要相当多的设置,并且需要注意安全性。

最简单的方法是使用rsync作为作业,或者通过SSH将远程服务器的tar

 tar cf - /path/to/source | ssh [email protected] "cat > /path/temp/dest/file.tar" 

在此之后在目标服务器上:

 cd /path/to/destination tar xf /path/temp/dest/file.tar 

如果你绝对必须使用SSHFS来解决这个奇怪的场景,你需要使用多个SSHFS装载来完成这个任务,而不会出现许可错误。 具体而言,每个用户一个。