Restic 快速入门:SFTP 备份

为了通过 SFTP 备份数据,您必须首先设置一个带有 SSH 的服务器并让其知道您的公钥。无密码登录非常重要,因为如果服务器提示输入凭据,则无法进行自动备份。

主机间免密钥互信

为了通过 SFTP 备份数据,你首先必须设置一个带有 SSH 的服务器并让其知道你的公钥。无密码登录非常重要,因为如果服务器提示输入凭据,则无法进行自动备份。为了解决这个问题,我们可以使用SSH密钥对进行身份验证,实现无密码登录。

  • 生成SSH密钥对
    首先,我们需要在本地计算机上生成一对SSH密钥,包括私钥和公钥。私钥用于解密和签名,而公钥则用于加密和验证签名。在终端中执行以下命令:
    ssh-keygen -t rsa
    这个命令会提示你输入一些信息,如密钥的存储位置和密码等。如果你不希望在每次使用私钥时都输入密码,可以留空密码。完成后,你会在指定的位置(默认是~/.ssh/id_rsa)找到私钥,同时在同一个目录下生成公钥文件(默认是~/.ssh/id_rsa.pub)。
  • 复制公钥到远程服务器
    接下来,我们需要将公钥复制到远程Linux服务器上。在复制之前,请确保你已经拥有远程服务器的SSH访问权限。使用以下命令将公钥复制到远程服务器:
    # ssh-copy-id username@remote_host
    ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.31.2
    这个命令会自动将公钥添加到远程服务器的~/.ssh/authorized_keys文件中,并设置适当的权限。如果你没有安装ssh-copy-id命令,也可以手动复制公钥到远程服务器,然后将其添加到authorized_keys文件中。
  • 配置SSH连接
    一旦公钥被成功地复制到远程服务器上,我们就可以配置SSH连接以实现无密码登录。在本地计算机上,打开~/.ssh/config文件(如果不存在,则创建一个),并添加以下内容:
    vi ~/.ssh/config
      Host remote_host
          HostName remote_host_ip
          User username
          IdentityFile ~/.ssh/id_rsa
免密码

每次备份的时候,都需要输入密码,肯定不适合脚本自动备份,所以我们还需要使用 --password-file 参数来达到自动读取密码的步骤。

# 先将restic仓库密码,比如 test 保存在 /root/resticpasswd 文本中
echo '仓库密码' > /root/resticpasswd

为了自动向 restic 提供存储库密码,有几种选择:

  • 设置环境变量 RESTIC_PASSWORD
  • 通过--password-file 选项或环境变量指定带有密码的文件路径 RESTIC_PASSWORD_FILE
  • 通过--password-command 选项或环境变量,配置在需要密码时调用的程序RESTIC_PASSWORD_COMMAND

初始化备份

配置服务器后,只需更改命令中的 URL 方案即可轻松实现 SFTP 存储库的设置init:

restic -r sftp:user@host:/srv/restic-repo init
enter password for new repository:
enter password again:
created restic repository f1c6108821 at sftp:user@host:/srv/restic-repo
Please note that knowledge of your password is required to access the repository.
Losing your password means that your data is irrecoverably lost.

您还可以指定一个相对目录(注意:没有字符/开头的目录),在这种情况下,该目录相对于远程用户的主目录。

此外,如果 SFTP 服务器强制使用域内的用户,您可以按以下方式指定用户:user@domain@host

说明
请注意,SFTP 服务器不会扩展通常用作用户主目录别名的~符号。如果要指定相对于用户主目录的路径,请将相对路径传递给 SFTP 后端。

如果需要指定端口号或 IPv6 地址,则需要使用 URL 语法。例如,可以这样指定/srv/restic-repo位于[::1](localhost) 端口 2222 的存储库和用户名user

sftp://user@[::1]:2222//srv/restic-repo

请注意双斜线:第一个斜线将连接设置与路径分隔开,而第二个斜线是路径的开头。要指定相对路径,请使用一个斜线。

或者,您可以在ssh配置文件中创建一个Entity,该配置文件通常位于您的主目录~/.ssh/config/etc/ssh/ssh_config中:

Host foo
    User bar
    Port 2222

然后正常使用指定的主机名foo(这种情况下不需要指定用户名):

$ restic -r sftp:foo:/srv/restic-repo init

您还可以添加一个不存在的特殊主机名的条目,仅供 restic 使用,并使用该Hostname选项设置真实主机名:

Host restic-backup-host
    Hostname foo
    User bar
    Port 2222

然后在后端规范中使用它:

$ restic -r sftp:restic-backup-host:/srv/restic-repo init

最后,如果您想使用完全不同的程序来创建 SFTP 连接,您可以使用-o sftp.command="foobar"选项指定要运行的命令 。或者,-o sftp.args 允许设置传递给默认 SSH 命令的参数( 当 sftp.command 设置时忽略)

说明:
请注意,当客户端未收到任何数据时,SFTP 服务器会关闭连接。当 restic 处理大量未更改的数据时,可能会发生这种情况。为避免此问题,请将以下几行添加到客户端的 .ssh/config 文件中:

ServerAliveInterval 60
ServerAliveCountMax 240
作者:Jeebiz  创建时间:2024-08-19 14:03
最后编辑:Jeebiz  更新时间:2024-08-20 17:39