MySQLdb操作数据库

堡垒机前戏

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

SSHClient

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

基于用户名密码连接:

+ ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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=‘wupeiqi‘, 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

基于公钥密钥连接:

+ ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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=‘wupeiqi‘, 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=‘wupeiqi‘, pkey=private_key)

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

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

transport.close()

SSHClient 封装 Transport

import paramiko
from io import StringIO

key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8
NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans
H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e
7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC
tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP
c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A
ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+
c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh
IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8
S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz
zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6
01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC
OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl
HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq
UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65
lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA
539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM
WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH
C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8
RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg
9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/
pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj
98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw
DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI
+MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0=
-----END RSA PRIVATE KEY-----"""

private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
transport = paramiko.Transport((‘10.0.1.40‘, 22))
transport.connect(username=‘wupeiqi‘, pkey=private_key)

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

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

transport.close()

print(result)

基于私钥字符串进行连接

SFTPClient

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

基于用户名密码上传下载

+ ?


1

2

3

4

5

6

7

8

9

10

11

12

import paramiko

transport = paramiko.Transport((‘hostname‘,22))

transport.connect(username=‘wupeiqi‘,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()

基于公钥密钥上传下载

+ ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

import paramiko

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

transport = paramiko.Transport((‘hostname‘, 22))

transport.connect(username=‘wupeiqi‘, 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()

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuid

class Haproxy(object):

    def __init__(self):
        self.host = ‘172.16.103.191‘
        self.port = 22
        self.username = ‘wupeiqi‘
        self.pwd = ‘123‘
        self.__k = None

    def create_file(self):
        file_name = str(uuid.uuid4())
        with open(file_name,‘w‘) as f:
            f.write(‘sb‘)
        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)
        # 将location.py 上传至服务器 /tmp/test.py
        sftp.put(file_name, ‘/home/wupeiqi/tttttttttttt.py‘)

    def rename(self):

        ssh = paramiko.SSHClient()
        ssh._transport = self.__transport
        # 执行命令
        stdin, stdout, stderr = ssh.exec_command(‘mv /home/wupeiqi/tttttttttttt.py /home/wupeiqi/ooooooooo.py‘)
        # 获取命令结果
        result = stdout.read()

ha = Haproxy()
ha.run()

Demo

堡垒机的实现

实现思路:

堡垒机执行流程:

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

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

实现过程

步骤一,实现用户登陆

?


1

2

3

4

5

6

7

8

import getpass

user = raw_input(‘username:‘)

pwd = getpass.getpass(‘password‘)

if user == ‘alex‘ and pwd == ‘123‘:

    print ‘登陆成功‘

else:

    print ‘登陆失败‘

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

dic = {

    ‘alex‘: [

        ‘172.16.103.189‘,

        ‘c10.puppet.com‘,

        ‘c11.puppet.com‘,

    ],

    ‘eric‘: [

        ‘c100.puppet.com‘,

    ]

}

host_list = dic[‘alex‘]

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

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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)

肆意妄为方式一

# 获取原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)

肆意妄为方式二

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

肆意妄为方式三

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

详见:paramiko源码demo

数据库操作

Python 操作 Mysql 模块的安装

?


1

2

3

4

5

linux:

    yum install MySQL-python

window:

    http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip

SQL基本使用

1、数据库操作

?


1

2

3

show databases;

use [databasename];

create database  [name];

2、数据表操作

?


1

2

3

4

5

6

7

8

9

10

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、数据操作

?


1

2

3

4

5

6

7

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、其他

?


1

2

3

主键

外键

左右连接

Python MySQL API

一、插入数据

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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)‘,(‘alex‘,‘usa‘))

# reCount = cur.execute(‘insert into UserInfo(Name,Address) values(%(id)s, %(name)s)‘,{‘id‘:12345,‘name‘:‘wupeiqi‘})

 

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 =[
     (‘alex‘,‘usa‘),
     (‘sb‘,‘usa‘),
]
reCount = cur.executemany(‘insert into UserInfo(Name,Address) values(%s,%s)‘,li)

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

print reCount

批量插入数据

注意:cur.lastrowid

二、删除数据

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

三、修改数据

?


1

2

3

4

5

6

7

8

9

10

11

12

13

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

四、查数据

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

# ############################## 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]

原文地址:https://www.cnblogs.com/AbnerLc/p/11660831.html

时间: 2024-10-07 15:08:23

MySQLdb操作数据库的相关文章

用MySQLdb操作数据库流程示例:

下面的内容直接复制粘贴放到sublime中,保存为******.py文件,然后在python环境下运行即可: '''MySQLdb本身就是python操作mysql数据库的一个插件,python通过MySQLdb实现对数据库的增删改查'''import MySQLdb class MysqlSearch(object): def __init__(self): self.get_conn() '''获取连接''' def get_conn(self): try: self.conn = MySQ

Python之MySQLdb操作数据库

一.python操作数据库 1.格式:大概分为三部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 代码 import MySQLdb conn = MySQLdb.connect(host='192.168.0.180',user='cattle',passwd='cattle',db='cattle') cur = conn.cursor()  #创建连接 reCount = cur.execute('select * from admin') data

MySQLdb操作数据库(三)

删除数据删除单条数据 #conding=utf-8 import MySQLdb import random try: conn = MySQLdb.connect( host = '127.0.0.1', user = 'root', passwd = "123456", port = 3306) conn.select_db('python')# 选择pythonDB数据库 cur = conn.cursor()# 获取游标 cur.execute("delete fro

MySQLdb操作数据库(二)

查询数据 使用execute()函数执行查询sql语句后,得到的只是受影响的行数,并不能真正拿到我们查询的内容.没关系,这里游标cursor中还提供了三种提取数据的方法:fetchone.fetchmany.fetchall,每个方法都会导致游标游动,所以必须注意游标的位置cursor. fetchone()获取游标所在处的一行数据,返回的是元组,没有则返回None,cursor. fetchmany(size=None)接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回

python 全栈 数据库 (三) python操作数据库

python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 install pymysql 第二种:IDE下pycharm python环境路径下添加模块 1.2使用操作 #导入模块 import pymysql #建立连接通道,建立连接填入(连接数据库的IP地址,端口号,用户名,密码,要操作的数据库,字符编码) conn = pymysql.connect

PDO面向对象操作数据库服务器

1.PDO是PHP新版中推荐的基于面向对象操作数据库服务器的方式. 开启PDO_mysql相关扩展:在php.ini中修改extension=php_pdo_mysql.dll 重启apache 2.PDO操作数据库的基本使用步骤 连接,认证,发送SQL,等待mysql服务器的执行结果,处理执行结果 3.pdo操作数据库的代码: <?php //实例化PDO对象 $dsn='mysql:host=localhost;port=3306;dbname=php34'; $username='root

Python操作数据库及hashlib模块

一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib #导入模块 ######## md5 ########### m = hashlib.md5() #创建一个对象 m.update(b"hhf") #加密字符串 b代表byte,是把字符串转换成byte类型,也可以用bytes()强制转换

pymysql 操作数据库

一.简介 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本 其执行语句与sql源码相似 二.使用 1.安装 pip install pymysql 2.使用操作 先来一例完整的连接加基本的操作 import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', d

python中cursor操作数据库(转)

原文出处:http://doudouclever.blog.163.com/blog/static/175112310201284115340663/ python 操作数据库,要安装一个Python和数据库交互的包MySQL-python-1.2.2.win32-py2.5.exe,然后我们就可以使用MySQLdb这个包进行数据库操作了.     操作步骤如下:    1.建立数据库连接     import MySQLdb     conn=MySQLdb.connect(host="loc