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 的額外引數中配置私鑰,可以將換行符替換為字面量
\npython -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-----"}