sshfs 是基于ssh的一个工具,用于挂载远端的文件系统到本地. 只要可以用ssh方式访问远端,那么就可以用sshfs 这个工具把有权限的目录挂载到本地来.
在linux系统中,有一个虚拟文件系统的概念,虚拟文件系统作为一个统一的文件系统接口,各种不同的文件系统的驱动只要实现虚拟文件系统接口就可以了,而驱动一般都不会运行在用户空间,而为了在用户空间也可以export 一个虚拟文件系统接口,fuse 这个工具就被创造出来了. fuse 就是实现用户空间export 出一个虚拟文件系统的接口. 基于fuse , sshfs 这个工具才可以很好的工作, mount时候指定的filesystem 类型就是fuse , 而一旦mount 之后,用df 看到的文件系统类型则是: fuse.sshfs .
sshfs的使用方法:
A. 使用sshfs 命令进行挂载的格式就是: sshfs -o OPTION LOGINID@HOST:/REMOTE_PATH /LOCAL_PATH
如下的例子仅做参考:
sshfs -o rw,default_permissions,allow_other,uid=1000,gid=100,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 test@192.168.0.114:/home/test/ /mnt
B. 配置到 fstab 以方便开机就可以进行自动挂载,写法和 传统的文件系统略有不同,采用如下的语法格式:
sshfs#ssh_login_id@sshd_server:/FOLDER /mnt/ fuse IdentityFile=/SSH_LOGIN_KEY_NEED_ABS_PATH_AND_CORRECT_PERMISSION,rw 0 0
从上面可以看到其实 除了第一列的写法有点特殊之外,其他都和 传统挂载很类似的,在上面的例子中的IdentityFile 的值通常是ssh 免密登陆时候的 key, 也就是通常在 ~/.ssh/ 下面. 其中fs的类型写fuse , 后面是option ...
C. 对于sshfs 的使用方法就是上面两条,非常的简单,但是有一些参数还是要特别注意下,否则可能会遇到各种问题:
1).
通过 uid, gid 选项来控制挂载后对应的file owner. 需要注意的是: 如果在root 账户下,查看内存中该挂载对应的option, 其中user_id=0 , group_id=0, 而一旦完成挂载,是不支持修改file/folder owner和group的,所以要在挂载的时候指定好owner,group,这两个选项不体现在 内存里面保存的 挂载参数列表里
2).
fuse本身有一个option叫做 default_permissions, 这个选项是fuse 的选项,并不是sshfs的选项,通过man 帮助文档的解释,添加这个选项之后,文件的访问控制强制基于 file mode,也就是不会把remote 的uid,gid 映射到本地,而如果没有添加这个选项,那么就依靠fuse(fuse怎么干的,鄙人真不清楚),所以如果要想使chmod 命令一定生效,那么加上这个选项吧. 根据man 帮助文档所述,这个选项通常和allow_other 选项一起使用,而allow_other要想生效,那么需要/etc/fuse.conf配置需要enable user_allow_other .
3).
umask 选项,这个选项用于设置挂载后的文件的权限,如果使用这个选项,那么挂载后, 在client端的权限无法进行修改,如果用chmod在客户端修改了,那么客户端显示的权限依然不变,但是server end 可能就发生了变化,这一点非常奇葩,也非常需要注意,别以为客户端没有改变,服务端也不会改变; 另外这个选项在 mount 之后在内存是看不到这个选项的,也就是会生效,但是不体现在内存里面保存的挂载参数里面