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-----"}

此條目有幫助嗎?