web-dev-qa-db-ja.com

スクリプトで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
2
Timothy Pulliam

二重引用符でシェルが許可するため、コマンド置換はローカルで拡張されています。

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

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

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

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
3
jesse_b