ssh接続(Keep-Aliveが効かない)のセッションを維持する方法

プログラム

仕事でLinuxサーバへssh接続している際いつの間にかセッションが切れる事があった。
サーバのOS側の設定はいじれないし、ターミナルソフトのKeep-Aliveを設定してもダメでいつの間にかセッションが切れる。

topコマンドなど表示が常に変わるような状況だとセッションを維持している様だったので、定期的にサーバからデータが送信されればいいんだなと妄想した。
色々試行錯誤して出来た物が下記、ちなみに使っているターミナルソフトはRLoginを使っています。
このRLoginにあるスクリプト機能で使っている物を載せておく。

Document.Open();
wait(CONNECT);
sopen(OPEN_LOOK);
swait(90, "$");
sputs("script -fa /var/tmp/$(date +%Y%m%d_%H)_$(whoami).log\r");
while ( sgets(100) != "" );
sputs("TZ=Asia/Tokyo\r");
while ( sgets(100) != "" );
sputs("date\r");
while ( sgets(100) != "" );
sputs("find /var/tmp/_$(whoami) -mtime +100 -exec ls -l {} \;\r");
while ( sgets(100) != "" );
sputs("find /var/tmp/_$(whoami) -mtime +100 -exec rm -f {} \;\r");
while ( sgets(100) != "" );
sputs("ps ux | grep \"[S]end_ACK.sh\" | awk '{ print \"kill -9\", $2 }'| sh\r");
while ( sgets(100) != "" );
sputs("echo \"while true; do echo -n $'\\006'; sleep 30; done\">Send_ACK.sh;sh Send_ACK.sh &\r");
while ( sgets(500) != "" );
sputs("rm Send_ACK.sh\r");
while ( sgets(100) != "" );
sclose();
script -fa /var/tmp/$(date +%Y%m%d_%H)_$(whoami).logログインした日付+時刻とユーザ名でログを取るため
TZ=Asia/TokyoタイムゾーンがUTCになってしまうので日本に設定
dateログインした日時を表示しておく
find /var/tmp/_$(whoami) -mtime +100 -exec ls -l {}過去保存したログがあるか表示
find /var/tmp/_$(whoami) -mtime +100 -exec rm -f {}過去ログを削除
ps ux | grep “[S]end_ACK.sh” | awk ‘{ print “kill -9”, $2 }’| sh過去ログインした際に下で作成・実行したシェルをKILL。
バックグラウンドで実行したシェルが残るのでKILLしておく。
echo “while true; do echo -n $’\006′; sleep 30; done”>Send_ACK.sh;sh Send_ACK.sh &ここがメイン。ACKコードをechoで表示させるシェルを作成し、バックグラウンドで実行する。
rm Send_ACK.sh作成したシェルを削除する。

不要な処理は削除して使ってみてください。

コメント