Python之路【第九篇】堡垒机基础&数据库操作

时间:2023-03-08 21:49:16

复习paramiko模块

Python的paramiko模块,是基于SSH用于连接远程服务器并执行相关操作。

SSHClient

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t' import paramiko '''
第一种方法
''' ssh = paramiko.SSHClient() #创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
ssh.connect(hostname='192.168.7.100',port=22,username='root',password='nihao123!')
stdin,stdout,stderror = ssh.exec_command('ifconfig,美女,') #执行命令 print stdout.read() #获取命令结果
print stderror.read() #如果执行错误返回错误结果
ssh.close() #关闭连接

review_paramiko_command.py

'''
第二种方法
''' transport = paramiko.Transport(('192.168.7.100',22)) #创建一个连接对象
transport.connect(username='root',password='nihao123!')#调用transport对象中的连接方法 ssh = paramiko.SSHClient() #创建SSH对象
ssh._transport = transport #把ssh对象中的_transport 字段进行赋值为transport stdin,stdout,stderr = ssh.exec_command('ifconfig') #执行命令 print stdout.read()
print stderr.read() transport.close() '''
第二种方法和第一种方法的区别!
第一种方法
ssh = paramiko.SSHClient() 他的内部的connect其实内部封装了Transport
t = self._transport = Transport(sock, gss_kex=gss_kex, gss_deleg_creds=gss_deleg_creds) 在文件操作的时候只能用第二种方法
'''

review_paramiko_command_Transport.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t' import paramiko private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') ssh = paramiko.SSHClient()#创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_host文件中的的主机
ssh.connect(hostname='192.168.7.100',port=22,username='root',pkey=private_key) #连接服务器
stdin,stdout,stderr = ssh.exec_command('ifconfig') #执行命令
print stdout.read() #获取命令执行结果
ssh.close() '''
如果是运维人员这里不需要看
1、首先创建一个公钥和私钥
ssh-keygen
2、复制id_rsa.pub至要被远程执行命令的机器,并把id_rsa.pub里的内容增加至authorized_keys文件中
如果authorized_keys文件不存在创建即可
'''

review_paramiko_command_key.py

SFTPClient

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko transport = paramiko.Transport(('192.168.7.100',22))
transport.connect(username='root',password='nihao123!') #调用transport进行连接 sftp = paramiko.SFTPClient.from_transport(transport)#然后创建SFTPClient并基于transport连接,把他俩做个绑定 sftp.put('testsftpfile.zip','/tmp/sftpfile-luotianshuai.zip') #将sftpfile.zip上传到目标机器的/tmp/sftpfile-luotianshuai.zip
sftp.get('/tmp/messages.log','shuaige.log') #下载目标服务器/tmp/messages.log 到本地的shuaige.log文件(程序执行目录中) transport.close()

review_paramiko_SFTPClient.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') transport = paramiko.Transport(('192.168.7.100',22))
transport.connect(username='root',pkey=private_key) #调用transport进行连接 sftp = paramiko.SFTPClient.from_transport(transport)#然后创建SFTPClient并基于transport连接,把他俩做个绑定 sftp.put('testsftpfile.zip','/tmp/sftpfile-luotianshuai.zip') #将sftpfile.zip上传到目标机器的/tmp/sftpfile-luotianshuai.zip
sftp.get('/tmp/messages.log','shuaige.log') #下载目标服务器/tmp/messages.log 到本地的shuaige.log文件(程序执行目录中) transport.close()

review_paramiko_SFTPClient_key.py

面向对象封装多个远程操作

#看上面的paramiko执行命令的时候有两种方法,传输文件的时候有一种方法!并且这里在执行命令的时候连接下然后关闭,传输文件的时候传输完后关闭,这样不是很好!

#那么我们可以连接上,然后把执行命令和上传文件写成两个方法操作。

在远程执行命令的时候其实是很快的但是他们消耗的时间基本上都在建立连接上了,所以我们要写成连接上一次执行命令或上传文件全部都完事之后关闭。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import uuid
class Haproxy(object):
def __init__(self):
self.hostname = '192.168.7.100'
self.port = 22
self.username = 'root'
self.password = 'nihao123!'
def create_file(self):
file_name = str(uuid.uuid4()) #这个uuid.uuid4()会生成一个文件UUID然后当作文件名
with open(file_name,'wb') as f:
f.write('This is test file will send to server')
return file_name def run(self):
self.connect()
self.upload()
self.rename()
self.close() def connect(self): #设置连接方法
transport = paramiko.Transport(('192.168.7.100',22)) #创建一个连接对象
transport.connect(username='root',password='nihao123!')#调用transport对象中的连接方法
self.__transport = transport #把transport赋值给__transport def close(self): #关闭连接
self.__transport.close() def upload(self): #上传文件方法
file_name = self.create_file() #创建文件
sftp = paramiko.SFTPClient.from_transport(self.__transport) #创建SFTPClient并基于transport连接,把他俩做个绑定
sftp.put(file_name,'/tmp/luotianshuai.txt') #上传文件 def rename(self): #执行命令方法
ssh = paramiko.SSHClient() #建立ssh对象
ssh._transport = self.__transport #替换ssh_transport字段为self.__transport
stdin,stdout,stderr = ssh.exec_command('mv /tmp/luotianshuai /tmp/shuaige') #执行命令
print stdout.read() #读取执行命令 if __name__ == '__main__':
ha = Haproxy()
ha.run() '''
上面的例子中我们就连接了一次,然后用这一次连接进行命令和上传文件的管理!
不用来回的创建和关闭SSH连接
'''

堡垒机

aaarticlea/png;base64,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" alt="" />

例子1:LINUX下打开一个终端

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import os
import sys
import select
import socket tran = paramiko.Transport(('192.168.7.100', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['root'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root', key)
'''
tran.auth_password('root', 'nihao123!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
'''
while True:
# 监视用户输入和服务器返回数据
# sys.stdin 处理用户输入
# chan 是之前创建的通道,用于接收服务器返回信息
readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1) #坚挺chen和终端
#只要发生变化,chan或者stdin或者都变化
if chan in readable: #远端有变化后捕获到
try:
x = chan.recv(1024)
#ssh连接后他发送接收数据也是通过socket来做的
if len(x) == 0:
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()

open_terminal

#上面的例子中在捕获输出的时候我们输入的一行命令(字符串)回车之后,sys.stdin才捕获到,这个是默认的终端是这样的,我们就可以打开一个文件记录用户的所有命令操作

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import os
import sys
import select
import socket tran = paramiko.Transport(('192.168.7.100', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['root'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root', key)
'''
tran.auth_password('root', 'nihao123!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
'''
log = open('record','ab') #打开一个文件记录用户的输入
while True:
# 监视用户输入和服务器返回数据
# sys.stdin 处理用户输入
# chan 是之前创建的通道,用于接收服务器返回信息
readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1) #坚挺chen和终端
#只要发生变化,chan或者stdin或者都变化
if chan in readable: #远端有变化后捕获到
try:
x = chan.recv(1024)
#ssh连接后他发送接收数据也是通过socket来做的
if len(x) == 0:
log.close() #关闭文件
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() #把用户的那一行输入
log.write(inp) #记录命令
chan.sendall(inp)#发送命令至远端 chan.close()
tran.close()

open_terminal_write_log

#还有个例子是我们在终端输入命令的时候,经常忘记命令全部的字符。

#默认换行,对于特殊字符特殊处理,比如Ctrl+c

#改变终端默认由行+回车-->stdin,改为一个字符--> stdin

首先我们要做的就是修改终端模式:把原来的默认换行为“回车”,特殊字符特殊处理,改为输入一个字符就捕获并且

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import os
import sys
import select
import socket
import termios
import tty tran = paramiko.Transport(('192.168.7.100', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['root'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root', key)
'''
tran.auth_password('root', 'nihao123!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
'''
# 获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
try:
# 为tty设置新属性
# 默认当前tty设备属性:
# 输入一行回车,执行
# CTRL+C 进程退出,遇到特殊字符,特殊处理。 # 这是为原始模式,不认识所有特殊符号
# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
tty.setraw(sys.stdin.fileno()) #把远端更换为LINUX原始模式
chan.settimeout(0.0) while True:
# 监视 用户输入 和 远程服务器返回数据(socket)
# 阻塞,直到句柄可读
r, w, e = select.select([chan, sys.stdin], [], [], 1)
if chan in r:
try:
x = chan.recv(1024)
if len(x) == 0:
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(1)
if len(x) == 0:
break
chan.send(x) finally:
# 重新设置终端属性
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
chan.close()
tran.close()

open_terminal_complemented

记录日志,并且不记录tab输入

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import os
import sys
import select
import socket
import termios
import tty tran = paramiko.Transport(('192.168.7.100', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['root'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root', key)
'''
tran.auth_password('root', 'nihao123!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
'''
# 获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
#打开文件 try:
# 为tty设置新属性
# 默认当前tty设备属性:
# 输入一行回车,执行
# CTRL+C 进程退出,遇到特殊字符,特殊处理。 # 这是为原始模式,不认识所有特殊符号
# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
tty.setraw(sys.stdin.fileno()) #把远端更换为LINUX原始模式
chan.settimeout(0.0)
user_log = open('terminalnew_log','ab')
while True:
# 监视 用户输入 和 远程服务器返回数据(socket)
# 阻塞,直到句柄可读
r, w, e = select.select([chan, sys.stdin], [], [], 1)
if chan in r:
try:
x = chan.recv(1024)
if len(x) == 0:
user_log.close()
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(1)
if len(x) == 0:
break
if x == '\t': #判断用户的是否为tab如果为tab将不记录
pass
else:
user_log.write(x)#如果用户输入的命令保存至日志
chan.send(x) finally:
# 重新设置终端属性
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
chan.close()
tran.close()

open_terminal_complemented_new

 例2:Windows下打开终端

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luo_t'
import paramiko
import sys
import threading tran = paramiko.Transport(('192.168.0.111', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['root'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('root', key)
'''
tran.auth_password('root', 'nihao123!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
'''
sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n") def writeall(sock):
while True:
data = sock.recv(256)
'''
SSH发送数据的也是通过socket进行发送数据的,那么我们就可以使用socket来获取远程机器发送回来的数据。
while循环一直接收数据,sock.recv(256)是阻塞的只有数据过来的时候才会继续走。
'''
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,)) #创建了一个线程,去执行writeall方法,参数为chan(建立的SSH连接)
writer.start() try:
while True: #主线程循环
d = sys.stdin.read(1) #一直监听用户的输入,输入一个发送一个
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass chan.close()
tran.close()

open_terminal_complemented_windows

数据库操作

Python 操作 Mysql 模块的安装

linux:
yum install MySQL-python window:
http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip

SQL基本使用

SHOW DATABASES; #查看当前数据库的的库名
USE jumpserver; #使用jumpserver库
SHOW TABLES; #查看当前库名中的表
CREATE DATABASE shuaige; #创建一个数据库名字为shuaige
FLUSH PRIVILEGES; #刷新系统权限表
create database jumpserver character set = utf8;
use jumpserver
create table host_group
(
group_id int auto_increment primary key ,
name char(20) not null,
description text
);
create table user_info
(
user_id int auto_increment primary key,
user_name char(20) not null,
user_group_id int not null,
foreign key(user_group_id) references host_group(group_id)
); create table host_info
(
host_id int auto_increment primary key,
host_name char(50) not null,
host_type char(50) not null,
address char(15) not null,
cpu_count smallint,
cpu_type char(20),
disk_count smallint,
size_perdisk int,
host_description text
); create table host_group_relation
(
id int,
host_id int not null,
group_id int not null,
foreign key(host_id) references host_info(host_id),
foreign key(group_id) references host_group(group_id),
primary key(host_id,group_id)
); insert into host_group values
(1,'admin','管理员,可以操作所有机器,执行任何操作'),
(2,'developer','程序开发人员,只能操作应用服务器'),
(3,'dba','数据库管理员,只能操作数据库服务器'); insert into user_info values
(1,'luotianshuai',1),(2,'shuaige',2),(3,'timdba',3); insert into host_info (host_id,host_name,host_type,address) values
(1,'host1','web','192.168.137.3'),
(2,'host2','application','192.168.137.2'),
(3,'host3','db','192.168.137.4'); insert into host_group_relation values
(1,1,1),
(2,2,1),
(3,3,1),
(4,2,2),
(5,3,3);

create mysql script

数据操作

insert into students(name,sex,age,tel) values('alex','man',18,'')

delete from students where id =2;

update students set name = 'sb' where id =1;

select * from students

主键
外键
左右连接

Python MySQL API

插入数据:

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')

cur = conn.cursor()

reCount = cur.execute('insert into UserInfo(Name,Address) values(%s,%s)',('tim','china'))
# reCount = cur.execute('insert into UserInfo(Name,Address) values(%(id)s, %(name)s)',{'id':12345,'name':'shuaige'}) conn.commit() cur.close()
conn.close()

批量插入:

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')

cur = conn.cursor()

li =[
('name1','address1'),
('name2','address2'),
]
reCount = cur.executemany('insert into UserInfo(Name,Address) values(%s,%s)',li) conn.commit()
cur.close()
conn.close() print reCount

删除数据:

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')

cur = conn.cursor()

reCount = cur.execute('delete from UserInfo')

conn.commit()

cur.close()
conn.close() print reCount

修改数据:

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')

cur = conn.cursor()

reCount = cur.execute('update UserInfo set Name = %s',('alin',))

conn.commit()
cur.close()
conn.close() print reCount

查数据:

# ############################## fetchone/fetchmany(num)  ##############################

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')
cur = conn.cursor() reCount = cur.execute('select * from UserInfo') print cur.fetchone()
print cur.fetchone()
cur.scroll(-1,mode='relative')
print cur.fetchone()
print cur.fetchone()
cur.scroll(0,mode='absolute')
print cur.fetchone()
print cur.fetchone() cur.close()
conn.close() print reCount # ############################## fetchall ############################## import MySQLdb conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='mydb')
#cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
cur = conn.cursor() reCount = cur.execute('select Name,Address from UserInfo') nRet = cur.fetchall() cur.close()
conn.close() print reCount
print nRet
for i in nRet:
print i[0],i[1]

更多请参考:http://www.cnblogs.com/wupeiqi/articles/5095821.html

Mysql操作更多:http://120662.blog.51cto.com/