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

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

我有一个文件和文件夹树,其中大部分由我们称为“laurel”的主要用户拥有。其中一个子树完全由另一个名为“hardy”的用户拥有。最后,因为 Laurel & Hardy 喜欢 mysql,所以有一个 mysql 数据目录由“mysql”用户拥有。所有这三个用户都存在于系统中,尽管“mysql”没有登录 shell。

(我们将子树放在 处~/subtree。)

我想将子树移动到共享系统。我/mnt/data在远程服务器 /data/main 上创建了一个目录和一个目录,并使用以下命令将其挂载到remote:/data/main(由远程用户“ubuntu”拥有)/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 文件上收到权限被拒绝的错误,这些文件的权限为 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

我构建了一个可以运行的笨拙系统,但它很糟糕。我在服务器上创建了 3 个非系统用户,将密钥复制到那里,并进行了 3 次单独的调用来sshfs设置它们:

# 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 将无法工作。

这可以行得通,但还有进一步的复杂因素。这是一个喜剧服务器,用户可以创建新的类似容器的对象,每个对象都有自己新创建的所有者。因此,当用户尝试创建一个新对象(例如)时,keaton它将立即失败,因为 sshfs 链接无法识别新所有者,并期望新对象由 拥有laurel。除非用户在创建新对象之前,先在远程服务器上创建它,然后系统可以设置另一个链接,就像hardy我上面展示的那样。我认为这不会很顺利。

答案1

您希望发生的事情实际上不可能通过 SSHFS 实现。主要原因是 SSHFS 以特定用户身份在远程主机上运行,​​并且该用户无权更改位于远程主机上的文件的所有者信息。我不知道如果您使用 root 作为远程用户进行挂载,SSHFS 是否支持此功能(即使它确实有效,我也不建议这样做,所以我没有测试它)。

如果可能的话,最好使用其他远程文件解决方案。NFS 或 CIFS (Samba) 都很好用,但需要相当多的设置,并且您需要注意安全性。

答案2

最简单的方法是使用rsync来完成这项工作,或者tar通过 SSH 管道连接到远程服务器。

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

答案3

如果您必须使用 SSHFS 来应对这种可以说是奇怪的情况,则需要使用多个 SSHFS 挂载来实现此目的而不会出现权限错误。具体来说,每个用户一个。

相关内容