1.修改paramiko源码包实现

https://github.com/paramiko/paramiko/tree/1.10.1  下载源码包

unzip paramiko-1.10.1.zip

paramiko-1.10.1/demos/demo.py  模拟用户登录,在demo.py中会调用interactive.py

paramiko-1.10.1/demos/interactive.py  会把用户执行的命令以及服务器返回的结果打印出来

修改interactive.py,可以把用户名、执行的命令、时间、主机ip记录到日志中

demo.py

  1. import base64
  2. from binascii import hexlify
  3. import getpass
  4. import os
  5. import select
  6. import socket
  7. import sys
  8. import threading
  9. import time
  10. import traceback
  11.  
  12. import paramiko
  13. import interactive
  14.  
  15. #define host
  16. print("\033[34;1mWelcome zhengshun's Fort Machine\nThere have those machines:\033[0m")
  17. dictroy = {
  18. "vc-app01":"192.168.101.131",
  19. "vc-app02":"192.168.101.130",
  20. "vc-app03":"192.168.101.132"
  21. }
  22. while 1:
  23. try:
  24. print('')
  25. for k,v in dictroy.items():
  26. print k,v
  27. print('')
  28. hostname = raw_input('please input IP:')
  29. if hostname == '':continue
  30. elif hostname == 'exit':break
  31. elif hostname == 'quit':break
  32.  
  33. def agent_auth(transport, username):
  34. """
  35. Attempt to authenticate to the given transport using any of the private
  36. keys available from an SSH agent.
  37. """
  38.  
  39. agent = paramiko.Agent()
  40. agent_keys = agent.get_keys()
  41. if len(agent_keys) == 0:
  42. return
  43.  
  44. for key in agent_keys:
  45. print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()),
  46. try:
  47. transport.auth_publickey(username, key)
  48. print '... success!'
  49. return
  50. except paramiko.SSHException:
  51. print '... nope.'
  52.  
  53. def manual_auth(username, hostname):
  54. default_auth = 'p'
  55. auth = 'p'
  56. if len(auth) == 0:
  57. auth = default_auth
  58.  
  59. if auth == 'r':
  60. default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
  61. path = raw_input('RSA key [%s]: ' % default_path)
  62. if len(path) == 0:
  63. path = default_path
  64. try:
  65. key = paramiko.RSAKey.from_private_key_file(path)
  66. except paramiko.PasswordRequiredException:
  67. password = getpass.getpass('RSA key password: ')
  68. key = paramiko.RSAKey.from_private_key_file(path, password)
  69. t.auth_publickey(username, key)
  70. elif auth == 'd':
  71. default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_dsa')
  72. path = raw_input('DSS key [%s]: ' % default_path)
  73. if len(path) == 0:
  74. path = default_path
  75. try:
  76. key = paramiko.DSSKey.from_private_key_file(path)
  77. except paramiko.PasswordRequiredException:
  78. password = getpass.getpass('DSS key password: ')
  79. key = paramiko.DSSKey.from_private_key_file(path, password)
  80. t.auth_publickey(username, key)
  81. else:
  82. pw = '123456'
  83. t.auth_password(username, pw)
  84.  
  85. # setup logging
  86. paramiko.util.log_to_file('demo.log')
  87.  
  88. username = 'root'
  89. if len(hostname) == 0:
  90. print '*** Hostname required.'
  91. sys.exit(1)
  92. port = 22
  93. if hostname.find(':') >= 0:
  94. hostname, portstr = hostname.split(':')
  95. port = int(portstr)
  96.  
  97. # now connect
  98. try:
  99. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  100. sock.connect((hostname, port))
  101. except:
  102. print('\033[31;1minvalid value\033[0m')
  103. continue
  104. #except Exception, e:
  105. # print '*** Connect failed: ' + str(e)
  106. # traceback.print_exc()
  107. # sys.exit(1)
  108.  
  109. try:
  110. t = paramiko.Transport(sock)
  111. try:
  112. t.start_client()
  113. except paramiko.SSHException:
  114. print '*** SSH negotiation failed.'
  115. sys.exit(1)
  116.  
  117. try:
  118. keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
  119. except IOError:
  120. try:
  121. keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
  122. except IOError:
  123. print '*** Unable to open host keys file'
  124. keys = {}
  125.  
  126. # check server's host key -- this is important.
  127. key = t.get_remote_server_key()
  128. if not keys.has_key(hostname):
  129. print '*** WARNING: Unknown host key!'
  130. elif not keys[hostname].has_key(key.get_name()):
  131. print '*** WARNING: Unknown host key!'
  132. elif keys[hostname][key.get_name()] != key:
  133. print '*** WARNING: Host key has changed!!!'
  134. sys.exit(1)
  135. else:
  136. print '*** Host key OK.'
  137.  
  138. # get username
  139. if username == '':
  140. default_username = getpass.getuser()
  141. username = raw_input('Username [%s]: ' % default_username)
  142. if len(username) == 0:
  143. username = default_username
  144.  
  145. agent_auth(t, username)
  146. if not t.is_authenticated():
  147. manual_auth(username, hostname)
  148. if not t.is_authenticated():
  149. print '*** Authentication failed. :('
  150. t.close()
  151. sys.exit(1)
  152.  
  153. chan = t.open_session()
  154. chan.get_pty()
  155. chan.invoke_shell()
  156. print '*** Here we go!'
  157. print
  158. interactive.interactive_shell(chan)
  159. chan.close()
  160. t.close()
  161.  
  162. except Exception, e:
  163. print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e)
  164. traceback.print_exc()
  165. try:
  166. t.close()
  167. except:
  168. pass
  169. sys.exit(1)
  170. except:
  171. continue

  

