スクリプトでSSHを使用するBASHサブプロセス?

スクリプトでSSHを使用するBASHサブプロセス?

スクリプトで次のことをしたいと思います。

$ ssh host1 "$(command)"

ただし、次のようにすると、SSH接続が確立される前に子プロセスが実行されます。

$ ssh host1 "$(hostname)"

ローカルコンピュータのホスト名を返します。私は私が望む他のことをより簡単にするためにサブプロセスを使用できるようにしたいと思います。

編集:要求に応じてより完全な例を提供できます。 crontabエントリを追加する必要があるホスト名のリストがあります。各システムは特定のユーザーに属するため、名前にこのエントリを追加する必要があります。システム所有者はシステムのホスト名に含まれているため、ホスト名を確認してsu適切なユーザーを見つけ、それに応じてcrontabを編集できます。たとえば、次のようになります。

for host in $(cat /tmp/hosts); do
echo -e "----------------------------"
echo -e "# SSH to host $host"
echo -e "----------------------------"
ssh $host "su - $(hostname | cut -b-5-); crontab -e";
done

答え1

二重引用符を使用すると、シェルが拡張される可能性があるため、コマンド置換はデフォルトで拡張されます。

二重引用符を使用すると、シェルが、、、$および`履歴\拡張が有効になっていると解釈できます。!

一方、一重引用符はすべての特殊文字をリテラルとして保持します。

したがって、コマンド置換を一重引用符で囲むことで、そのコマンドをそのままリモートシステムに渡すことができます。コマンド置換の一部としてローカル変数を保持する必要がある場合は、エスケープ文字を使用することもできます。

ssh user@host "$(command)"    #will expand locally
ssh user@host '$(command)'    #will expand on the remote machine
ssh user@host "\$(command $local_var)"    #will expand local_var locally but send the command substitution to the remote machine

関連情報