码迷,mamicode.com
首页 > 数据库 > 详细

Python之paramiko模块和SQL连接API

时间:2016-01-11 15:14:08      阅读:1515      评论:0      收藏:0      [点我收藏+]

标签:

堡垒机前戏

开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作

SSHClient

用于连接远程服务器并执行基本命令

基于用户名密码连接:

import paramiko
  
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname=c1.salt.com, port=22, username=weibinf, password=123)
  
# 执行命令
stdin, stdout, stderr = ssh.exec_command(df)
# 获取命令结果
result = stdout.read()
  
# 关闭连接
ssh.close()
技术分享
import paramiko

transport = paramiko.Transport((hostname, 22))
transport.connect(username=wupeiqi, password=123)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command(df)
print stdout.read()

transport.close()
SSHClient 封装 Transport

基于公钥密钥连接:

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file(/home/auto/.ssh/id_rsa)
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname=c1.salt.com, port=22, username=weibinf, key=private_key)
 
# 执行命令
stdin, stdout, stderr = ssh.exec_command(df)
# 获取命令结果
result = stdout.read()
 
# 关闭连接
ssh.close()
技术分享
import paramiko

private_key = paramiko.RSAKey.from_private_key_file(/home/auto/.ssh/id_rsa)

transport = paramiko.Transport((hostname, 22))
transport.connect(username=weibinf, pkey=private_key)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command(df)

transport.close()
SSHClient 封装 Transport

SFTPClient

用于连接远程服务器并执行上传下载

基于用户名密码上传下载

import paramiko
 
transport = paramiko.Transport((hostname,22))
transport.connect(username=weibinf,password=123)
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put(/tmp/location.py, /tmp/test.py)
# 将remove_path 下载到本地 local_path
sftp.get(remove_path, local_path)
 
transport.close()

基于公钥密钥上传下载

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file(/home/auto/.ssh/id_rsa)
 
transport = paramiko.Transport((hostname, 22))
transport.connect(username=weibinf, pkey=private_key )
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put(/tmp/location.py, /tmp/test.py)
# 将remove_path 下载到本地 local_path
sftp.get(remove_path, local_path)
 
transport.close()

堡垒机的实现 

实现思路:

技术分享

堡垒机执行流程:

  1. 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
  2. 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
  3. 用户选择服务器,并自动登陆
  4. 执行操作并同时将用户操作记录

注:配置.brashrc实现ssh登陆后自动执行脚本,如:/usr/bin/python /home/wupeiqi/menu.py

实现过程

步骤一,实现用户登陆

import getpass
 
user = raw_input(username:)
pwd = getpass.getpass(password)
if user == weibinf and pwd == 123:
    print 登陆成功
else:
    print 登陆失败

步骤二,根据用户获取相关服务器列表

dic = {
    weibinf: [
        172.16.103.189,
        c10.puppet.com,
        c11.puppet.com,
    ],
    xs: [
        c100.puppet.com,
    ]
}
 
host_list = dic[weibinf]
 
print please select:
for index, item in enumerate(host_list, 1):
    print index, item
 
inp = raw_input(your select (No):)
inp = int(inp)
hostname = host_list[inp-1]
port = 22

步骤三,根据用户名、私钥登陆服务器

tran = paramiko.Transport((hostname, port,))
tran.start_client()
default_path = os.path.join(os.environ[HOME], .ssh, id_rsa)
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey(wupeiqi, key)
 
# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()
 
#########
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
#########
 
chan.close()
tran.close()
技术分享
while True:
    # 监视用户输入和服务器返回数据
    # sys.stdin 处理用户输入
    # chan 是之前创建的通道,用于接收服务器返回信息
    readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)
    if chan in readable:
        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 readable:
        inp = sys.stdin.readline()
        chan.sendall(inp)
Linux连接方式一
技术分享
# 获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
try:
    # 为tty设置新属性
    # 默认当前tty设备属性:
    #   输入一行回车,执行
    #   CTRL+C 进程退出,遇到特殊字符,特殊处理。

    # 这是为原始模式,不认识所有特殊符号
    # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
    tty.setraw(sys.stdin.fileno())
    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)
Linux连接方式二
技术分享
def windows_shell(chan):
    import threading

    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)
            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,))
    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

肆意妄为方式三
Windows连接方式

注:密码验证 t.auth_password(username, pw)

详见:paramiko源码demo

 

数据库操作

Python 操作 Mysql 模块的安装

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

SQL基本使用

1、数据库操作

show databases;
use [databasename];
create database  [name];

2、数据表操作

show tables;
 
create table students
    (
        id int  not null auto_increment primary key,
        name char(8) not null,
        sex char(4) not null,
        age tinyint unsigned not null,
        tel char(13) null default "-"
    );
技术分享
CREATE TABLE `wb_blog` ( 
    `id` smallint(8) unsigned NOT NULL, 
    `catid` smallint(5) unsigned NOT NULL DEFAULT 0, 
    `title` varchar(80) NOT NULL DEFAULT ‘‘, 
    `content` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `catename` (`catid`) 
) ;
数据库插入表

3、数据操作

insert into students(name,sex,age,tel) values(alex,man,18,151515151)
 
delete from students where id =2;
 
update students set name = sb where id =1;
 
select * from students

4、其他

主键
外键
左右连接

Python MySQL API

一、插入数据

import MySQLdb
 
conn = MySQLdb.connect(host=127.0.0.1,user=root,passwd=1234,db=mydb)
 
cur = conn.cursor()
 
reCount = cur.execute(insert into UserInfo(Name,Address) values(%s,%s),(weibinf,usa))
 
conn.commit()
 
cur.close()
conn.close()
 
print reCount
技术分享
import MySQLdb

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

cur = conn.cursor()

li =[
     (weibinf,usa),
     (xs,usa),
]
reCount = cur.executemany(insert into UserInfo(Name,Address) values(%s,%s),li)

conn.commit()
cur.close()
conn.close()

print reCount

批量插入数据
批量插入数据

注意:cur.lastrowid

二、删除数据

import MySQLdb
 
conn = MySQLdb.connect(host=127.0.0.1,user=root,passwd=1234,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=1234,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=1234,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=1234,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

Python之paramiko模块和SQL连接API

标签:

原文地址:http://www.cnblogs.com/fanweibin/p/5121305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!