Shell
ssh 會話中的導出變數為空
我正在嘗試在 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:<<'EOF'
而不是 ``<您正在擴展
newUrl
將由 shell 解釋的字元串中的變數。這意味著變數的值將被解釋為一個 shell 腳本片段,而不是一個字元串。如果該值包含 shell 特殊字元,則會發生嚴重破壞。(哪些字元有問題取決於您使用的實際情況解決方案。)與其使用多層引用和擴展,不如將 URL 作為輸入傳遞給以 root 身份執行的命令。那麼你就沒有什麼好擔心的了。即使 sudo 未配置為 accept
-E
,這也具有工作的額外優勢,這很常見。您可以使用sudo sh -c 'cat >>/path/to/file'
或更好的方法來避免文件中任何潛在的引用問題,sudo tee -a /path/to/file
.sshpass -p "password" ssh -t -t my-box <<'EOF' newUrl="this is a url" printf '%s\n' "$newUrl" | sudo tee -a /path/to/file EOF