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