在 GitHub 上编辑

SSH 和 SFTP

SSH(安全外壳协议)是一种通过加密来确保与远程计算机连接安全的协议,可让你安全地上传和下载文件(例如使用 scp),并支持其他功能。一些操作可在 SSH 基础上运行,例如 FTP(简单文件传输协议),此时即变为安全的 SFTP

DVC 将作为 SSH/SFTP 客户端,这意味着远程存储应位于一个 SSH 服务器中。dvc remote add 可用于定义远程存储,需指定名称和有效的 SSH URL(可包含用户名或端口等认证信息):

$ dvc remote add -d myremote ssh://user@example.com:2222/path

DVC 需要同时具备 SSH 和 SFTP 访问权限才能使用 SSH 远程存储。请检查是否可以使用 sshsftp 等工具(GNU/Linux 系统)正常连接。
请注意,服务器的 SFTP 根目录可能与其物理根目录(/)不同。

默认情况下,URL 中未包含的身份验证凭据(如用户名、密码或私钥等)将从 SSH 配置中加载。你也可以直接通过 DVC 设置这些凭据。

自定义身份验证

SSH URL 中通常包含的两个参数是用户名和端口。这些参数可通过以下方式设置(或覆盖):

$ dvc remote modify myremote user myuser
$ dvc remote modify myremote port 2222

当多个位置定义了这些值时,DVC 选择它们的优先顺序如下:

  1. 在这些 user/port 参数中设置的值(DVC 特定配置)
  2. 嵌入在 url 中的用户/端口(如果有,例如 ssh://user@example.com:2222
  3. 在 SSH 配置中为该主机定义的 User/Port
  4. 默认值:当前系统用户;标准 SSH 端口 22

使用 dvc remote modify --local 标志可将敏感用户信息写入 Git 忽略的配置文件(.dvc/config.local),以避免通过 Git 泄露任何机密信息。参见 配置

使用私钥通常是推荐的 SSH 身份验证方式,且应将其保存在密钥文件中。你可以按如下方式设置其路径。通常这些密钥还需要一个密码短语:你可以配置 DVC 每次使用时提示输入,或直接设置密码。

$ dvc remote modify --local myremote keyfile /path/to/keyfile
# and (if needed)
$ dvc remote modify myremote ask_passphrase true
# or
$ dvc remote modify --local myremote passphrase mypassphrase

另一种常见的 SSH 身份验证方式是使用简单密码。你可以直接设置密码,或配置 DVC 在需要时提示输入:

$ dvc remote modify --local myremote password mypassword
# or
$ dvc remote modify myremote ask_password true

更多配置参数

  • url - 修改远程位置(详见上方说明)

  • allow_agent - 是否使用 SSH 代理(默认为 true)。将其设置为 falsessh-agent 导致问题时很有用,例如出现“无现有会话”错误。

  • gss_auth - 如果主机支持,则使用通用安全服务认证(例如 Kerberos)。默认为 false

    使用 GSS 需要安装 paramiko[gssapi],目前仅 DVC 的 pip 包支持(通过 pip install 'dvc[ssh_gssapi]' 安装)。

  • max_sessions - 更改连接 SSH 服务器时使用的最大 SSH 和 SFTP 会话数。最小值为 3,默认为 10。不应超过服务器端允许的最大会话数。

    DVC 将尝试从 SSH 服务器使用尽可能多的 SFTP 会话(最多至 max_sessions)以并行执行远程传输操作。广泛使用的 OpenSSH 服务器(sshd)默认将 MaxSessions 的值设为 10。这意味着默认情况下,DVC 将尝试使用服务器上所有可用的会话。在某些情况下,可能需要指定一个较低的 max_sessions 值,以确保为其他(非 DVC)的 SSH 或 SFTP 连接保留一定数量的可用会话。

    当遇到“无法创建任何 SFTP 连接”错误时,表示 DVC 无法从 SSH 服务器打开任何会话。在这种情况下,我们建议将 max_sessions 设置为小于服务器端最大会话数的某个值。

内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天