ローカルからリモートのサーバでコマンドをそのまま実行させるSSHラッパーコマンド ~ローカルから複数のリモートサーバへ並列処理を可能にするシェルスクリプト(バッチ処理プログラム)~

AWS,EC2,Programming,Shell Script

最近ではパブリッククラウドが一般的に使用されるようになり、インターネットを介してクラウド上のインスタンスにログインする際にはSSHを必ずと言っていいほど使用するようになりました。

SSHは公開鍵認証を使用することが可能で通信も暗号化されているため、ログイン以外にもクラウドライクなサーバー間連携にも利用されるなど必要不可欠なプロトコルとなっています。

今回はSSHを用いたサーバ間連携を容易にし、サーバごとにスクリプトを用意することで複数サーバに対して並列処理のコマンドを実行できるSSHラッパーコマンドのシェルスクリプト(バッチ処理プログラム)を紹介します。

ローカルからリモートのサーバでコマンドをそのまま実行させるSSHラッパーコマンド ~ローカルから複数のリモートサーバへ並列処理を可能にするシェルスクリプト(バッチ処理プログラム)~

下記に記載してある内容でSSHラッパーコマンドを各サーバ毎に作成することで、実行元のサーバのローカルにいながらにしてリモートサーバへSSH経由でコマンドを実行できるようになります。

このSSHラッパーコマンドを使用して複数のサーバに任意のコマンドを実行することでSSH経由の並列処理を実現することができます。

ローカルからリモートのサーバでコマンドをそのまま実行させるSSHラッパーコマンド

今回のサンプルでは通信速度よりも通信量を考慮してsshコマンドのオプション「-C -o CompressionLevel=9」で全てのデータの圧縮をレベル9(最高圧縮)で指定しています。

「-i ~/.ssh/private_key.pem」の部分は公開鍵認証の秘密鍵のパスを指定しています。

「mag4j@mag4j.com」の部分はログイン対象のユーザー名とホスト名です。

「"export PATH=[実行時に通すパス] && $*"」とすることでリモートサーバで実行する際のパスを設定して、後続のコマンドを実行できます。

今回は以前の記事で紹介したpyenv, rbenv, ndenvでインストールしたpython, ruby, nodeを使えるようなパス設定をしています。

参考記事:「pyenv、rbenv、ndenvをシステム全体・システムワイドにインストールし、Python、Ruby、Node.jsのバージョンを使い分ける 〜Amazon Linux、CentOSで実行できる最新バージョンをインストールするシェルスクリプト(バッチ処理プログラム)〜

上記いずれのsshコマンドのオプションも実行環境に応じて変更する必要があります。

[mag4j@localhost ~]# vim ssh-cmd
#!/bin/bash

ssh -C -o CompressionLevel=9 -i ~/.ssh/private_key.pem mag4j@mag4j.com "export PATH=/usr/local/pyenv/shims:/usr/local/pyenv/bin:/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/ndenv/shims:/usr/local/ndenv/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:\$HOME/bin:\$PATH && $*"

ローカルからリモートのサーバでコマンドをそのまま実行させるSSHラッパーコマンドの実行例

[mag4j@localhost ~]# chmod 755 ssh-cmd
[mag4j@localhost ~]# ./ssh-cmd whoami
mag4j
[mag4j@localhost ~]# ./ssh-cmd uname -a
Linux ip-10-0-0-5 4.4.35-33.55.amzn1.x86_64 #1 SMP Tue Dec 6 20:30:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Reference: Tech Blog citing related sources