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セッション内で変数値にアクセスできないのはなぜですか?
答え1
ここの文書は<<EOF
(引用符なし)で表示されるため、ここの文書の内容はに制限されます\$`
。したがって、$newUrl
ここのドキュメントはローカルシェルの値に展開されます。
リモートシェルに渡して$newUrl
変数を拡張するには、$
拡張を防止するか、\$newUrl
代わりに「<の代わりに
$newUrl
here-document:リテラルを使用できます。<<'EOF'
newUrl
変数をシェルで解釈する文字列に展開します。これは、変数の値が文字列ではなくシェルスクリプトの断片として解釈されることを意味します。値にシェル特殊文字が含まれていると、重大な破損が発生する可能性があります。 (どの文字が問題なのかは、使用する名目上の大文字と小文字の解決によって異なります。)
複数層の引用と拡張を使用する代わりに、root として実行されるコマンドへの入力として URL を渡します。それでは心配することはありません。これは、sudoがそれを許可するように構成されていない場合でも機能するという-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
答え2
sudoを使用してエクスポートしようとします。この変数は、他のユーザーと sudo を使用すると失われます。Defaults env_keep += "newUrl"
sudoersファイルでも設定できます。