在Linux中使用sshfs挂载远程目录
1. 概述
在本教程中,我们将了解如何使用sshfs工具在 Linux 中本地挂载远程目录。
2. sshfs
sshfs 是一个 Linux 命令行工具,它允许我们在本地挂载远程目录。挂载后,用户可以与挂载点进行交互,就好像该文件夹存在于本地一样。
在幕后,sshfs使用 SSH 的 SFTP 协议在两个节点之间进行任何必要的文件传输。因此,远程服务器必须运行sshd 并接受 SSH 连接。
2.1. 安装
要在基于 Debian 的 Linux(例如 Ubuntu)上安装sshfs ,我们可以使用apt-get :
$ sudo apt-get install -y sshfs
同样,我们可以使用yum 在 CentOS 等基于 RHEL 的 Linux 上安装sshfs :
$ sudo yum --enablerepo=powertools install fuse-sshfs
要在基于 RHEL 的 Linux 上获取sshfs二进制文件,我们需要安装包fuse-sshfs。此外,我们需要使用标志启用powertools存储库* –enablerepo*。
2.2. 一般语法
一般sshfs命令可以表示为:
sshfs [user@]host:[dir] mountpoint [options]
sshfs的第一个参数是根据 SSH 规范的连接字符串:
[user@]host:[dir]
user参数指定在远程服务器上登录的用户名。然后,host参数采用远程服务器的 IP 地址或域的值。接下来,可选的dir参数指定远程目录的路径。当该值不存在时,sshfs将挂载在身份验证用户的主路径上。
** mountpoint参数是创建挂载的本地路径**。此外, mountpoint参数指定的路径在挂载之前必须存在。最后,该命令接受提供各种配置的可选标志列表。
2.3. 基本用法
要使用sshfs挂载远程目录,我们将首先在本地节点中创建一个目录作为挂载点:
$ mkdir -p /mnt/DATA
然后,我们将使用sshfs挂载远程目录:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA
bob@192.168.1.16's password:
本质上,上面的命令将挂载点*/mnt/DATA指向主机192.168.1.16* 的远程目录*/tmp/DATA*。此外,我们选择以用户bob连接到主机。根据 SSH 规范,遥控器将提示输入用户bob的密码。
2.4. 卸载远程目录
要卸载挂载点,我们可以使用fusermount:
$ fusermount -u /mnt/DATA
或者,我们可以使用umount 卸载挂载点:
$ umount /mnt/DATA
3. 选项
3.1. 指定不同的端口
*如果远程服务器在不同的端口上接受 SSH 连接,我们可以使用-p*指定端口。**例如,我们可以将 SSH 连接的端口指定为 2200:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -p 2200
3.2. 自动重新连接
如果连接中断,我们可以配置sshfs自动重新建立连接。
为此,我们可以指定选项*-o reconnect*:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o reconnect
3.3. 延迟连接
每当我们使用sshfs创建挂载点时,都会立即建立连接。要延迟连接,我们可以应用标志*-o delay_connect*:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o delay_connect
该命令立即返回,没有任何密码提示。这是因为标志*-o delay_connect阻止立即建立连接。相反,当我们第一次访问挂载/mnt/DATA*时,将建立连接 。
4. 文件所有权和权限
sshfs提供了几种方法来将远程文件和目录的用户 ID (UID) 和组 ID (GID) 映射到等效的本地值。映射可以很容易地完成,就像将每个 UID 和 GID 映射到本地的单个值一样。除此之外,使用指定映射的文件可以使映射更加动态。
4.1. 将所有者设置为单个用户和组
我们可以通过传递标志-o uid*将远程目录和文件的所有者设置为单个用户和组 ID*。例如,标志*-o uid=1002将挂载点中文件和目录的所有者设置为用户1002*:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o uid=1002
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 4
-rw-r--r-- 1 1002 alicegroup 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 1002 alicegroup 12 Apr 10 14:28 joey-file.txt
此外,我们还可以使用标志*-o gid*将组 ID 设置为单个本地值。例如,我们可以将目录中文件的组 ID 设置为5005:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o gid=5005
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 8
-rw-r--r-- 1 alice 5005 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 alice 5005 12 Apr 10 14:28 joey-file.txt
最后,我们可以指定两个标志来设置文件的 UID 和 GID:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o uid=1002 -o gid=5005
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 8
-rw-r--r-- 1 1002 5005 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 1002 5005 12 Apr 10 14:28 joey-file.txt
4.2. 动态映射 UID 和 GID
要根据映射文件在本地映射远程 UID 和 GID 值,我们将传递选项-o idmap=file。*然后,我们将使用标志-o uidfile和-o gidfile*指定映射文件。
例如,主机 192.168.1.16的目录*/tmp/DATA包含两个文件bob-file.txt和joey-file.txt*:
$ ls -l /tmp/DATA
total 8
-rw-rw-r-- 1 bob bobgroup 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 joey joeygroup 12 Apr 10 14:28 joey-file.txt
首先,我们需要确定主机 192.168.1.16 上bob和 joey的 UID 和 GID。要确定用户的 UID,我们可以使用命令id并传递标志*-u*:
$ id -u bob
1001
$ id -u joey
1002
使用相同的命令id,我们可以通过指定标志*-g*来获取用户的 GID :
$ id -g bobgroup
201
$ id -g joeygroup
202
然后,我们可以在本地创建一个映射规则,以便将远程 UID 和 GID 映射到本地值。规则以特定格式指定:
local-username:remote-uid
在我们的示例中,我们将远程用户bob映射到本地用户alice并将远程用户joey映射到本地用户amy:
$ cat > uid-mapping <<EOF
alice:1001
amy:1002
root:0
EOF
上面的命令使用命令cat 和heredoc 将映射规则写入文件uid-mapping。
同样,我们可以创建一个组 ID 映射文件gid-mapping来将远程组映射到本地值:
$ cat > gid-mapping <<EOF
alicegroup:201
amygroup:202
root:0
EOF
然后,我们可以使用命令sshfs创建挂载点,传递uid-mapping和gid-mapping作为映射规则:
$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o idmap=file -o uidfile=uid-mapping -o gidfile=gid-mapping
使用标志*-o idmap=file*,我们告诉命令sshfs使用文件执行映射。然后,我们使用标志*-o uidfile和-o gidfile*传递映射文件名。
我们看一下本地挂载点的权限信息:
$ ls -l /mnt/DATA
total 8
-rw-rw-r-- 1 alice alicegroup 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 amy amygroup 12 Apr 10 14:28 joey-file.txt
正如我们所见,权限已经根据我们的uid-mapping和gid-mapping文件进行了映射。