paramiko与MySQL数据库

一、paramiko

1、利用paramiko连接远端服务器

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.72.132',port=,username='root',password='start33333')
stdin,stdout,stderr = ssh.exec_command('ls -l') #句柄
print stdout.read()
ssh.close()

基于用户名和密码进行连接

import paramiko
transport = paramiko.Transport(('192.168.72.132',))
transport.connect(username='root',password='start33333')
ssh = paramiko.SSHClient()
ssh._transport=transport
stdin,stdout,stderr = ssh.exec_command('ls -l')
print stdout.read()
transport.close()

利用connect类中的transport方法进行连接

2、sftp

import paramiko
transport = paramiko.Transport(('192.168.72.132',))
transport.connect(username='root',password='start33333')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('','/tmp/111')
sftp.get('remote_path','locate_path')
transport.close()

sftp上传或下载

3、paramiko实现修改远程机器配置文件

步骤:a、本地生成文件uuid.ha;b、uuid上传到服务器; c、备份 ha.cnf--->ha.cnf.bak;   d、uuid.ha--->ha.cnf;    f、reload

上述步骤应该一部完成,使用sftpclient和sshclient命令操作;

import paramiko
import uuid
class Haproxy(object):
def __init__(self):
self.host = '192.168.72.220'
self.port =
self.username = 'root'
self.pwd = 'start33333'
def create_file(self):
file_name = str(uuid.uuid4())
with open(file_name,'w') as f:
f.write('Charles')
return file_name
def run(self):
self.connect()
self.upload()
self.rename()
self.close()
def connect(self):
transport = paramiko.Transport(self.host,self.port)
transport.connect(username=self.username,password=self.pwd) #此处只创建一次连接
self.__transport = transport #直到所有的操作都完成断开 def close(self):
self.__transport.close() def upload(self):
file_name = self.create_file()
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(file_name,'/home/Charles/123.py') def rename(self):
ssh = paramiko.SSHClient()
ssh._transport=self.__transport
stdin,stdout,stderr = ssh.exec_command('mv /home/Charles/123.py /home/Charles/456.py')
result = stdout.read()
ssh.close() ha = Haproxy()
ha.run()

文件上传于修改

4、paramiko实现持续性连接

import paramiko
tran = paramiko.Transport(('192.168.72.220',))
tran.start_client()
tran.auth_password('Charles','start33333') #给予密码的认证
chan = tran.open_session() #打开一个通道
chan.get_pty()
chan.invoke_shell() #激活器 import sys,select,socket
while True:
#监视用户的输入和服务器的返回数据
#sys.stdin处理用户的输入
#chan是之前创建的通道,用户接受服务器的返回信息 readable,writeable,error = select.select([chan,sys.stdin,],[],[],)
if chan in readable:
try:
x = chan.recv()
if len(x) == :
print '\r\n***EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in readable:
inp = sys.stdin.readline()
chan.sendall(inp)
chan.close()
tran.close()

实现持续性连接

#上述代码存在的问题,按tab键不能补全,只有回车键发挥发送数据;
#解决方式:、改变默认终端;由行--->stdin变为按字符--->stdin;、点击一次,向终端发送一次;即远程登录之后,改为原始模式,退出到本地之后,改为标准模式; import paramiko
tran = paramiko.Transport(('192.168.72.220',))
tran.start_client()
tran.auth_password('Charles','start33333')
chan = tran.open_session()
chan.get_pty()
chan.invoke_shell()
import select
import sys
import socket
import termios
import tty
oldtty = termios.tcgetattr(sys.stdin)
try:
# 为tty设置新属性
# 默认当前tty设备属性:
# 输入一行回车,执行
# CTRL+C 进程退出,遇到特殊字符,特殊处理。 # 这是为原始模式,不认识所有特殊符号
# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
tty.setraw(sys.stdin.fileno())
chan.settimeout(0.0) while True:
r, w, e = select.select([chan, sys.stdin], [], [], )
if chan in r:
try:
x = chan.recv()
if len(x) == :
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read()
if len(x) == :
break
chan.send(x) finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
chan.close()
tran.close()

修改默认终端

5、paramiko实现连续性连接服务器之记录操作日志

