我的Python之路-day11

一、paramiko模块

  该模块基于SSH用于连接远程服务器并执行相关操作

 SSHClient

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

   基于用户名密码连接: 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
#创建ssh对象
ssh = paramiko.SSHClient()
#允许连接不再know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
ssh.connect(hostname='192.168.2.62',port=22,username='root',password='redhat')
#执行命令
stdin,stdout,stderr = ssh.exec_command('df -Th ')
#获取命令结果
result = stdout.read()
#打印反馈回来的结果
print result
#关闭连接
ssh.close()

执行结果:

C:\Python27\python.exe "C:/Users/Administrator/PycharmProjects/Python S11/day11/para.py"
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda3     ext4     71G  4.8G   63G   8% /
tmpfs        tmpfs    495M     0  495M   0% /dev/shm
/dev/sda1     ext4    194M   25M  159M  14% /boot


Process finished with exit code 0

     SSHClient 封装 Transport

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

transport = paramiko.Transport(('192.168.2.62', 22))
transport.connect(username='root', password='redhat')

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

stdin, stdout, stderr = ssh.exec_command('ifconfig eht0')
print stdout.read()
transport.close()

执行结果:

C:\Python27\python.exe "C:/Users/Administrator/PycharmProjects/Python S11/day11/para.py"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:1D:61:FC  
          inet addr:192.168.2.62  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1d:61fc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9534 errors:0 dropped:0 overruns:0 frame:0
          TX packets:728 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:783649 (765.2 KiB)  TX bytes:64004 (62.5 KiB)



Process finished with exit code 0

   基于公钥密钥连接

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
keys = paramiko.RSAKey.from_private_key_file('/home/zhanglei/.ssh/id_rsa')
#创建ssh对象
ssh = paramiko.SSHClient()
#允许连接不再know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
ssh.connect(hostname='192.168.2.62',port=22,username='root',pkey = keys)
#执行命令
stdin,stdout,stderr = ssh.exec_command('df -Th ')
#获取命令结果
result = stdout.read()
#打印反馈回来的结果
print result
#关闭连接
ssh.close()

  

    SSHClient 基于公钥密钥封装 Transport

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
keys = paramiko.RSAKey.from_private_key_file('/home/zhanglei/.ssh/id_rsa')
transport = paramiko.Transport(('192.168.2.62', 22))
transport.connect(username
='zhanglei',pkey = keys)
ssh
= paramiko.SSHClient()
ssh._transport
= transport
stdin, stdout, stderr
= ssh.exec_command('ifconfig eht0')
print stdout.read() transport.close()

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

  基于用户名密码上传下载

import paramiko
 
transport = paramiko.Transport(('192.168.2.62',22))
transport.connect(username='root',password='redhat')
 
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/zhanglei/.ssh/id_rsa')
 
transport = paramiko.Transport(('192.168.2.62', 22))
transport.connect(username='zhanglei', 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()

 使用paramiko上传等操作文件demo

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

class Haproxy(object):

    def __init__(self):
        self.host = '192.168.2.62'
        self.port = 22
        self.username = 'zhanglei'
        self.pwd = 'zhanglei'
        self.__k = None

    def create_file(self):
        file_name = str(uuid.uuid4())
        with open(file_name,'w') as f:
            f.write('nb')
        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/zhanglei/t.py')

    def rename(self):

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


ha = Haproxy()
ha.run()

 二、堡垒机的初步实现

实现思路:(盗取武sir的图片)

  堡垒机执行流程:

  1、管理员为用户在服务器上创建帐号(将公钥放置在服务器,或者用户名和密码)

  2、用户登录堡垒机,输入堡垒机的用户名和密码,显示当前用户管理的服务器列表

  3、用户选择服务器,并自动登录

  4、执行操作,并记录用户的操作记录

  注:配置.brashrc实现ssh登陆后自动执行脚本,如:/home/zhanglei/menus.py

过程:
  用户登录实现:

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

  根据用户获取相关服务器列表:

dic = {
    'alex': [
        '1.1.1.1',
        '2.2.2.2',
        '3.3.3.3',
    ],
    'zhanglei': [
        '4.4.4.4',
    ]
}
 
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

根据用户名、私钥登陆服务器:

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('zhanglei', key)
 
# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()
 
#########
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
#########
 
chan.close()
tran.close()

三、数据库基本操作

SQL基本使用:

  1、数据库操作

    show databases; 显示数据库里面的数据库

    use databasename;使用数据库

    create databasename; 建立一个数据库

  2、数据表操作

    show tables;

    create table students
       (
            id int  not null auto_increment primary key,
            name char(8not null,
            sex char(4not null,
            age tinyint unsigned not null,
            tel char(13) null default "-"
       );
   3、数据操作
    增加数据:insert into students(name,sex,age,tel) values('alex','man',18,'123456789');
    删除数据:delete from students where id =2;
    更新数据:update students set name = 'sb' where id =1;
    查询数据:select * from students

四、python操作数据库

1、插入数据

 1 import MySQLdb
 2   
 3 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='redhat',db='mydb')
 4   
 5 cur = conn.cursor()
 6   
 7 reCount = cur.execute('insert into UserInfo(Name,Address) values(%s,%s)',('zhanglei','usa'))
 8 # reCount = cur.execute('insert into UserInfo(Name,Address) values(%(id)s, %(name)s)',{'id':12345,'name':'zhanglei'})
 9   
10 conn.commit()
11   
12 cur.close()
13 conn.close()
14   
15 print reCount

2、删除数据

import MySQLdb
 
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='redhat',db='mydb')
 
cur = conn.cursor()
 
reCount = cur.execute('delete from UserInfo')
 
conn.commit()
 
cur.close()
conn.close()
 
print reCount

3、修改数据

import MySQLdb
 
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='redhat',db='mydb')
 
cur = conn.cursor()
 
reCount = cur.execute('update UserInfo set Name = %s',('zhangsan',))
 
conn.commit()
cur.close()
conn.close()
 
print reCount

4、查询数据

 1 # ############################## fetchone/fetchmany(num)  ##############################
 2  
 3 import MySQLdb
 4  
 5 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='redhat',db='mydb')
 6 cur = conn.cursor()
 7  
 8 reCount = cur.execute('select * from UserInfo')
 9  
10 print cur.fetchone()
11 print cur.fetchone()
12 cur.scroll(-1,mode='relative')
13 print cur.fetchone()
14 print cur.fetchone()
15 cur.scroll(0,mode='absolute')
16 print cur.fetchone()
17 print cur.fetchone()
18  
19 cur.close()
20 conn.close()
21  
22 print reCount
23  
24  
25  
26 # ############################## fetchall  ##############################
27  
28 import MySQLdb
29  
30 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='redhat',db='mydb')
31 #cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
32 cur = conn.cursor()
33  
34 reCount = cur.execute('select Name,Address from UserInfo')
35  
36 nRet = cur.fetchall()
37  
38 cur.close()
39 conn.close()
40  
41 print reCount
42 print nRet
43 for i in nRet:
44     print i[0],i[1]

 

posted @ 2016-01-11 10:52  Mr_三石  阅读(61)  评论(0)    收藏  举报