透過 ssh 傳遞環境變數

透過 ssh 傳遞環境變數

我正在嘗試使用下面的程式碼將 env 變數傳遞給 remoye 主機。

ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF' 
pwd 
echo "${current_quarter}" 
EOF

pwd列印遠端主機上的正確位置,但echo "${current_quarter}"不列印 current_quarter。

答案1

透過新增EOF引號,您可以告訴本機 shell 在將此處文件傳遞到 ssh 之前不要展開該文件。根據bash 文件這適用於參數擴展、命令替換和算術擴展。

與我最初編寫此答案時的想法相反,遠端shell 不會受到此影響,並將像您直接在遠端shell 中編寫的那樣執行此處文件(包括在本地shell 中跳過的所有類型的擴展和替換)引用EOF)。

如果您只想使用局部變量,test請從 EOF 中刪除引號:

ssh user@host sh -s <<EOF
pwd
echo $test
EOF

對於魚類用戶來說,它看起來像這樣:

ssh user@host "\
pwd
echo $test
"

現在,如果您想將本地變數test作為遠端變數傳遞remote_test而不是在本地擴展,您只需使用反斜線轉義該變數:

ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF

編輯:

跑步:

ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF

應該與第三個程式碼範例等效,但它env不是 shell 的一部分,也可以在非 bourne shell 中使用。

(然而,這與OP 給出的程式碼範例相同,但由於OP 將此答案標記為正確,我懷疑env 和導出在遇到某些字元序列時表現不同,但我還沒有找到支持這一假設的確鑿證據。

相關內容