#!/usr/bin/env python
# _*_ coding:utf- _*_
import paramiko
tran = paramiko.Transport(('192.168.72.132',))
tran.start_client()
tran.auth_password('root','start33333')
chan = tran.open_session()
chan.get_pty()
chan.invoke_shell()
import select
import sys
import socket
import termios
import tty
oldtty = termios.tcgetattr(sys.stdin)
try:
tty.setraw(sys.stdin.fileno())
chan.settimeout(0.0)
f = open('record','a') #记录操作日志的文件
while True:
r, w, e = select.select([chan, sys.stdin], [], [], )
if chan in r:
try:
x = chan.recv()
if len(x) == :
print '\r\n*** EOF\r\n',
f.close() #返回为空,没有返回时关闭文件
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read()
if len(x) == :
break
if x == '\t':
pass
else:
f.write(x)
chan.send(x) finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
chan.close()
tran.close()

paramiko实现持续性连接之记录操作日志

以上操作都是在linux机器上完成的,也可以在windows平台上完成,具体在那种平台上执行,可以参考paramiko源码包中的demo文件夹下的demo.py和interactive.py文件设置;

6、paramiko实现堡垒机的功能(利用demo.py和interactive.py实现)

#将上述两个文件拷贝到本地
#!/usr/bin/env python
# _*_ coding:utf- _*_
import os,sys
msg = """\033[42;1mWelcome to using Charles's auditing system!\033[0m"""
print msg
host_dic = {
'Charles':'192.168.72.132',
}
while True:
for hostname,ip in host_dic.items():
print hostname,ip
try:
host = raw_input('please choose one server to login:').strip()
if host == 'quit':
print 'Goodbye!'
break
except KeyboardInterrupt:
sys.exit()
except EOFError:
sys.exit()
if len(host) == :continue
if not host_dic.has_key(host):
print 'No host matched,try again!'
continue
print '\033[32;1mGoing to connect\033[0m',host_dic[host]
os.system("python demo.py %s" %host_dic[host])

7、MySQL数据库操作

import MySQLdb
conn = MySQLdb.connect(host='192.168.72.240',user='root',passwd='start33333',db='S11day11')
cur = conn.cursor() reCount = cur.execute('insert into students(name,sex,age) values(%s,%s,%s)',('Charles','male',)) conn.commit()
cur.close()
conn.close()
print reCount

插入数据

import MySQLdb
conn = MySQLdb.connect(host='192.168.72.240',user='root',passwd='start33333',db='S11day11')
cur = conn.cursor()
li = [
('wahaha','male',),
('xixi','female',)
] reCount = cur.executemany('insert into students(name,sex,age) values(%s,%s,%s)',li) conn.commit()
cur.close()
conn.close()
print reCount

插入多行数据

import MySQLdb
conn = MySQLdb.connect(host='192.168.72.240',user='root',passwd='start33333',db='S11day11')
cur = conn.cursor()
reCount = cur.execute('select * from S11day11.students')
print cur.fetchone() #一个fetchone拿一条数据,指针往下执行一条
print cur.fetchone()
cur.scroll(,mode='absolute')
#cur.scroll(-,mode='relative') #指针向上偏移
print cur.fetchone()
print cur.fetchall() #拿到指针位置以下的全部数据,获取数据的格式全部为元组
conn.commit()
cur.close()
conn.close()
print reCount

数据查询

import MySQLdb
conn = MySQLdb.connect(host='192.168.72.240',user='root',passwd='start33333',db='S11day11')
#cur = conn.cursor()
cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
reCount = cur.execute('select * from S11day11.students')
print cur.fetchone()
print cur.fetchone()
cur.scroll(,mode='absolute')
print cur.fetchone()
print cur.fetchall()
conn.commit()
cur.close()
conn.close()
print reCount {'age': , 'sex': 'male', 'tel': '-', 'id': 1L, 'name': 'alex'}
{'age': , 'sex': 'male', 'tel': '-', 'id': 2L, 'name': 'alex'}
{'age': , 'sex': 'male', 'tel': '-', 'id': 2L, 'name': 'alex'}
({'age': , 'sex': 'male', 'tel': '-', 'id': 3L, 'name': 'Charles'}, {'age': , 'sex': 'male', 'tel': '-', 'id': 4L, 'name': 'wahaha'}, {'age': , 'sex': 'fema', 'tel': '-', 'id': 5L, 'name': 'xixi'})

修改游标,数据格式改变

上一篇:4星|《财经》2018年第13期:年轻人大多从大三和大四起开始就从QQ向微信转移


下一篇:最新linux运维高级架构课13期 架构师课程