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;
}