SSHFS
SSHFS 是一个基于 FUSE 的文件系统客户端,用于通过 安全 Shell 连接挂载远程目录。
安装
- 如果您经常需要挂载 sshfs 文件系统,您可能会对使用 sshfs 助手感兴趣,例如 sftpman,sshmntAUR 或 fmount.py。
- 您可能想要使用 Google Authenticator 或 Fido Tokens,以提供额外的安全性,例如两步验证。
- SSH 密钥 可以替代传统的密码验证。
用法
挂载
为了能够挂载目录,SSH 用户需要能够访问它。调用 sshfs 以挂载远程目录
$ sshfs [user@]host:[dir] mountpoint [options]
例如
$ sshfs myuser@mycomputer:/remote/path /local/path -C -p 9876
这里 -p 9876
指定端口号,-C
启用压缩。有关更多选项,请参阅 #选项 部分。
如果未指定,则远程路径默认为远程用户的主目录。默认用户名和选项可以在 ~/.ssh/config
中按主机预定义,以简化 sshfs 的使用。有关更多信息,请参阅 OpenSSH#客户端用法。
如果需要,SSH 将询问密码。如果您不想每天多次输入密码,请参阅 SSH 密钥。
卸载
要卸载远程系统
$ fusermount3 -u mountpoint
示例
$ fusermount3 -u /local/path
选项
完整的选项列表可以在 sshfs(1) 和 mount.fuse(8) 中找到。
用户 ID 映射
sshfs 可以自动转换本地和远程用户 ID。使用 idmap=user
选项将连接用户的 UID 转换为远程用户 myuser
(GID 保持不变)
$ sshfs myuser@mycomputer:/remote/path /local/path -o idmap=user
如果您需要更多地控制 UID 和 GID 转换,请查看选项 idmap=file
、uidfile
和 gidfile
。
allow_root 或 allow_other
$ sshfs myuser@mycomputer:/remote/path /local/path -o allow_other,default_permissions,uid=1002,gid=1002
allow_other
- 允许挂载者(即 root 用户)以外的其他用户访问共享。allow_root
- 类似于 allow_other,但文件访问仅限于挂载文件系统的用户和 root 用户。
allow_root 和 allow_other 是互斥的。此外,您需要编辑 /etc/fuse.conf
并取消注释字符串 user_allow_other
以允许所有用户使用这些选项。
default_permissions
- 也可能被使用,因为 fuse 默认情况下不检查文件访问权限。即使用远程文件系统上的实际权限。这允许禁止访问原本由 allow_other 授予的每个人。
更改挂载点所有权
uid
,gid
- 将报告的文件所有权设置为给定的值;uid 是您的用户的数字用户 ID,gid 是您的用户的数字组 ID。
技巧与提示
Chroot
您可能想要将特定用户限制在远程系统上的特定目录中。这可以通过编辑 /etc/ssh/sshd_config
来完成
/etc/ssh/sshd_config
..... Match User someuser ChrootDirectory /chroot/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no .....
另请参阅 SFTP chroot。有关更多信息,请查看 sshd_config(5) 手册页中的 Match
、ChrootDirectory
和 ForceCommand
。
systemd
与其他文件系统挂载类似,请参阅 systemd.mount(5) 以及可能的 systemd.automount(5)。由于 FUSE 系统及其机制,您应该使用 用户单元。设置带有公钥身份验证的 SSH。
作为用户单元
将 foo.mount
放在 ${XDG_CONFIG_HOME}/systemd/user/
中。
启动 该单元,像往常一样使用 --user
选项。
使用带密码的 SSH 密钥
请参阅 SSH 密钥#使用 systemd 用户启动 ssh-agent。
生成 .mount 和 .automount 文件
在 /etc/fstab 中创建一个条目 至少带有 _netdev,如果您需要自动挂载功能,x-systemd.automount 才是必要的。
/etc/fstab
remoteuser@remotehost:/remote/folder /home/foo/local_folder fuse.sshfs _netdev,x-systemd.automount,x-systemd.idle-timeout=5min,rw 0 0
# systemctl daemon-reload
所有生成的文件都在 /run/systemd/generator/ 中 daemon-reload 命令之后。对于用户单元,您可以复制您需要的文件并删除 fstab 行并重新加载 systemd
编写 .mount 和 .automount 文件
您将需要 编写两个 systemd 单元:一个挂载单元和一个可选的自动挂载单元。启用 自动挂载单元并保持挂载单元本身禁用将不会阻止启动,并且仅在尝试访问文件系统时才挂载。这些文件需要与挂载点完全同名,路径中的文件夹用“-”符号分隔。
挂载单元,需要与挂载点完全同名(这里,/mnt/data
变为 mnt-data
)
systemd-escape -p --suffix=mount "/mnt/data/"
mnt-data.mount
/etc/systemd/system/mnt-data.mount
[Unit] Description=SSHFS (remote.local) Before=remote-fs.target [Mount] What=user@remote.local:/mnt/data Where=/mnt/data Type=fuse.sshfs Options=_netdev,rw,nosuid,allow_other,uid=1000,gid=1000,default_permissions,follow_symlinks,idmap=user,identityfile=/home/user/.ssh/id_ed25519 [Install] WantedBy=remote-fs.target WantedBy=multi-user.target
自动挂载单元文件也需要与挂载点完全同名
/etc/systemd/system/mnt-data.automount
[Unit] Description=Automount /mnt/data [Automount] Where=/mnt/data TimeoutIdleSec=0 [Install] WantedBy=multi-user.target
systemd root 和多用户
自动挂载可以在启动时或按需(访问目录时)发生。对于两者,设置都在 fstab 中完成。
.ssh/config
中配置的主机。要让 root 用户使用普通用户的 SSH 密钥,请在 IdentityFile
选项中指定其完整路径。
最重要的是,在客户端机器上以 root 用户身份手动使用每个 sshfs 挂载至少一次,以便将主机的签名添加到客户端的 /root/.ssh/known_hosts
文件中。这也可以通过手动将一个或多个 SSH 服务器的公共主机密钥(/etc/ssh/ssh_host_*key.pub
文件)附加到 /root/.ssh/known_hosts
来完成。
按需
使用 systemd,可以使用 /etc/fstab
条目进行按需挂载。
示例
user@host:/remote/path /local/path fuse.sshfs x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/user/.ssh/id_rsa,allow_other,reconnect 0 0
这里重要的挂载选项是 x-systemd.automount,_netdev。
- x-systemd.automount 完成按需魔法
- _netdev 告诉它这是一个网络设备,而不是块设备(没有它,可能会发生“No such device”错误)
另请参阅 fstab#使用 systemd 自动挂载。
启动时
一个关于如何使用 sshfs 通过 /etc/fstab
挂载远程文件系统的示例
user@host:/remote/path /local/path fuse.sshfs _netdev 0 0
以 fstab 行为例
llib@192.168.1.200:/home/llib/FAH /media/FAH2 fuse.sshfs _netdev 0 0
如果您使用未受密码保护的用户的 SSH 密钥,则以上操作将自动生效。请参阅 使用 SSH 密钥。
如果您想与多个用户一起使用 sshfs,请添加以下选项
user@domain.org:/home/user /media/user fuse.sshfs allow_other,_netdev 0 0
为了确保网络在尝试挂载之前可用,不仅要设置 _netdev
挂载选项,还要为您的网络管理器在相应的 wait-online 服务 中添加 --any
或特定的 --interface
。
安全用户访问
当通过 fstab 自动挂载时,文件系统通常将由 root 用户挂载。默认情况下,如果您希望以普通用户身份访问并限制其他用户的访问,这将产生不良结果。
挂载点配置示例
user@host:/remote/path /local/path fuse.sshfs noauto,x-systemd.automount,_netdev,user,idmap=user,follow_symlinks,identityfile=/home/user/.ssh/id_rsa,allow_other,default_permissions,uid=USER_ID_N,gid=USER_GID_N 0 0
有关所用选项的解释,请参阅 #allow_root 或 allow_other。
故障排除
检查清单
首先阅读 OpenSSH#检查清单。需要检查的进一步问题是
- 您的 SSH 登录是否从服务器的
/etc/issue
文件等发送了额外信息?这可能会混淆 SSHFS。您应该暂时停用服务器的/etc/issue
文件$ mv /etc/issue /etc/issue.orig
- 请记住,您在网上找到的大多数与 SSH 相关的故障排除文章都与 systemd 无关。通常
/etc/fstab
定义错误地以sshfs#user@host:/mnt/server/directory ... fuse ...
而不是使用以下语法开始user@host:/mnt/server/directory ... fuse.sshfs ... x-systemd, ...
- 检查服务器源目录和内容的所有者是否为服务器用户所有。
$ chown -R user_s: /mnt/servers/directory
- 服务器的用户 ID 可以与客户端的用户 ID 不同。显然,两个用户名必须相同。您只需关心客户端的用户 ID。SSHFS 将使用以下挂载选项为您翻译 UID
uid=USER_C_ID,gid=GROUP_C_ID
- 检查客户端目标挂载点(目录)是否为客户端用户所有。此目录应具有与 SSHFS 挂载选项中定义的用户 ID 相同的用户 ID。
$ chown -R user_c: /mnt/client/directory
- 检查客户端挂载点(目录)是否为空。默认情况下,您无法将 SSHFS 目录挂载到非空目录。
Connection reset by peer (连接被对端重置)
- 如果您尝试使用主机名访问远程系统,请尝试使用其 IP 地址,因为它可能是域名解析问题。确保您使用服务器详细信息编辑
/etc/hosts
。 - 确保您的用户可以登录到服务器(尤其是在使用
AllowUsers
时)。 - 确保远程系统上的
/etc/ssh/sshd_config
中启用了Subsystem sftp /usr/lib/ssh/sftp-server
。 - 如果您使用的是非默认密钥名称并将其作为
-i .ssh/my_key
传递,这将不起作用。您必须使用-o IdentityFile=/home/user/.ssh/my_key
,并使用密钥的完整路径。 - 如果您的
/root/.ssh/config/
是一个符号链接,您也会收到此错误。请参阅 这个 serverfault 主题 - 添加选项
sshfs_debug
(如sshfs -o sshfs_debug user@server ...
中所示)可以帮助解决问题。 - 如果这没有揭示任何有用的信息,您也可以尝试添加选项
debug
。 - 如果您尝试 sshfs 进入运行 DD-WRT 或类似系统的路由器,此处 提供了一个解决方案。(请注意,可以使用
-osftp_server=/opt/libexec/sftp-server
选项代替修补 dropbear 来用于 sshfs 命令)。 - 如果您仅在启动时看到此情况,则可能是 systemd 尝试在网络连接可用之前进行挂载。为您的网络管理器启用相应的 wait-online 服务 可以解决此问题。
- 旧论坛主题:sshfs:Connection reset by peer。
sshfs -o sshfs_debug,IdentityFile=/path/to/key user@server ...
)。Remote host has disconnected (远程主机已断开连接)
如果您在尝试使用 sshfs 后立即收到此消息
- 首先确保远程机器已安装 sftp!如果没有,它将无法工作。
- 然后,检查远程机器上
/etc/ssh/sshd_config
中Subsystem sftp
的路径是否有效。
fstab 挂载问题
要获得详细的调试输出,请将以下内容添加到挂载选项
ssh_command=ssh\040-vv,sshfs_debug,debug
\040
表示空格,fstab 使用空格分隔字段。为了能够运行 mount -av
并查看调试输出,请删除以下内容
noauto,x-systemd.automount
一些目录为空
默认情况下,sshfs 不支持符号链接。如果这些目录恰好是符号链接,请使用
$ sshfs user@host:/remote/path /local/path -o follow_symlinks
文件未刷新
如果您在远程看到旧内容,请考虑使用选项 dir_cache=no
$ sshfs user@host:/remote/path /local/path -o dir_cache=no
快速网络上的传输速度受限
如果您观察到传输速度低于您的网络能力,并且文件复制源一方的 CPU 使用率很高,请禁用压缩(删除 -C
选项或设置 -o compression=no
)。
另请参阅
- 如何挂载 chrooted SSH 文件系统,特别注意所有者和权限问题。