SSHセッション内でエクスポートされた変数は空です。

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セッション内で変数値にアクセスできないのはなぜですか?

答え1

ここの文書は<<EOF(引用符なし)で表示されるため、ここの文書の内容はに制限されます\$`。したがって、$newUrlここのドキュメントはローカルシェルの値に展開されます。

リモートシェルに渡して$newUrl変数を拡張するには、$拡張を防止するか、\$newUrl代わりに「<の代わりに $newUrlhere-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ファイルでも設定できます。

関連情報