Bash
在將本地 bash 腳本中的變數傳遞給 SSH 之前展開變數
我正在嘗試通過 SSH 在遠端主機上執行腳本。該腳本使用在本地shell上設置的環境變數。腳本中的變數沒有展開。
ssh user@host 'bash -s' < script.sh
內容
script.sh
:#!/bin/bash docker pull "$IMAGE"
在遠端主機上執行如下:
docker pull ""
如錯誤輸出所示:
解析參考錯誤:“”不是有效的儲存庫/標籤:儲存庫名稱必須至少包含一個組件
我嘗試使用命令替換:
ssh user@host < $(cat script.sh)
這導致:
bash:第 95 行:$(cat script.sh):不明確的重定向
script.sh
在通過 SSH 傳遞命令之前,如何使變數展開?
原則上,您可以通過 SSH 將環境變數發送到遠端,但至少 OpenSSH 在伺服器上不允許它,並且不會嘗試從客戶端發送任何內容。相關的配置選項
AcceptEnv
在sshd_config
(伺服器)和(客戶端)SendEnv
中ssh_config
。假設您不能或不想更改那裡的配置,因為無論如何您都將整個腳本發送到遙控器上的標準輸入,您也可以將變數分配粘貼在該腳本的前面。
我們可以使用
export -p
列印出目前 shell 中所有導出的變數,以遠端 shell 可以用來分配它們的格式。然後遙控器可以像往常一樣處理腳本,並設置變數。所以與
script.sh
包含echo "$FOO" "$HOSTNAME"
這將
FOO
在本地 shell 中導出,然後將所有導出變數的定義連同腳本本身一起傳遞給遠端。結果輸出包含FOO
剛剛設置的值。$ export FOO=abc123 $ (export -p; cat script.sh) | ssh user@remotehost 'bash -s' FOO: abc123 HOSTNAME: remotehost
(這裡的 Bash 有一個小問題。在正常模式下,它會
export -p
列印出declare
命令而不是 standardexport
,其他 shell 可能不支持這些命令。因此,如果您的本地 shell 是 Bash,那麼您將sh
在遠端啟動一個標準,你會得到錯誤。)