Contents

在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.txtjoey-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

上面的命令使用命令catheredoc 将映射规则写入文件uid-mapping

同样,我们可以创建一个组 ID 映射文件gid-mapping来将远程组映射到本地值:

$ cat > gid-mapping <<EOF
alicegroup:201
amygroup:202
root:0
EOF

然后,我们可以使用命令sshfs创建挂载点,传递uid-mappinggid-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-mappinggid-mapping文件进行了映射。