A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作
SSHClient
用于连接远程服务器并执行基本命令
基于用户名密码连接:
[size=1em]
[color=blue !important]+ View Code



SSHClient 封装 Transport
基于公钥密钥连接:
[size=1em]
[color=blue !important]+ View Code



SSHClient 封装 Transport
基于私钥字符串进行连接
SFTPClient
用于连接远程服务器并执行上传下载
基于用户名密码上传下载
[size=1em]
[color=blue !important]+ View Code



基于公钥密钥上传下载
[size=1em]
[color=blue !important]+ View Code



Demo
堡垒机的实现
实现思路:
堡垒机执行流程:
  • 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
  • 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
  • 用户选择服务器,并自动登陆
  • 执行操作并同时将用户操作记录
注:配置.brashrc实现ssh登陆后自动执行脚本,如:/usr/bin/python /home/wupeiqi/menu.py
实现过程
步骤一,实现用户登陆
[size=1em]
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 '登陆失败'



步骤二,根据用户获取相关服务器列表
[size=1em]
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



步骤三,根据用户名、私钥登陆服务器
[size=1em]
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()



肆意妄为方式一
肆意妄为方式二
肆意妄为方式三
注:密码验证 t.auth_password(username, pw)
详见:paramiko源码demo
数据库操作
Python 操作 Mysql 模块的安装
[size=1em]
1

2

3

4

5

linux:
    yum install MySQL-python

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



SQL基本使用
1、数据库操作
[size=1em]
1

2

3

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



2、数据表操作
[size=1em]
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 "-"
    );



View Code
3、数据操作
[size=1em]
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、其他
[size=1em]
1

2

3

主键
外键
左右连接



Python MySQL API
一、插入数据
[size=1em]
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



批量插入数据
注意:cur.lastrowid
二、删除数据
[size=1em]
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



三、修改数据
[size=1em]
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



四、查数据
[size=1em]
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]




2 个回复

倒序浏览
奈斯
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马