Ubuntu 安装和使用 SSHFS

By | 最新修改:2024-08-17

本文讲述了如何使用 SSHFS 进行在本地客户端挂载远程文件系统来为远程文件提供实时传输和管理。


什么是 SSHFS

SSHFS,全称“SSH FileSystem”,也就是 “SSH 文件系统”。它是一种通过普通 SSH 连接来挂载远程目录和与之交互的文件系统客户端,该客户端通过 SFTP(SSH 文件传输协议)与远程文件系统交互。

SSHFS 也是一种安全可靠地为远程文件提供访问、传输和管理的协议。

据“维基百科”

本文的使用环境

SSH 服务器端: CentOS 7.9

SSHFS 客户端: Ubuntu 22.04


Ubuntu 22.04 安装 SSHFS 客户端

由于远程服务器 CentoS 7 操作系统仅需要运行着 SSH 2 以上的服务器端程序即可,客户端也仅要求安装 SSHFS 客户端程序。其中,SSH 服务器端必须启用 SFTP 文件传输功能。

SSH 服务端启用 SFTP

将以下一行解开注释即可:

Subsystem       sftp    /usr/libexec/openssh/sftp-server

安装 SSHFS 客户端

sudo apt-get install -y sshfs

使用

首先,在远程服务器创建 /var/remote-dir 目录,在本地 Ubuntu 的文件系统中创建 /data/local-dir 作为本地客户端目标目录。

挂载远程目录

sshfs -o sshfs_sync root@192.168.1.112:/var/remote-dir/ /data/local-dir/

# 命令格式
sshfs -o sshfs_sync root@192.168.1.112:/path/to/remote/source/dir/ /path/to/local/mount/point/dir/

其中 -o sshfs_sync 表示本地与远程同步的选项,如果不使用此选项,那么将导致远程与本地的同步有时延。

要在这里说清楚的是:

  1. 本地目录一旦挂载有远程的目录,那么本地上的目录会被远程目录所覆盖,本地上的文件会“消失”掉,替换成远程目录。
  2. 当卸载远程挂载后,本地目录原有的文件会被恢复。

实时文件传输的举例

然后,在本地目标目录中创建 local-test.txt 文件:

touch /data/local-dir/local-test.txt

创建本地目录和文件

在远程服务器创建以下文件:

touch /var/remote-dir/remote-test.txt

创建远程目录和文件

查看同步的效果

  1. 本地目标目录:

    本地目录效果

  2. 远程目标目录:

    远程目录效果

依上图可见, SSHFS 同步效果显著,是成功的同步操作。

本地和远程的修改:

  1. 本地:

    本地和远程修改文件的效果-本地

  2. 远程:

    本地和远程修改文件的效果-远程

只要本地或者远程目录和文件有任何修改,SSHFS 都会同步修改。


卸载 SSHFS 的挂载目录

fusermount -u /data/local-dir
# 命令格式
fusermount -u /path/to/local/mount/point/dir/

fusermount -u 指定的一定是绝对路径。

如果执行上一个命令出现以下错误:

fusermount: failed to unmount. Device or resource busy

那么:

# 这是强制卸载,在上一个命令失效的时候使用
sudo umount -l /path/to/local/mount/point/dir/

卸载本地挂载后的影响

卸载本地挂载目录后,查看对远程和本地文件有什么样的影响。

  1. 本地目录:

    卸载远程挂载后的本地目录

  2. 远程目录:

    卸载远程挂载后的远程目录

综上图所述,卸载本地的挂载,对远程的文件是没有影响的。远程目录还保持着卸载前的样子。


SSHFS 的无密码远程访问

实现 SSHFS 的无密码访问与 SSH 一样,可通过 -F 参数指定地一个 ssh_config 文件,同时此 ssh_config 里面包含无密码的 SSH 公钥文件。不同的是,SSH 有个 -i 参数可指定文件,然而 SSHFS 客户端没有这个参数。

无密码访问还有一个步骤是在服务器上部署无密码密钥的公钥,这和 SSH 一致。

生成无密码的 SSH 密钥对

无密码访问的首位步骤是在本地(远程也可)生成无密码密钥对:

ssh-keygen -t rsa -b 4096 -f id_rsa_no_pwd

当需要输入密码时,不输入任何东西,直接回车确定:

生成无密码 SSH 密钥对

得到 id_rsa_no_pwdid_rsa_no_pwd.pub 两个文件。

复制公钥到服务器

首先上传公钥文件到服务器,然后将公钥追加到 /root/.ssh/authorized_keys 文件,如果读者用的不是 root 用户,要放到需要无密登录用户的相关文件中 ${HOME}/.ssh/authorized_keys

${HOME} 可更换成 /home/username,username 为用户名,按需修改。

登录服务器,然后:

cat /path/to/id_rsa_no_pwd.pub >> ${HOME}/.ssh/authorized_keys

如果该服务器首次使用公钥登录,需要更改相关目录和文件的权限设置:

chmod 700 ${HOME}/.ssh
chmod 600 ${HOME}/.ssh/authorized_keys

若是目录或文件不存在,请创建一下。

要注意的是 .ssh 目录及其文件的属主。

设置 SSH 服务器允许密钥登录

vi /etc/ssh/sshd_config,修改以下的配置选项:

  1. 去掉 PubkeyAuthentication yes 一行的注释;
  2. 如果还需要密码登录,就把以下一行设置为 no

    PasswordAuthentication no
    

    否则,保留值 yes

修改完成,保存并退出文件,然后,重启 SSH 服务器进程。

systemctl restart sshd

Ubuntu 复制 SSH 客户端配置文件

如果你是 Ubuntu 操作系统,那么可以到系统 SSH 配置文件目录中拷贝客户端配置文件到任意地方。这里是当前目录下:

cp /etc/ssh/ssh_config .

修改 ssh_config 文件内容

  1. 如果 SSH 服务器的端口不是默认值 22,那么就要设置它。

    首先要解开注释:

    Port {PORT}
    

    以实际端口号代替 {PORT}

  2. 解开其中一个 IdentityFile 的注释,然后设置成上文中生成的私钥路径(绝对路径,不能是相对路径):

    IdentityFile /path/to/id_rsa_no_pwd
    

    取消 IdentityFile 一行的注释

将无密码密钥应用到 SSHFS

sshfs 命令的 -F 参数指定 ssh_config 的路径就得了:

sshfs -o sshfs_sync -F /data/ssh_config root@192.168.1.112:/var/remote-dir/ /data/local-dir/

-F 指定的一定要是绝对路径,文件 ssh_config 在目录 /data 下。

-o sshfs_sync 是“同步写入”的意思。


总结

读者通过本文了解了远程文件系统挂载工具 SSHFS 通过 SSH 通道有密码或者无密码进行实时文件访问、传输和管理,并且了解了如何在 Ubuntu 22.04 安装和使用 SSHFS,以及在 CentOS 7 系统上配置 SSH 服务以允许使用 SSHFS。另,还额外地介绍了在服务器端部署无密码的 SSH 公钥的步骤。

SSHFS 目前有一个令笔者不喜欢的地方,SSHFS 不能在服务器端自动地改变远程文件的属主和属组,这在一些场景下很不方便。



程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com