sshポート転送を利用する
GWサーバ(CGI起動できる)
サーバ1[ch](GWサーバーからみえる、サーバー2からみえる GWとサーバー1をつなぐ踏み台 兼 サーバー1のポートとLWBのポートが結ばれている)
サーバ2[in](サーバ1からみえ、LWBもみえる サーバー1とLWBをつなぐ踏み台サーバー)
LWBサーバ
以下の2つのポートフォーワードを行う.
イメージとしては、
(0)CGI: GWサーバーのポートの80へのリクエストをGWサーバーの12345ポートへ転送 GWサーバ上でWebリクエストイベント時に実行.
(1)フォーワード[A]:GWサーバー:12345番ポート->サーバー1の23456ポート GWサーバー上で実行:踏み台サーバー1[ch] [キープ]
(2)フォーワード[B]: サーバー1[b]:23456ポート->LWBサーバー:80ポート サーバー1上で実行:踏み台サーバー2[in] [フォーワードAを構築するたびによぶ]
(1)ポート転送してGWサーバからLGWのウェブサーバーにアクセスできるようにする.
GWサーバに以下のようなスクリプトをおく.
(i)GWサーバーの12345ポートにサーバ1の23456ポートを転送
(ii)サーバー1上のauto_ac.sh を起動.
GWサーバー上に設置(web_keep.rb, web_keep.sh これをnohup web_keep.sh で落とさないようにしておく):
やってることは、(1)サーバーAにアクセス.フォワード[A]を構築.login1.shを起動してフォーワード[B]を構築.
(2) (1)を60秒ごとに繰り返す.
port1.rb (これは使はない webuseの簡易版)
require 'rubygems' require 'net/ssh' opt={ :passphrase => 'password1' } opt2={ :passphrase => 'password2' } stdout="" Net::SSH.start('サーバー1.com','username',opt) do |ssh| # ssh.exec!("ls") do |channel,stream,data| # stdout << data if stream == :stdout # enda puts "hello" t=Thread.new do ssh.forward.local(12345,"localhost",23456) puts "Hello2" end puts "hello2b" ssh.exec!("/bin/sh login1.sh") do |chanel, stream,data| stdout << data if stream == :stdout puts stdout end end
web_keep.rb (落ちないようにする、これを設置しておく)
#!/usr/local/bin/ruby require 'rubygems' require 'net/ssh' opt={ # :keys => '~/.ssh', :passphrase => 'password' } opt2={ :passphrase => 'password2' } f=open("error_file.txt","w") def ssh_tonnel(opt , f) stdout="" stderr="" Net::SSH.start('サーバー1','username',opt) do |ssh| # ssh.exec!("ls") do |channel,stream,data| # stdout << data if stream == :stdout # enda puts "hello" t=Thread.new do ssh.forward.local(12345,"localhost",23456) f.puts "Hello2" end puts "hello2b" ssh.exec!("/bin/sh login1.sh 2>>tmp1a >>tmp1b") do |chanel, stream,data| stdout << data if stream == :stdout stderr << data if stream == :stderr puts stdout f.puts stdout f.puts stderr end end puts stdout end ssh_tonnel(opt,f) while 1==2 begin # ssh_tonnel(opt) f.puts("begin") # f.flush t2=Thread.new do ssh_tonnel(opt,f) end sleep(60) Thread::kill(t2) f.flush f.puts(Time.now) f.puts("end") f.flush rescue f.puts("error begin") f.puts(Time.now) f.puts("error end") f.flush # exit end end
おちても復活できるように。。
web_keep.sh
#!/bin/sh
while test 1 -eq 1
do
./web_keep.rb &
str=$!
echo $strsleep 60;
kill $strdone
サーバー1に以下のようなスクリプトauto_ac.shをおく(あまりよくないの改良の必要あり)
フォーワードV[LGWサーバー:80番ポート->サーバー1の23456ポート 踏み台サーバー2].
http://tree-tips.appspot.com/mac/ssh_auto_login/ 参考
login1.sh
echo "heelo" . ./auto_login.sh auto_ssh
auto_login.sh (実効権限を付与)
#!/bin/sh auto_ssh() { host="サーバー2のIP" id="username" pass="password" expect -c " set timeout 10 spawn ssh -L 23456:LWSのIPアドレス:80 ${id}@${host} expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" expect \"${id}@${host}'s password:\" send \"${pass}\n\" } \"${id}@${host}'s password:\" { send \"${pass}\n\" } interact " }
(3)nohup ruby port.rb としておけば,WSサーバからログアウトしても
WS上からlocalhost:12345 でLGWにアクセスできる.
(4)もしかしたら、~/.ssh/config みたいなので接続時間をのばすことが必要.
http://www.maruko2.com/mw/ssh_%E6%8E%A5%E7%B6%9A%E3%82%92%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
参考に
config
ServerAliveInterval 15
(5)生きていれば,curl http://localhost:12345 とかででてくるはず
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
★CGIの利用
外に変えすCGI
やってること:WBSの80番にきたリクエストをWBSの12345ポート(トンネルでLWSの80番ポートにつながる)
に転送する.
http://takuya-1st.hatenablog.jp/entry/20121121/1353477494
curl等を利用したCGIを作り、そこからアクセス
例
#!/bin/sh URL=http://localhost:12345 header=`curl -I $URL | grep Conten` echo $header echo "" curl $URL
?移行で指定したファイルを出力
例えば、WBサーバのIPアドレス/test.cgi?tmp.html
だとtmp.htmlをだすことができる.
test.cgi
#!/bin/sh request=$REQUEST_URI request_file=`echo $request | sed "s/.*echo.cgi?//g" ` URL=http://localhost:12345/${request_file} header=`curl -I $URL | grep Content-Type` str=`echo "$header" | sed "s/;.*//g"` echo $str echo "" curl $URL
POST対応版:
#!/bin/sh request=$REQUEST_URI request_file=`echo $request | sed "s/.*echo.cgi?//g" ` URL=http://localhost:43890/${request_file} REQUEST=${REQUEST_METHOD} if test ${REQUEST} = "GET"; then header=`curl -I $URL | grep Content-Type` #for i in `echo "$header"`;do #f123=echo "$header" > tmp4 #done str=`echo "$header" | sed "s/;.*//g"` echo $str echo "" #echo "Content-type: text/html" #echo "" #echo "" #echo ${request} #echo ${request_file} curl $URL #echo $header #echo "$str 123" fi if test ${REQUEST} = "POST"; then #echo "Content-type: test/html" #echo "" #echo "This is Post" header=`curl -I $URL | grep Content-Type` str=`echo "$header" | sed "s/;.*//g"` echo $str echo "" read LINE curl $URL -X POST -d $LINE fi
#!/bin/sh filename=$1 basedir=$2 if test $basedir"" = ""; then basedir=`pwd` fi basedir2=`echo $basedir | sed "s/var.*html\///g" | sed 's/\//\\\\\//g'` echo $filename echo $basedir2 sed "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g" $filename.html > ${filename}d.html sed "/http/! s/src=\\\"/src=\\\"echo.cgi?${basedir2}\//g" ${filename}d.html > ${filename}d2.html sed "s/get(\"/get(\"echo.cgi?${basedir2}\//g" ${filename}d2.html > ${filename}d3.html sed "s/:url(\"/:url(\"echo.cgi?${basedir2}\//g" ${filename}d3.html > ${filename}_web.html
変換スクリプト改善版
#!/bin/sh filename="syoku_genjyou9" basedir="tmp/syoku_list" basecgidir="\/cgi-bin\/AAAA\/BBBB" open_dir="cgi-bin\/CCC" css_dir="base/css" if test $basedir"" = ""; then basedir=`pwd` fi basedir2=`echo $basedir | sed "s/var.*html\///g" | sed 's/\//\\\\\//g'` echo $filename echo $basedir2 echo "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g" sed "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g" $filename.html > ${filename}d.html sed "/http/! s/src=\\\"/src=\\\"echo.cgi?${basedir2}\//g" ${filename}d.html > ${filename}d2.html sed "s/get(\"/get(\"echo.cgi?${basedir2}\//g" ${filename}d2.html > ${filename}d3.html sed "s/:url(\"/:url(\"echo.cgi?${basedir2}\//g" ${filename}d3.html > ${filename}d4.html mkdir ${css_dir}/web_css find base/css -name "*.css" -printf "%f\n" | xargs -n1 -I% bash -c "sed -e \"s:url(:url(echo.cgi?${base_dir}/${css_dir}/:g\" base/css/% > ${css_dir}/web_css/%" sed -e "s:${css_dir}:${css_dir}/web_css:g" ${filename}d4.html > ${filename}d5.html sed "s/cgi-bin/"${open_dir}"\/echo.cgi?cgi-bin/g" ${filename}d5.html > ${filename}_web.html
高機能版
出力前にurlでsedを変換することで事前に変換せずにgrobal化できる.
(trans.sed を環境に合わせてチューニング)
#!/bin/sh request=$REQUEST_URI request_file=`echo $request | sed "s/.*echo.cgi?//g" ` URL=http://localhost:43890/${request_file} REQUEST=${REQUEST_METHOD} if test ${REQUEST} = "GET"; then header=`curl -I $URL | grep Content-Type` #for i in `echo "$header"`;do #f123=echo "$header" > tmp4 #done str=`echo "$header" | sed "s/;.*//g"` #str="Content-type: text/html" echo $str echo "" #echo "Content-type: text/html" #echo "" #echo "" #echo ${request} #echo ${request_file} #echo "hello" if test `echo $header | sed s/.*text.*/a/g` = "a"; then test=`curl $URL` echo "$test" | ./trans.sed else curl $URL fi #echo $test #echo $header #echo "$str 123" fi if test ${REQUEST} = "POST"; then #echo "Content-type: test/html" #echo "" #echo "This is Post" header=`curl -I $URL | grep Content-Type` str=`echo "$header" | sed "s/;.*//g"` echo $str echo "" read LINE curl $URL -X POST -d $LINE fi
trans.sed
#!/bin/sed -f #s:test:test2:g s:href=\":href=\"echo.cgi?tmp/syoku_list/:g /http/! s:src=\":src=\"echo.cgi?tmp/syoku_list/:g s:get(\":get(\"echo.cgi?tmp/syoku_list/:g s:url(\":url(\"echo.cgi?tmp/syoku_list/:g s:cgi-bin:cgi-bin/AAA/echo.cgi?cgi-bin:g #Fro flxigrid s:url(images/:url(echo.cgi?tmp/syoku_list/base/css/images/:g
baを直す必要がある