2.创建跳板机用户,并设置用户登陆的环境变量

注意事项:用户登录跳板机后不能跳过demo.py程序,如果退出demo.py程序则注销跳板机的登陆,只能选择要登陆的主机ip,选择后直接登陆,如果用户在输入错误时,要循环从头开始

adduser audit

vim /home/audit/.bash_profile  在环境变量中加入执行python demo.py文件,执行后logout

3.使用shellinabox实现webssh

https://code.google.com/archive/p/shellinabox/downloads  下载shellinabox-2.14.tar.gz

tar zxf shellinabox-2.14.tar.gz

cd shellinabox-2.14

./configure --prefix=/usr/local/webshell && make && make install

bash /usr/local/webshell/bin/shellinaboxd &    后台运行,shellinabox默认端口是4200

访问https://ip:4200就可以登陆跳板机

展示:

  

Python:webshell 跳板机审计服务器的更多相关文章

  1. python实现跳板机

    公司有1000多台服务器,线上机器都是禁止root登录的,所以平时是用普通用户登录,然后在su到root,密码都是在excel表中存的,这样登录一台机器,输两次命令,搜两次密码,实在很麻烦,有一天备份 ...

  2. winScp 跳板机到服务器

    http://jingyan.baidu.com/article/454316ab6ffe1af7a7c03a31.html?qq-pf-to=pcqq.group

  3. Python通过跳板机链接MySQL的一种方法

  4. 运维堡垒机(跳板机)系统 python

    相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能. A ...

  5. 不输入用户名密码通过跳板机登录到线上linux机器

    问题: 一般情况下,公司所有的服务器都在内网,公网访问.管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址.我们经常看到的现象就是下图这样, ...

  6. 【python】-- paramiko、跳板机(堡垒机)

    paramiko Python的paramiko模块,该模块用于连接远程服务器并执行相关命令,常用于作批量管理使用 一.下载: pip3 install paramiko 源码:查看 二.parami ...

  7. 使用pycharm、跳板机连接内网服务器

    使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...

  8. 在有跳板机的情况下,SecureCRT自动连接到目标服务器

    为了服务器的安全,运维人员经常会要求我们先登录到跳板机,然后再SSH连接到目标服务器.但是这样是很繁琐的,每次在SecureCRT创建一个连接,都需要输入SSH命令,然后输入密码. 下面的方法可以实现 ...

  9. jmeter连接配置带跳板机(SSH)的mysql服务器

    jmeter连接配置mysql服务器时,如果数据库服务器没有通过ssh连接,则只需要配置相应的jdbc参数就可以了,即请求域名或ip地址:3306,如果数据库服务器是通过SSH连接的,那需要通过中间远 ...

随机推荐

  1. HDU1180:诡异的楼梯

    传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...

  2. bzoj 4785: [Zjoi2017]树状数组【树套树】

    参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...

  3. caj转pdf——包含下载链接

    很多人在知网上下载论文后,想转换成PDF格式,本片一站式教学,包含下载链接. 需要工具 1 caj格式的文件,即要转换的文件. 2 cajviewer,可以在知网的官网上面下载,下载地址参考这里. 3 ...

  4. jQuery笔记之data方法

    成品图如下所示: 搭建HTML+CSS结构 <style> /* 给tpl设置为不可见,因为我们不需要用到他,我们只是要克隆他身上的东西,克隆完就把他删掉.就跟渣男一样!!!*/ .tpl ...

  5. BZOJ4571

    BZOJ4571 Description Transmission Gate 给定n个数, m次询问, 每次询问[l,r]范围内的数加上x后异或b的最大值, x, b给出. \[n,m <= 2 ...

  6. MySQL DECIMAL数据类型

    https://blog.csdn.net/zyz511919766/article/details/49335565

  7. jdk线程池,使用手记

    Executors----------------------------------------------Executors------------------------------------ ...

  8. dotnet cors 跨域问题

    研究了一整子的.net core框架,感觉挺好用的,可以用在实际项目中,前端avalon框架也在研究: 问题:跨域,相比原来的跨域解决方案,还是有不小的变化的,原来的.net api 只需要在WebA ...

  9. logging模块基础3

    1.logging模块的日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 D ...

  10. css的过渡背景色

    css3新增的渐变背景色属性用法 原博客地址:http://caibaojian.com/css3-background-gradient.html