SSH 连接

SSH 连接类型提供了连接远程服务器的功能,可以使用 SSHHook,并通过 SSHOperator 在远程服务器上运行命令,或者通过 SFTPOperator 从/向远程服务器传输文件。

配置连接

主机 (必填)

要连接的远程主机。

用户名 (可选)

连接到 remote_host 的用户名。

密码 (可选)

指定连接到 remote_host 的用户的密码。

端口 (可选)

要连接的远程主机端口。默认值为 22

额外参数 (可选)

指定可在 SSH 连接中使用的额外参数(JSON 字典格式)。标准 Python 参数之外,还支持以下参数:

  • key_file - 用于连接 `remote_host` 的 SSH 私钥文件的完整路径。

  • private_key - 用于连接 `remote_host` 的私钥内容。

  • private_key_passphrase - 用于解密私钥的私钥密码短语内容。

  • conn_timeout - TCP 连接的可选超时时间(秒)。默认值为 10

  • timeout - 已弃用 - 请改用 conn_timeout。

  • cmd_timeout - 执行命令的超时时间(秒)。默认值为 10 秒。`null` 值表示无超时限制。

  • compress - 设置为 `true` 表示要求远程客户端/服务器压缩流量;设置为 `false` 表示拒绝压缩。默认值为 true

  • no_host_key_check - 设置为 `false` 以限制连接到在 `~/.ssh/known_hosts`(主机文件)中没有对应条目的主机。这提供了针对木马攻击的最大保护,但当 `/etc/ssh/ssh_known_hosts` 文件维护不善或频繁连接新主机时可能会很麻烦。此选项强制用户手动添加所有新主机。默认值为 `true`,ssh 将自动将新的主机密钥添加到用户的已知主机文件。

  • allow_host_key_change - 如果你想允许连接到主机密钥已更改的主机,或遇到“REMOTE HOST IDENTIFICATION HAS CHANGED”错误时,请将其设置为 `true`。这无法防御中间人攻击。另一种可能的解决方案是从 `~/.ssh/known_hosts` 文件中删除该主机条目。默认值为 `false`。

  • look_for_keys - 如果想禁用在 `~/.ssh/` 目录中搜索可发现的私钥文件,请将其设置为 `false`。

  • host_key - 主机的 base64 编码的 ssh-rsa 公钥,或者“ssh- ”(就像你在 `known_hosts` 文件中找到的那样)。指定此参数后,只有当端点的公钥与此值匹配时,才允许建立连接。

  • disabled_algorithms - 一个字典,将算法类型映射到算法标识符的可迭代对象,这些算法将在传输的整个生命周期内被禁用。

  • ciphers - 按优先顺序使用的密码列表。

“extras” 字段示例

{
   "key_file": "/home/airflow/.ssh/id_rsa",
   "conn_timeout": "10",
   "compress": "false",
   "look_for_keys": "false",
   "allow_host_key_change": "false",
   "host_key": "AAAHD...YDWwq==",
   "disabled_algorithms": {"pubkeys": ["rsa-sha2-256", "rsa-sha2-512"]},
   "ciphers": ["aes128-ctr", "aes192-ctr", "aes256-ctr"]
}

将连接指定为 URI(在 AIRFLOW_CONN_{CONN_ID} 变量中)时,应遵循标准连接语法进行指定,其中额外参数作为 URI 的参数传递(注意 URI 的所有组成部分都应进行 URL 编码)。

例如,提供一个包含 `key_file`(其中包含密钥文件路径)的连接字符串

export AIRFLOW_CONN_MAIN_SERVER='ssh://user:pass@localhost:22?conn_timeout=10&compress=false&no_host_key_check=false&allow_host_key_change=true&key_file=%2Fhome%2Fairflow%2F.ssh%2Fid_rsa'

私钥可以编码成单行格式,以便在环境变量中使用,如下所示

python -c 'from urllib.parse import quote_plus, sys; print(quote_plus(sys.stdin.read()))' < /path/to/your/key

然后可以将其导出为环境变量

export AIRFLOW_CONN_SSH_SERVER='ssh://127.0.0.1?private_key=-----BEGIN+RSA+PRIVATE+KEY-----%0D%0AMII.....jBV50%0D%0A-----END+RSA+PRIVATE+KEY-----'

要在 Airflow UI 的额外参数中配置私钥,可以将换行符替换为字面量 \n

python -c 'import re, sys; print(re.sub("\r?\n", "\\\\n", sys.stdin.read()))' < /path/to/your/key

然后可以将结果作为额外参数 JSON 提供,如下所示

{"private_key": "-----BEGIN RSA PRIVATE KEY-----\nMII.....jBV50\n-----END RSA PRIVATE KEY-----"}

此条目有帮助吗?