スクリプトで次のようなことをしたい
$ 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
二重引用符でシェルが許可するため、コマンド置換はローカルで拡張されています。
二重引用符を使用すると、シェルは$
、`
、\
を解釈でき、履歴拡張が有効になっている場合は!
を解釈できます。
一方、一重引用符は、すべての特殊文字のリテラル値を保持します。
したがって、コマンド置換を一重引用符で囲むと、それがそのままリモートマシンに渡されるようになります。コマンド置換の一部としてローカル変数を保持する必要がある場合は、これにエスケープ文字を使用することもできます。
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