Github - libfuse/sshfs

SSHFS,SSH Filesystem, 是一种采用 SFTP连接来挂载远程服务器或工作站上的目录和文件交互的工具. 一般情况下,大部分 SSH 服务器支持 SFTP 访问.

1. 使用场景

[1] - 本机访问远程服务器目录与文件;

[2] - 多台服务器之间目录与文件的访问.

Ubuntu - 挂载 NFS 服务器的文件系统到本机 - AIUAI 挂载服务器所分享的目录.

2. Ubuntu 安装

[1] - Ubuntu apt 安装:

sudo apt-get install sshfs

版本可能比较早,如:

sshfs --version
#SSHFS version 2.5
#FUSE library version: 2.9.4
#fusermount version: 2.9.4
#using FUSE kernel interface version 7.19

[2] - 源码安装

#下载最新源码
#https://github.com/libfuse/sshfs/releases
wget https://github.com/libfuse/sshfs/releases/download/sshfs-3.5.2/sshfs-3.5.2.tar.xz
#解压
tar xvf sshfs-3.5.2.tar.xz

#编译安装推荐采用 Meson>0.38 和 Ninja
#http://mesonbuild.com/
#https://ninja-build.org/

cd sshfs-3.5.2
mkdir build 
cd build
#默认参数进行编译
meson ..

#修改编译参数
mesonconf                  # list options
mesonconf -D strip=true    # set an option

#安装
ninja
python3 -m pytest test/    # optional, but recommended
sudo ninja install

或者可以试试:

wget https://github.com/libfuse/sshfs/archive/sshfs-3.5.2.zip
unzip sshfs-3.5.2.zip

cd sshfs-3.5.2
./configure
make -j4
make install 

3. 使用方法

3.1. 远程(mount)服务器目录挂载

sshfs [user@]hostname:[directory] mountpoint
sshfs [服务器用户名]@服务器ip地址:[挂载目录] [本地挂载点]

#如:
sshfs username@192.168.1.10:/path/to/test/ mountpoint  

sudo sshfs -o allow_other,default_permissions username@192.168.1.10:/path/to/test/ mountpoint

(1) - 推荐不采用 root 用户使用 SSHFS. 挂载的目标位置必须是属于 user 的.

(2) - 如果 user 参数忽略,SSHFS 会使用本地用户名(local username).

(3) - 如果 directory 参数忽略,SSHFS 会使用远程服务器的 home 目录路径.

(4) - 类似于 SSH, SSHFS 可能要求输入密码.

3.2. 挂载时自动输入密码

如:

sshfs -o ssh_command='sshpass -p 123456 ssh' -o cache=yes, allow_other [user@]hostname mountpoint

3.3. 卸载(unmont)服务器目录(文件系统)

fusermount -u mountpoint

如果出现 Device or resource busy 问题,则采用:

fusermount -zu mountpoint

3.4. 持久性挂载

类似于硬盘挂载,将配置写入 /etc/fstab.

如:

username@hostname:/path/to/test/ mountpoint fuse.sshfs noauto,x-systemd.automount,_netdev,reconnect,identityfile=/home/username/.ssh/id_rsa,allow_other,default_permissions 0 0

其中,

  • fuse.sshfs - 指定挂载远程目录的驱动
  • noauto,x-systemd.automount,_netdev,reconnect - 参数组合,确保持久性挂载的网络驱动工作正常,以避免网络连接从本地计算机或远程计算机断开.
  • identityfile=/home/username/.ssh/id_rsa - 指定本地 SSH key 路径,使得远程路径能够被自动挂载.
  • allow_other,default_permissions
  • 0 0 - 表示远程文件系统不因报错而被本地计算机丢弃或检验

4. 查看 sshfs 参数

sshfs --help

如:

通用参数:
    -o opt,[opt...]        mount options
    -h   --help            print help
    -V   --version         print version

