SSHで他のサーバーにコマンドを送る

2016.9.21 (水)

SSHはリモートホストをコントロールする通信方法ですが、言ってみれば相手先のサーバーにログインしてしまうと相手先のサーバー内の環境において作業をするということで…つまりはlocal環境で作業していることになります。remotehostにログインすると自分自身はlocalhostになる。ややこしいですが、そういうことです。
しかし、こちら側(localhost)からあちら側(remotehost)をリモート側としてコントロールすることはできるか?というとできます。
例えばこんな例を考えてみてください。

  • MySQLをDumpする。
  • tarでアーカイブする。
  • SCPで転送する。
  • tarを展開する。
  • restoreする。

この一連の動作を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でコマンドを送信する

$ ssh user@hostname command

sshで複数のコマンドを送信する

$ 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

というような感じで行うことができます。よくできてますよね。