Bash

在將本地 bash 腳本中的變數傳遞給 SSH 之前展開變數

  • January 21, 2019

我正在嘗試通過 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 在伺服器上不允許它,並且不會嘗試從客戶端發送任何內容。相關的配置選項AcceptEnvsshd_config(伺服器)和(客戶端)SendEnvssh_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命令而不是 standard export,其他 shell 可能不支持這些命令。因此,如果您的本地 shell 是 Bash,那麼您將sh在遠端啟動一個標準,你會得到錯誤。)

引用自:https://unix.stackexchange.com/questions/495852