====== 04 SSHトンネルでMySQL ======
実行するサーバの「33306」ポートを接続先の「localhost:3306」へポートフォワード
$ ssh -2 -f -N -L 33306:localhost:3306 root@157.7.167.197
・オプションの説明
-2: バージョン2だけを利用
-f: バックグラウンドに移行するよう指示します。
-N: リモートコマンドを実行しません。これはポート転送のみをおこないたい場合(プロトコル バージョン 2 のみ)。
-L: ポート転送を追加したい場合
===== 簡易トンネル監視スクリプト =====
#!/usr/bin/perl
use Net::SMTP;
use Expect;
our($DEBUG) = 0;
my(@ret) = `netstat -anl --tcp`;
my($line) = '';
my($f) = 0;
foreach $line (@ret){
$f = 1 if $line =~ /\:\:1\:3307/;
}
if($DEBUG){
print $f . "\n";
}
if($f == 0){
my($command) = 'ssh -2 -f -N -L 3307:localhost:3306 root@hogehoge >/dev/null 2>&1';
my($ex) = "";
my($mes) = '';
unless($ex = Expect->spawn($command)){
$mes = "expect not spawn\n";
}
else {
unless ($ex->expect(15,"password:")) {
$mes = "login prompt not got\n";
}
else {
print $ex->send( "[PASSWORD]\n");
$ex->expect(10);
$ex->hard_close();
$mes = "relogin ok\n";
}
}
$smtp = Net::SMTP->new('mx.hogehoge.com');
$smtp->mail('tunnel_checker@hogehoge.com');
$smtp->to('hoge@hoghoge.com');
$smtp->data();
$smtp->datasend("To: hoge\@hogehoge.com\n");
$smtp->datasend("From: tunnel_checker\@hogehoge.com\n");
$smtp->datasend("Subject: [alert] tunnel down\n");
$smtp->datasend("\n");
$smtp->datasend("ssh tunnel via watcher_db is down\n");
$smtp->datasend("\n");
$smtp->datasend($mes);
$smtp->dataend();
$smtp->quit;
}