シェルスクリプト ssh はリモートでコマンドを実行して変数に値を代入します

ニーズと目標

SSH 経由でマシン A からマシン B に接続し、関連するコマンドを実行します。コマンドには変数と変数の割り当てが含まれます。

コードは次のとおりです。つまり、マシン 192.111.111.27 に ssh で接続し、/root ディレクトリに cd して ls コマンドを実行します。ls の結果が空でない場合は、echo コマンドを実行します。/root ディレクトリにコンテンツがあることは確かです。

ssh -i /root/.ssh/private_key -tt -o StrictHostKeyChecking=no  [email protected] << eof
cd /
LSRESULT="$(ls)"
echo $LSRESULT
exit
eof

echo コマンドを実行すると、出力が空であることがわかりますが、これは非常に奇妙です。
ここに画像の説明を挿入

問題の原因

これは、SSH 入力リダイレクト (<< eof ... eof) にリモート実行コマンドと変数代入ステートメントを配置しているためです。この場合、スクリプト内の変数割り当てステートメントは、リモート マシンではなくローカル シェルで実行されます。つまり、変数代入ステートメントは、リモートで実行するマシン B では実際には実行されませんが、ssh コマンドが完了してマシン A に返された後に実行されます。ls コマンドの実際の実行パスは次のとおりです。マシン A は ssh を実行しています。 コマンドが配置されたパス。

問題解決

ssh -i /root/.ssh/private_key -tt -o StrictHostKeyChecking=no  [email protected] << eof
cd /
LSRESULT="\$(ls)"
echo \$LSRESULT
exit
eof

このとき、echoコマンドを実行すると、リモートマシン上で実行されたlsコマンドが出力されることがわかります。変更は非常に簡単で、実行するステートメントの外側の層で $ 記号の前にバックスラッシュ \ を追加し、参照される変数にバックスラッシュ \ を追加するだけです。これは、コマンドと変数がリモート マシンで実行されるため、変数を正しく解析して割り当てることができるように \ を使用して適切にエスケープする必要があるためです。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44388689/article/details/131483804