我正在嘗試使用下面的程式碼將 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 和導出在遇到某些字元序列時表現不同,但我還沒有找到支持這一假設的確鑿證據。