![如何像 sshfs 一样将本地目录挂载到远程?](https://linux22.com/image/1369569/%E5%A6%82%E4%BD%95%E5%83%8F%20sshfs%20%E4%B8%80%E6%A0%B7%E5%B0%86%E6%9C%AC%E5%9C%B0%E7%9B%AE%E5%BD%95%E6%8C%82%E8%BD%BD%E5%88%B0%E8%BF%9C%E7%A8%8B%EF%BC%9F.png)
我知道 sshfs 用于将远程目录挂载到本地,但我需要将本地目录挂载到远程 fs。
我想挂载一个本地文件夹,例如:
/home/username/project_directory
到我有 ssh 访问权限的远程机器上,例如:
/var/www/project_directory
目标是将本地所做的编辑反映在远程文件系统上。
答案1
怎么做呢?你可以通过登录到本地机器的端口 22 来设置 ssh 转发,然后使用 sshfs 在另一端挂载。
例如,将本地计算机上的 /home/username/mywwwdevelstuff 挂载到服务器端的 /var/www:
localusername@localmachine: ssh username@server -R 10000:localmachine:22
username@server: cd /var
username@server: sshfs -p 10000 -o idmap=user,nonempty \
[email protected]:~/mywwwdevelstuff www
答案2
为了避免额外的身份验证和双重加密,您可以将端口反向转发到 22 以外的其他端口,并首先在本地通过 ncat 的 -e 选项在该端口上运行 /usr/libexec/openssh/sftp-server。然后在远程端通过 ssh 命令使用 sshfs 的“directport”选项。
ncat -l -p 34567 -e /usr/libexec/openssh/sftp-server &
ssh -t -R 34568:localhost:34567 $REMOTE "sshfs localhost: $MPOINT -o directport=34568; bash"
您将获得一个远程 shell,其中包含 $MPOINT 目录中的本地文件,并且您无需登录两次。多么方便啊。作为额外奖励,它只允许安装一次,因此如果远程计算机上的其他人尝试打开端口 34568,她将无法访问您的文件。确保端口号 34567 未在本地使用,34568 未在远程使用,否则请选择其他大于 1024 的数字。并确保 $MPOINT 目录存在于远程端。
答案3
不。
为了做到这一点,您需要做的“全部”就是反转您的逻辑。例如,您可以设置一个 1 行程序,它将 ssh 连接到远程计算机,然后使用 sshfs 将远程目录挂载到该框上的本地计算机上。当然,这可能过于简单,因为有 NAT、防火墙规则等,但您没有描述您的使用案例。
还有其他协议,如 SMB 和更好的 NFS - 但它们也会遭遇类似的问题。
你所遇到的问题的核心是机器需要信任数据源,如果你可以远程安装文件系统,这将会破坏互联网安全的核心原则之一。
答案4
我很喜欢@Ronald Hoogenboom的解决方案,但我对其进行了调整,使其与 ssh_config (~/.ssh/config) 文件配合使用,这样当我正常运行“ssh $HOSTNAME”时,它可以透明地设置所有内容:
Host $HOSTNAME
RequestTTY yes
ProxyCommand ncat -l -p 34567 -e /usr/lib/sftp-server & nc %h %p
RemoteForward 34568 localhost:34567
RemoteCommand sshfs localhost:$MY_DIR $MPOINT -o directport=34568; /bin/bash -li; fusermount -u $MPOINT
(根据需要替换 $HOSTNAME、$MY_DIR 和 $MPOINT)