Shell

ssh 會話中的導出變數為空

  • December 20, 2015

我正在嘗試在 ssh 會話中導出一個變數,並在下一個寫入命令中引用該變數。

sshpass -p "password" ssh -t -t my-box <<EOF
 export newUrl="this is a url"
 sudo -E sh -c 'echo "url=$newUrl" >> /path/to/file'
 exit
EOF

而不是列印,

url=this is a url

到文件,它只是列印,

url=

為什麼在同一個 ssh 會話中無法訪問變數的值?

由於此處文件由<<EOF(不帶任何引號)表示,因此此處文件的內容會擴展為\$``. 因此$newUrl`,在此處的文件中擴展為它在本地 shell 中的值。

要改為傳遞$newUrl給遠端 shell 並讓它擴展變數,您可以防止$擴展:\$newUrl而不是$newUrl,或使用文字 here-document:&lt;&lt;'EOF'而不是 ``<

您正在擴展newUrl將由 shell 解釋的字元串中的變數。這意味著變數的值將被解釋為一個 shell 腳本片段,而不是一個字元串。如果該值包含 shell 特殊字元,則會發生嚴重破壞。(哪些字元有問題取決於您使用的實際情況解決方案。)

與其使用多層引用和擴展,不如將 URL 作為輸入傳遞給以 root 身份執行的命令。那麼你就沒有什麼好擔心的了。即使 sudo 未配置為 accept -E,這也具有工作的額外優勢,這很常見。您可以使用sudo sh -c 'cat &gt;&gt;/path/to/file'或更好的方法來避免文件中任何潛在的引用問題,sudo tee -a /path/to/file.

sshpass -p "password" ssh -t -t my-box &lt;&lt;'EOF'
 newUrl="this is a url"
 printf '%s\n' "$newUrl" | sudo tee -a /path/to/file
EOF

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