hello foo bar
SSHはリモートホストをコントロールする通信方法ですが、言ってみれば相手先のサーバーにログインしてしまうと相手先のサーバー内の環境において作業をするということで…つまりはlocal環境で作業していることになります。remotehostにログインすると自分自身はlocalhostになる。ややこしいですが、そういうことです。
しかし、こちら側(localhost)からあちら側(remotehost)をリモート側としてコントロールすることはできるか?というとできます。
例えばこんな例を考えてみてください。
この一連の動作をcronで行おうとするとき、1〜3はlocalhost側で作業します。4,5はリモートホスト側の作業になるので、この作業は1〜3の動作と別のshファイルとかを用意しなければなりません。一連の動作なのにそれぞれのサーバーに2つ置くというのもいやだし、cronでバッチ処理をしているとしたら双方のサーバーで時間をずらして実行するのも嫌な感じ。メンテナンス性もよくない。
となるとこちら側(localhost)でもってremotehost側をコントロールして一枚のファイルに収めて、そのshファイルをcronで叩きたいところです。
やり方としてしては2つ、パイプで渡す方法とSSHでもってコマンドを送信しまう方法があります。送信先にそのコマンドがないと元も子もないのですが、コマンドは送信できます。
$ echo command | ssh user@hostname
$ echo "command;command" | ssh user@hostname
$ ssh user@hostname command
$ ssh user@hostname "command1;command2"
特に実用性はありませんが、4,5の作業をコマンドにするとしたら、
$ ssh user@hostname tar -xzf dump.tar.gz
$ ssh user@hostname mysql -u username -pxxxxxx dbname < dump.sql
というような感じで行うことができます。よくできてますよね。