免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7069 | 回复: 10
打印 上一主题 下一主题

[文本处理] 服务器SSH反向隧道列表及状态显示 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-14 15:31 |只看该作者 |倒序浏览
30可用积分
本帖最后由 bikkuri 于 2015-02-14 18:11 编辑

大家好,我有一个问题向大家请教。

由于服务器中的SSH反向隧道越来越多了,为了便于管理,希望写一个脚本对其进行管理。

这些反向隧道主要有两类,一类是端口号从55000开始的,对端是Linux服务器;另一类是端口号大于64000的,对端是ENB无线基站。
Linux服务器的连接端口号在~/.bash_profile里有明确的定义。
ENB无线基站的连接端口号保存在"~/无线基站名/enb.port.无线基站名"这样的文本文件中。

主要的数据来源如下:
在~/.bash_profile里定义了连接到各个隧道的快捷命令。可以用以下命令得到Linux服务器的连接端口号及Linux服务器名。
  1. [enb@hp7 ~]$ grep 127.0.0.1 ~/.bash_profile|grep alias|sort -k11
  2. alias ept='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p $(cat enb.port.*) -l root'
  3. alias hp8='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p 55000 -l root'
  4. alias shi='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p 55001 -l root'
  5. alias yok='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p 55002 -l root'
  6. alias edo='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p 55003 -l root'
  7. alias tok='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 127.0.0.1 -p 55004 -l root'
复制代码
用以下命令可以看到目前已经连通的反向隧道端口号:
  1. [enb@hp7 ~]$ netstat -ta|grep "localhost:"
  2. tcp        0      0 localhost:55001             *:*                         LISTEN
  3. tcp        0      0 localhost:55002             *:*                         LISTEN
  4. tcp        0      0 localhost:55003             *:*                         LISTEN
  5. tcp        0      0 localhost:55004             *:*                         LISTEN
  6. tcp        0      0 localhost:64649             *:*                         LISTEN
  7. tcp        0      0 localhost:64650             *:*                         LISTEN
复制代码
ENB无线基站的端口号被保存在/home/enb/enbxxxxx@location/enb.port.enbxxxxx@location这样的文件中。
  1. [enb@hp7 ~]$ ls -l
  2. total 16
  3. drwxrwxr-x 2 enb enb 4096 Feb 14 15:15 enb24042@shanghai
  4. drwxrwxr-x 2 enb enb 4096 Feb 14 15:17 enb43535@shanghai
  5. drwxrwxr-x 2 enb enb 4096 Feb 14 15:18 enb52526@beijing
  6. drwxrwxr-x 2 enb enb 4096 Feb 14 15:15 enb74324@beijing
  7. [enb@hp7 ~]$ cat */enb.port.*
  8. 64649
  9. 64648
  10. 64651
  11. 64650
  12. [enb@hp7 ~]$ cat /home/enb/enb24042@shanghai/enb.port.enb24042@shanghai
  13. 64649
  14. [enb@hp7 ~]$ cat /home/enb/enb74324@beijing/enb.port.enb74324@beijing
  15. 64650
复制代码
通过对上述数据的处理,希望得到以下格式的输出结果。
  1. Host                       Port         Status
  2. ----------------------------------------------
  3. shi                        55001        On
  4. yok                        55002        On
  5. edo                        55003        On
  6. tok                        55004        On
  7. enb24042@shanghai          64649        On
  8. enb74324@beijing           64650        On
  9. ----------------------------------------------
  10. hp8                        55000        Off
  11. enb43535@shanghai          64648        Off
  12. enb52526@beijing           64651        Off
复制代码
处理的脚本希望写成一个show_port函数的形式,保存到~/.bash_profile里,这样执行show_port命令就可以得到输出了。
  1. show_port()
  2. {
  3. ......
  4. }
复制代码
谢谢大家。

最佳答案

查看完整内容