SSHFS 参数:
    -p PORT                等价于 '-o port=PORT'
    -C                     等价于 '-o compression=yes'
    -F ssh_configfile      指定 ssh 配置文件
    -1                     等价于 '-o ssh_protocol=1'
    -o reconnect           reconnect to server
    -o delay_connect       delay connection to server
    -o sshfs_sync          synchronous writes
    -o no_readahead        synchronous reads (no speculative readahead)
    -o sync_readdir        synchronous readdir
    -o sshfs_debug         print some debugging information
    -o cache=BOOL          enable caching {yes,no} (default: yes)
    -o cache_timeout=N     sets timeout for caches in seconds (default: 20)
    -o cache_X_timeout=N   sets timeout for {stat,dir,link} cache
    -o workaround=LIST     colon separated list of workarounds
             none             no workarounds enabled
             all              all workarounds enabled
             [no]rename       fix renaming to existing file (default: off)
             [no]nodelaysrv   set nodelay tcp flag in sshd (default: off)
             [no]truncate     fix truncate for old servers (default: off)
             [no]buflimit     fix buffer fillup bug in server (default: on)
    -o idmap=TYPE          user/group ID mapping, possible types are:
             none             no translation of the ID space (default)
             user             only translate UID of connecting user
             file             translate UIDs/GIDs contained in uidfile/gidfile
    -o uidfile=FILE        file containing username:remote_uid mappings
    -o gidfile=FILE        file containing groupname:remote_gid mappings
    -o nomap=TYPE          with idmap=file, how to handle missing mappings
             ignore           don't do any re-mapping
             error            return an error (default)
    -o ssh_command=CMD     execute CMD instead of 'ssh'
    -o ssh_protocol=N      ssh protocol to use (default: 2)
    -o sftp_server=SERV    path to sftp server or subsystem (default: sftp)
    -o directport=PORT     directly connect to PORT bypassing ssh
    -o slave               communicate over stdin and stdout bypassing network
    -o disable_hardlink    link(2) will return with errno set to ENOSYS
    -o transform_symlinks  transform absolute symlinks to relative
    -o follow_symlinks     follow symlinks on the server
    -o no_check_root       don't check for existence of 'dir' on server
    -o password_stdin      read password from stdin (only for pam_mount!)
    -o SSHOPT=VAL          ssh options (see man ssh_config)

FUSE options:
    -d   -o debug          enable debug output (implies -f)
    -f                     foreground operation
    -s                     disable multi-threaded operation

    -o allow_other         allow access to other users
    -o allow_root          allow access to root
    -o auto_unmount        auto unmount on process termination
    -o nonempty            allow mounts over non-empty file/dir
    -o default_permissions enable permission checking by kernel
    -o fsname=NAME         set filesystem name
    -o subtype=NAME        set filesystem type
    -o large_read          issue large read requests (2.4 only)
    -o max_read=N          set maximum size of read requests

    -o hard_remove         immediate removal (don't hide files)
    -o use_ino             let filesystem set inode numbers
    -o readdir_ino         try to fill in d_ino in readdir
    -o direct_io           use direct I/O
    -o kernel_cache        cache files in kernel
    -o [no]auto_cache      enable caching based on modification times (off)
    -o umask=M             set file permissions (octal)
    -o uid=N               set file owner
    -o gid=N               set file group
    -o entry_timeout=T     cache timeout for names (1.0s)
    -o negative_timeout=T  cache timeout for deleted names (0.0s)
    -o attr_timeout=T      cache timeout for attributes (1.0s)
    -o ac_attr_timeout=T   auto cache timeout for attributes (attr_timeout)
    -o noforget            never forget cached inodes
    -o remember=T          remember cached inodes for T seconds (0s)
    -o nopath              don't supply path if not necessary
    -o intr                allow requests to be interrupted
    -o intr_signal=NUM     signal to send on interrupt (10)
    -o modules=M1[:M2...]  names of modules to push onto filesystem stack

    -o max_write=N         set maximum size of write requests
    -o max_readahead=N     set maximum readahead
    -o max_background=N    set number of maximum background requests
    -o congestion_threshold=N  set kernel's congestion threshold
    -o async_read          perform reads asynchronously (default)
    -o sync_read           perform reads synchronously
    -o atomic_o_trunc      enable atomic open+truncate support
    -o big_writes          enable larger than 4kB writes
    -o no_remote_lock      disable remote file locking
    -o no_remote_flock     disable remote file locking (BSD)
    -o no_remote_posix_lock disable remove file locking (POSIX)
    -o [no_]splice_write   use splice to write to the fuse device
    -o [no_]splice_move    move data while splicing to the fuse device
    -o [no_]splice_read    use splice to read from the fuse device

Module options:

[iconv]
    -o from_code=CHARSET   original encoding of file names (default: UTF-8)
    -o to_code=CHARSET        new encoding of the file names (default: UTF-8)

[subdir]
    -o subdir=DIR        prepend this directory to all paths (mandatory)
    -o [no]rellinks        transform absolute symlinks to relative
Last modification:May 8th, 2022 at 10:40 am