使用 SSHFS 挂载远程的 Linux 文件系统及目录

2022-11-17 16:21:18 浏览数 (1)

步骤1:在 Linux 系统上安装 SSHFS

默认情况下,sshfs 包不存在所有的主流 Linux 发行版中,你需要在你的 Linux 系统中启用 epel,在 Yum 命令行的帮助下安装 SSHFS 及其依赖。

代码语言:javascript复制
# yum install sshfs
# dnf install sshfs 【在 Fedora 22  发行版上】
$ sudo apt-get install sshfs     【基于 Debian/Ubuntu 的系统】

Jetbrains全家桶1年46,售后保障稳定

步骤2:创建 SSHFS 挂载目录

当你安装 SSHFS 包之后,你需要创建一个挂载点目录,在这儿你将要挂载你的远程文件系统。例如,我们在 /mnt/tecmint 下创建挂载目录。

代码语言:javascript复制
# mkdir /mnt/tecmint
$ sudo mkdir /mnt/tecmint     【基于 Debian/Ubuntu 的系统】
步骤 3:使用 SSHFS 挂载远程的文件系统

当你已经创建你的挂载点目录之后,现在使用 root 用户运行下面的命令行,在 /mnt/tecmint 目录下挂载远程的文件系统。视你的情况挂载目录可以是任何目录。

下面的命令行将会在本地的 /mnt/tecmint 目录下挂载远程目录 /home/tecmint 。(不要忘了使用你的 IP 地址和挂载点替换 x.x.x.x)。

代码语言:javascript复制
命令格式
$ sshfs [user@]host:[dir] mountpoint [options]
$ sshfs myuser@mycomputer:/remote/path /local/path -C -p 9876
参数
-C 启用压缩compress
-p 指定端口为9876

$ sshfs tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint   #免密登陆到此即可
$ sudo sshfs -o allow_other tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint     
 【基于 Debian/Ubuntu 的系统】

如果你的 Linux 服务器配置为基于 SSH 密钥认证,那么你将需要使用如下所示的命令指定私钥。

代码语言:javascript复制
# sshfs -o IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint
$ sudo sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint     【基于 Debian/Ubuntu 的系统】

其他常见选项

代码语言:javascript复制
将本地当前登陆用户映射为远端用户user
$ sshfs myuser@mycomputer:/remote/path /local/path -o idmap=user
具体可参考man sshfs

Chrooting

代码语言:javascript复制
vim /etc/ssh/sshd_config
-------------------------------------------
.....
Match User someuser 
       ChrootDirectory /chroot/%u
       ForceCommand internal-sftp
       AllowTcpForwarding no
       X11Forwarding no
.....
------------------------------------------
注意:chroot目录的属主必须是root,否则你将无法连接。
进一步信息可参考 man sshd_config(5)的Match, ChrootDirectory和ForceCommand部分。
步骤 4:验证远程的文件系统挂载成功

如果你已经成功的运行了上面的命令并且没有任何错误,你将会看到挂载在 /mnt/tecmint 目录下的远程的文件和目录的列表

代码语言:javascript复制
# cd /mnt/tecmint
# ls
[root@ tecmint]# ls
12345.jpg                       ffmpeg-php-0.6.0.tbz2                Linux                                           news-closeup.xsl     s3.jpg
cmslogs                         gmd-latest.sql.tar.bz2               Malware                                         newsletter1.html     sshdallow
epel-release-6-5.noarch.rpm     json-1.2.1                           movies_list.php                                 pollbeta.sql
ffmpeg-php-0.6.0                json-1.2.1.tgz                       my_next_artical_v2.php                          pollbeta.tar.bz2
步骤 5:使用 df -hT 命令检查挂载点

如果你运行 df -hT命令,你将会看到远程文件系统的挂载点。

代码语言:javascript复制
# df -hT
样本输出:

Filesystem                          Type        Size  Used Avail Use% Mounted on
udev                                devtmpfs    730M     0  730M   0% /dev
tmpfs                               tmpfs       150M  4.9M  145M   4% /run
/dev/sda1                           ext4         31G  5.5G   24G  19% /
tmpfs                               tmpfs       749M  216K  748M   1% /dev/shm
tmpfs                               tmpfs       5.0M  4.0K  5.0M   1% /run/lock
tmpfs                               tmpfs       749M     0  749M   0% /sys/fs/cgroup
tmpfs                               tmpfs       150M   44K  150M   1% /run/user/1000
tecmint@192.168.0.102:/home/tecmint fuse.sshfs  324G   55G  253G  18% /mnt/tecmint
步骤 6:永久挂载远程文件系统

为了永久的挂载远程的文件系统,你需要修改一个叫 /etc/fstab 的文件。照着做,使用你最喜欢的编辑器打开文件。

代码语言:javascript复制
# vi /etc/fstab
$ sudo vi /etc/fstab     【基于 Debian/Ubuntu 的系统】         

移动到文件的底部并且添加下面的一行,保存文件并退出。下面条目表示使用默认的设置挂载远程的文件系统。

代码语言:javascript复制
格式
USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs  defaults,_netdev  0  0
注意:使用_netdev选项是为了在挂载之前先保证网络可用。

例子
llib@192.168.1.200:/home/llib/FAH  /media/FAH2  fuse.sshfs  defaults,_netdev  0  0
tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint fuse.sshfs,_netdev defaults 0 0

用于多用户
user@domain.org:/home/user  /media/user   fuse.sshfs    defaults,allow_other,_netdev    0  0

确保服务器之间允许SSH无密码登录,这样系统重启之后才能自动挂载文件系统。

如果你的服务器配置为基于SSH 密钥的认证方式,请加入如下行:

代码语言:javascript复制
格式
USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs noauto,x-systemd.automount,_netdev,user,idmap=user,follow_symlinks,identityfile=/home/USERNAME/.ssh/id_rsa,allow_other,default_permissions,uid=USER_ID_N,gid=USER_GID_N 0 0
参数
allow_other 允许非root用户访问共享资源。
default_permissions 检查权限,使用远端服务器的实际权限。控制不是本地所有用户都可以访问。
uid, gid 服务器侧的UID可以与本地用户的UID不同,但用户名要一样。在这里只需指出本地客户端的信息,uid=USER_C_ID,gid=GROUP_C_ID即可,sshfs会自动完成本地客户端到服务器端的转换。

例子
tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint fuse.sshfs IdentityFile=~/.ssh/id_rsa defaults,_netdev 0 0

接下来,你需要更新 fstab 文件使修改生效。

代码语言:javascript复制
# mount -a
$ sudo mount -a   【基于 Debian/Ubuntu 的系统】
步骤 7:卸载远程的文件系统

为了卸载远程的文件系统,只需要发出以下的命令即可。

代码语言:javascript复制
$ sudo umount /mnt/tecmint
或者
$ fusermount3 -u mountpoint
$ fusermount3 -u /local/path
关于SSHFS的自动挂载
1. 在系统启动时挂载
代码语言:javascript复制
crontab -e
------------------------------------------
@reboot sh mountsshfs.sh

vim mountsshfs.sh
------------------------------------------
#! /bin/sh
while true
do 
    ping -c1 -w1 ssh_server_ip > /dev/null && break
done
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 user@192.168.200.10:/pathto/dir /home/username/mount/dir
2. 利用/etc/fstab
代码语言:javascript复制
user@host:/remote/folder /mount/point  fuse.sshfs noauto,x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/user/.ssh/id_rsa,allow_other,reconnect 0 0
参数
noauto 不在boot时mount
x-systemd.automount 配置按需挂载
_netdev 避免“No such device”错误,指明sshfs是一个网络设备而非块设备

注意:在完成对/etc/fstab的修改后,需要执行如下命令
systemctl daemon-reload
systemctl restart <target>
这里 <target>可以使用如下命令查询
systemctl list-unit-files --type automount
3. 借助第三方工具 autosshfs

https://github.com/dyne/autosshfs.git

参考文献: https://wiki.archlinux.org/index.php/SSHFS

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/219613.html原文链接:https://javaforall.cn

0 人点赞