试试这个...城际上3G网络好差....bash_profile的过滤条件你改下即可,你没粘全文我不太确定这样会不会匹配到其他行规则~

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
2 [报告]
发表于 2015-02-14 15:31 |只看该作者
本帖最后由 我是一隻羊 于 2015-02-16 08:43 编辑
  1. #!/bin/bash
  2. show_port(){
  3.         tmp_file=/tmp/.tmpfile
  4.         awk -F'[= ]' '/-p [0-9]+.*/{printf("%-20s%d\n",$2,$(NF-2))}' ~/.bash_profile >> $tmp_file
  5.         find /home/enb  -type f -name '*enb.port*'|xargs egrep -H '[0-9]+'|awk -F. 'split($NF,a,":"){printf("%-20s%d,a[1],a[2])}'>> $tmp_file
  6.         while read line;do
  7.                 netstat -ta|grep -q localhost:${line#* } \
  8.                         && sed -i 's/'$line'/&\tok/' $tmp_file \
  9.                         || sed -i 's/'$line'/&\toff/' $tmp_file
  10.         done
  11.         printf %-20s%s"\t"%s"\n" Host Port Status
  12.         echo "-----"
  13.         grep ok $tmp_file|sort -k2
  14.         echo "-----"
  15.         grep off $tmp_file|sort -k2
  16.         >$tmp_file
  17. }
复制代码
试试这个...城际上3G网络好差....
bash_profile的过滤条件你改下即可,你没粘全文我不太确定这样会不会匹配到其他行规则~

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2015-02-14 17:47 |只看该作者
坐等楼下

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
4 [报告]
发表于 2015-02-15 00:32 |只看该作者
本帖最后由 我是一隻羊 于 2015-02-15 09:12 编辑
  1. #!/bin/bash
  2. show_port(){
  3.         tmp_file=/tmp/.tmpfile
  4.         sed -r 's/alias ([a-z]+)=.*-p ([0-9]+).*/\1\t\t\2/g' ~/.bash_profile >> $tmp_file
  5.         find /home/enb  -type f -name '*enb.port*'|xargs egrep -H '[0-9]+'|awk -F. 'split($NF,a,":"){print a[1]"\t"a[2]}'>> $tmp_file
  6.         while read line;do
  7.                 netstat -tunlp|grep ${line#* } \
  8.                         && sed -i 's/'$line'/&\tok/' $tmp_file \
  9.                                && let num++
  10.                         || sed -i 's/'$line'/&\toff/' $tmp_file
  11.         done < $tmp_file
  12.         sort -rk3 $tmp_file| \
  13.                 sed -e ''$num'a\------------------' \
  14.                     -e '1i\Host\t\t\tPort\tStatus\n------------------'
  15.         >$tmp_file
  16.         unset num
  17. }
复制代码
试试行不...感觉写复杂了...

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2015-02-15 01:43 |只看该作者
谢谢您的指点。
在您的脚本的基础上,我修改了一下。
  1. #!/bin/bash
  2. show_port(){
  3.         tmp_file=/tmp/.tmpfile
  4.         grep 127 .bash_profile |sed -r 's/alias ([0-9a-z]+)=.*-p ([0-9]+).*/\1:\2/g'|grep -vE "(alias|sed)" > $tmp_file
  5.         find /home/enb  -type f -name 'enb.port*'|xargs egrep -H '[0-9]+'|awk -F. 'split($NF,a,":"){print a[1]":"a[2]}'>> $tmp_file
  6.         while read line;do
  7.                 netstat -ta|grep "localhost:" |grep ${line#*:} >/dev/null \
  8.                         && sed -i 's/'$line'/&\tok/' $tmp_file \
  9.                         || sed -i 's/'$line'/&\toff/' $tmp_file
  10.         done < $tmp_file
  11.         sed -i 's/:/\t\t/g' $tmp_file
  12.         echo -e "host\t\tport\tstatus"
  13.         echo "----------------------------------"
  14.         grep ok $tmp_file|sort -k2
  15.         echo "----------------------------------"
  16.         grep off $tmp_file|sort -k2
  17.         rm -rf $tmp_file
  18. }
复制代码
执行结果如下:
  1. [enb@hp7 ~]$ show_port
  2. host            port    status
  3. ----------------------------------
  4. shi             55001   ok
  5. yok             55002   ok
  6. edo             55003   ok
  7. tok             55004   ok
  8. ----------------------------------
  9. hanxiao         54995   off
  10. shilin          54996   off
  11. shanghai                54997   off
  12. yangpu          54998   off
  13. yinzuo          54999   off
  14. hp8             55000   off
  15. enb43535@shanghai             64648   off
  16. enb24042@shanghai             64649   off
  17. enb74324@beijing             64650   off
  18. enb52526@beijing             64651   off
  19. [enb@hp7 ~]$
复制代码
但是由于host的长度不一致,从3-17个字节,导致用制表符\t来定位port和status的显示位置不一致,使得输出不是很好看。
能不能使host字段的输出固定为20个字节,不够长度则向右填充空白?
这样可以使输出显得整齐一些。
谢谢。

我是一隻羊 发表于 2015-02-15 00:32
试试行不...感觉写复杂了...

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
6 [报告]
发表于 2015-02-15 07:28 |只看该作者
回复 4# bikkuri


    可以,printf即可..我没有你的环境...所以不太确定最后生成的格式..就先\t了..
    一会儿赶火车回去板砖,等到公司给你改下~~

论坛徽章:
2
2015年亚洲杯之巴勒斯坦
日期:2015-02-15 12:11:292015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2015-02-15 10:39 |只看该作者
回复 1# bikkuri
  1. netstat -ta |\
  2.         awk -F'[ :.]+' '
  3.                 $4~/localhost:/&&$NF~/LISTEN/{print $4}
  4. ' > netstat.lst

  5. awk -F'[ =]+' '{
  6.         if(FILENAME~/enb/){
  7.                 print FILENAME, $1;
  8.         }else{
  9.                 if($0~/alias/&&$0~/127.0.0.1/){
  10.                         print $2, $(NF-2);
  11.                 }
  12.         }
  13. }' bash_profile enb* > port.lst
  14. awk '
  15.         NR==FNR{
  16.                 a[$2]=$1
  17.         }NR>FNR{
  18.                 b[$1]=$1
  19.         }END{
  20.                 printf("%-25s\t%-15s\t%-5s\n","host", "port", "status")
  21.                 print "---------------------------------------------------------------"
  22.                 for(i in a){if(i in b)   printf("%-25s\t%-15s\t%-5s\n", a[i], i, "on")}
  23.                 print "---------------------------------------------------------------"
  24.                 for(i in a){if(!(i in b))printf("%-25s\t%-15s\t%-5s\n", a[i], i, "off")}
  25.         }
  26. '  port.lst netstat.lst
复制代码

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
8 [报告]
发表于 2015-02-15 11:00 |只看该作者
本帖最后由 reb00t 于 2015-02-15 11:01 编辑

功力不够,这代码我都看吐了。
  1. #!/usr/bin/env python

  2. import os
  3. import sys
  4. import re


  5. d = {}
  6. ddir = "/home/enb"
  7. sp = []
  8. def portlist(ddir,d):
  9.     for root,dirs,files in os.walk(ddir):
  10.         for name in files:
  11.             fp = os.path.join(root, name)
  12.             f = open(fp,'r+')
  13.             text = f.read().strip()
  14.             #pl.append(text)
  15.             d[name] = text

  16. def portdata(d,fname='1'):
  17.     with open(fname) as f:
  18.         for line in f:
  19.             m = re.match(r"^alias\s+(\w+)='ssh.*-p\s+(\d+[^\s]+).*", line)
  20.             if m:
  21.                 k = m.group(1)
  22.                 v= m.group(2)
  23.                 d[k]=v

  24. def netport(sp):
  25.     cmd = "netstat -tna|grep \"localhost:\""
  26.     s=""
  27.     port = os.popen(cmd).readlines()
  28.     #print port,
  29.     for l  in port:
  30.         s=l.split()[3].split(':')[1]
  31.         sp.append(s)


  32. def main():
  33.     portlist(ddir,d)
  34.     portdata(d)
  35.     netport(sp)
  36.     #sp = ['55001','55002','55003','55004']
  37.     print "%-25s\t%-15s\t%-5s\n" %("host", "port", "status")
  38.     print "-"*60
  39.     for k,v in d.items():
  40.         if v in sp:
  41.             print "%-25s\t%-15s\t%-5s" %(k,v,"ok")
  42.         else:
  43.             print "%-25s\t%-15s\t%-5s" %(k,v,"off")


  44. if __name__ == '__main__':
  45.     main()

  46. 结果:
  47. host                            port            status

  48. ------------------------------------------------------------
  49. enb.port.enb74324@beijing       64650           off  
  50. enb.port.enb24042@shanghai      64649           off  
  51. hp8                             55000           off  
  52. yok                             55002           ok   
  53. edo                             55003           ok   
  54. tok                             55004           ok   
  55. shi                             55001           ok               
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
9 [报告]
发表于 2015-02-15 11:50 |只看该作者
本帖最后由 bikkuri 于 2015-02-15 13:08 编辑

谢谢!
.bash_profile的过滤条件没有问题。
  1. show_port(){
  2. tmp_file=/tmp/.tmpfile
  3. grep 127 .bash_profile |awk -F'[= ]' '/-p [0-9]+.*/{printf("%-20s%d\n",$2,$(NF-2))}' > $tmp_file
  4. find /home/enb  -type f -name 'enb.port*'|xargs egrep -H '[0-9]+'|awk -F. 'split($NF,a,":"){printf("%-20s%d\n",a[1],a[2])}'>> $tmp_file
  5. while read line;do
  6. netstat -ta|grep -q "localhost:${line##* }" && sed -i "s/$line/&\tok/" $tmp_file || sed -i "s/$line/&\toff/" $tmp_file
  7. done < $tmp_file
  8. printf %-20s%s"\t"%s"\n" Host Port Status
  9. echo "--------------------------------------"
  10. grep ok $tmp_file|sort -k2
  11. echo "--------------------------------------"
  12. grep off $tmp_file|sort -k2
  13. rm -rf $tmp_file
  14. }
复制代码
这下整齐多了,非常感谢。
  1. [enb@hp7 ~]$ show_port
  2. Host                Port    Status
  3. ----------------------------------
  4. shi                 55001   ok
  5. yok                 55002   ok
  6. edo                 55003   ok
  7. tok                 55004   ok
  8. ----------------------------------
  9. hanxiao             54995   off
  10. shilin              54996   off
  11. shanghai            54997   off
  12. yangpu              54998   off
  13. yinzuo              54999   off
  14. hp8                 55000   off
  15. enb43535@shanghai   64648   off
  16. enb24042@shanghai   64649   off
  17. enb74324@beijing    64650   off
  18. enb52526@beijing    64651   off
  19. [enb@hp7 ~]$
复制代码
我是一隻羊 发表于 2015-02-15 09:03
试试这个...城际上3G网络好差....
bash_profile的过滤条件你改下即可,你没粘全文我不太确定这样会不会匹配 ...

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
10 [报告]
发表于 2015-02-15 13:49 |只看该作者
本帖最后由 zxy877298415 于 2015-02-15 16:16 编辑

回复 1# bikkuri
show_prot(){

netstat -ta|grep "localhost:" | awk -F '[: ]+' '{print $5}' >netstat
awk -F '[= ]+' '/alias/&&$(NF-2)~/[0-9]+/{ print $2,$(NF-2)}' ~/.bash_profile  > bash_profile
for i in `ls | awk '/^enb/'`; do awk '{print FILENAME,$0}' $i >>file; done

awk 'BEGIN{print "host\tport\tstatus";print "--------";}
ARGIND==1{a[$0]=1}ARGIND==2{if(a[$2]) {print $1"\t"$2"\tON"} else {t=t"\n"$0"\tOFF"}}
ARGIND==3{if(a[$2]) {print $1"\t"$2"\tON"} else {k=k"\n"$0"\tOFF"}}
END{print "---------",t,k }' netstat bash_profile file | column -t
}


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP