公司有1000多台服务器,线上机器都是禁止root登录的,所以平时是用普通用户登录,然后在su到root,密码都是在excel表中存的,这样登录一台机器,输两次命令,搜两次密码,实在很麻烦,有一天备份6台机器上的redis,登录就把我登录烦了,于是就用python来实现登录操作,密码表存到mysql中,用python的pexpect来实现交互。

pexpect的用法看http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

最后用  ./passwdbox.py   ip即可自动登录

#!/usr/local/bin/python
# coding: utf-8 ##导入模块
import os
import sys
import pexpect
import MySQLdb
import struct
import fcntl
import termios
import signal ##传入的参数
opt = sys.argv ##如果没跟参数,就提示
if len(opt) == 1:
print '''
----------------------------
'Useage: ./zssh.py ServerIP'
----------------------------
'''
sys.exit(2) ##下面两个函数更改pexpect模拟的窗口大小,
##参见http://guweigang.com/blog/2012/10/25/using-python-ssh-landing-module-performs-pexpect/
def sigwinch_passthrough (sig, data):
winsize = getwinsize()
global foo
foo.setwinsize(winsize[0],winsize[1]) def getwinsize():
if 'TIOCGWINSZ' in dir(termios):
TIOCGWINSZ = termios.TIOCGWINSZ
else:
TIOCGWINSZ = 1074295912L # Assume
s = struct.pack('HHHH', 0, 0, 0, 0)
x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
return struct.unpack('HHHH', x)[0:2] ##传入的ip
ip = opt[1]
##用MySQLdb驱动连接mysql
conn = MySQLdb.connect(host='localhost', user='root', passwd='Te62S#^t', db='sa')
cursor = conn.cursor()
##查找该ip的普通用户名,密码,还有root的密码,用来ssh连接
cursor.execute('select muser,mpass,rpass from password where ip=%s', ip)
result = cursor.fetchall() ##如果没在数据库中发现该ip信息,提示用户输入,并保存,如果发现就准备连接
if len(result) == 0:
muser = raw_input('输入用户名:')
mpass = raw_input('输入用户密码: ')
rpass = raw_input('输入root密码: ')
cursor.execute('insert into password values (%s,%s,%s,%s)', (ip, muser, mpass, rpass))
conn.commit()
elif len(result) == 1:
muser = result[0][0]
mpass = result[0][1]
rpass = result[0][2] ##用pexpect模块的spawn类,连接ssh
foo = pexpect.spawn('ssh %s@%s' % (muser,ip))
while True:
##期望得到列表里的东西
index = foo.expect(['continue', 'assword', pexpect.EOF, pexpect.TIMEOUT],timeout=10)
##如果得到的是continue,也就是第一次连接输入yes/no那,那就发送yes
if index == 0:
foo.sendline('yes')
continue
##如果是提示输入password,那就发送密码
elif index == 1:
foo.sendline(mpass)
##发送密码后有两种情况,登录成功或密码错误
index2 = foo.expect(['password', ']\$'])
##如果得密码正确
if index2 == 1:
print '%s 登录成功' % muser
break
##如果密码错误,提示输入密码
elif index2 == 0:
while True:
muser = raw_input('输入用户名:')
mpass = raw_input('用户密码不对,重新输入: ')
foo.sendline(mpass)
index3 = foo.expect([']\$', 'assword'], timeout=5)
##如果密码对了,就保存到数据库
if index3 == 0:
cursor.execute('update sys_pass set muser=%s, mpass=%s where ip=%s ', (muser, mpass, ip))
conn.commit()
foo.sendline('')
break
##如果不对,再循环一次
else:
continue
else:
print '连接超时'
break ##下面su 到root与上面类似
while True:
foo.expect('$')
foo.sendline('su - root')
#index4 = foo.expect(['口令', '密码', 'assword', pexpect.TIMEOUT, pexpect.EOF],timeout=5)
foo.sendline(rpass)
index5 = foo.expect([']#', 'monitor', pexpect.EOF, pexpect.TIMEOUT], timeout=5)
if index5 == 0:
print 'root 登录成功'
foo.sendline('')
break
elif index5 == 1:
while True:
rpass = raw_input('root密码不对,请输入: ')
foo.expect('$')
foo.sendline('su - root')
#index6 = foo.expect(['口令', '密码', 'assword', pexpect.TIMEOUT, pexpect.EOF],timeout=5)
foo.sendline(rpass)
index7 = foo.expect([']#', 'monitor', pexpect.EOF, pexpect.TIMEOUT], timeout=5)
if index7 == 0:
cursor.execute('update sys_pass set rpass=%s where ip=%s', (rpass, ip))
conn.commit()
print 'root 登录成功'
break
elif index7 == 1:
continue
else:
print 'error'
else:
print 'error' ##这个是利用那两个函数来调节子线程窗口大小
signal.signal(signal.SIGWINCH, sigwinch_passthrough)
size = getwinsize()
foo.setwinsize(size[0], size[1])
##进入interact交互模式
foo.interact()
pass

数据库建立

create database sa;
create table password (ip varchar(15), muser varchar(15), mpass varchar(30), rpass varchar(30));

将密码表的中的ip,普通用户名,密码,root密码插入库中我用的是一个脚本

#!/usr/local/bin/python
import MySQLdb conn = MySQLdb.connect(host='localhost', user='root', passwd='Te62S#^t', db='sa')
cursor = conn.cursor() f = open('passwd.txt')
num = 0
for i in f:
ilist = i.split()
if len(ilist) == 4:
ip = ilist[0]
muser = ilist[1]
mpass = ilist[2]
rpass = ilist[3]
try:
cursor.execute('insert into password values (%s,%s,%s,%s)', (ip, muser, mpass, rpass))
num += 1
except:
pass print num conn.commit()
cursor.close()
conn.commit()

将密码保存到passwd.txt格式类似

IP普通用户名密码root密码

202.106.0.20monitorasdf123Sfadf(adfasdfasdf

202.106.0.21zhswredhathelloworld

python实现跳板机的更多相关文章

  1. Python:webshell 跳板机审计服务器

    1.修改paramiko源码包实现 https://github.com/paramiko/paramiko/tree/1.10.1 下载源码包 unzip paramiko-1.10.1.zip p ...

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

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

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

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

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

  5. CentOS7 开源跳板机(堡垒机) Jumpserver

    开源跳板机(堡垒机)Jumpserver 环境 CentOS 7   x64       关闭 selinux  firewalld jumpserver: 172.24.0.14 testserve ...

  6. 那就用pthon来写个跳板机吧

    1.需求 程序一: 1.后台管理 - 堡垒机上创建用户和密码(堡垒机root封装的类,UserProfile表) - .bashrc /usr/bin/python3 /data/bastion.py ...

  7. Shell跳板机sshstack

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 源码地址: https://github.com/sshstack/sshstack 为什么要写shell跳板机? ...

  8. python之堡垒机(第九天)

    本节作业: 通过使用paramiko和sqlalchemy实现堡垒机功能 主要功能实现: 1.用户登录堡垒机后,无需知道密码或密钥可以SSH登录远端服务器: 2.用户对一个组内所有主机批量执行指定命令 ...

  9. Jump跳板机的搭建和部署

    Jump跳板机简绍   概括 Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. Jumpserver ...

随机推荐

  1. PHP 设计模式 笔记与总结(4)PHP 链式操作的实现

    PHP 链式操作的实现 $db->where()->limit()->order(); 在 Common 下创建 Database.php. 链式操作最核心的地方在于:在方法的最后 ...

  2. Web 在线文件管理器学习笔记与总结(10)查看文件夹中的内容

    ① 读取文件夹大小 a. 封装计算文件夹大小的函数 b.  打开文件夹 c. 循环判断文件夹下的内容是文件还是文件夹,如果是文件,则累积相加文件的大小:如果是文件夹,则递归调用该函数 注意两个问题: ...

  3. SqlServer 高版本数据库 降级

    SQL Server2012 1 首先就来介绍一下SQL Server2012数据库的降级方法,成功之后突然感觉很简单,但是没成功之前很郁闷.废话少说,直接开始. 打开SQL Server2012,连 ...

  4. 【转】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  5. Xlib 窗口属性

    Xlib 窗口属性 转, 无法找到原作者 所有的 InputOutput 窗口都可以有零个或者多个像素的边框宽度,一个可选的背景,一个事件压制掩码(它压制来自孩子的事件传播),和一个 property ...

  6. Asp.net forms认证注意事项

    1.N台服务器配置文件的相关配置要一致 <authentication mode="Forms"> <forms timeout="3600" ...

  7. 500Internal Server Error

    在今晚测试wamp的项目时,当我导入一个项目到www目录下时出现如下错误:Internal Server ErrorThe server encountered an internal error o ...

  8. 使用JetBrains dotMemory 4.0分析内存

    安装下载地址:http://www.jetbrains.com/profiler/ 1.在本地启动web应用后,打开dotMemory,附加进程 2.附加后会看到集中颜色得粗条,不断往左边走动,这是内 ...

  9. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...

  10. 在Windows 环境下编译Qt静态库(QT5.32)

    参考链接 Qt5.3 Tools and Versions MinGW ICU ActivePerl Qt 安装MinGW工具链环境 这里在Win32环境下要安装一个MinGW工具链,这里最好是先安装 ...