paramiko模块

假装没事ソ 提交于 2019-11-28 23:12:58

paramiko模块功能

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

SSHClient类

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

有两种连接方式,一种是基于用户名密码的连接,另一种是基于公钥密钥的连接,两种方式都能封装transport的功能进行连接。

1、基于用户名密码连接

1.1、普通连接方式

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='192.168.136.8', port=22, username='root', password='123456')
 
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果
result = stdout.read()
print result
# 关闭连接
ssh.close()

SSHClient()自己创建t=transport对象,然后用t.connect连接等等操作。

1.2、手动封装Transport功能:

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', password='123456')
 
ssh = paramiko.SSHClient()
ssh._transport = transport  # SSHClient 封装 Transport
 
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()
 
transport.close()

手动创建transport对象。

为什么要采用这种方式?因为后面的sftpclient只能用transport方式,为了避免代码重复,都用一种方式。

2、基于公钥密钥连接:

2.1、普通连接方式

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='root', key=private_key)
  
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
  
# 关闭连接
ssh.close()

2.2、手动封装Transport功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', pkey=private_key)
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command('df')
 
transport.close()
 
SSHClient 封装 Transport

SFTPClient类

用于连接远程服务器并执行上传下载文件,只能用transport封装的模式执行。

1、基于用户名密码连接

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko
  
transport = paramiko.Transport(('hostname',22))
transport.connect(username='root',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('remote_path', 'local_path')
  
transport.close()

2、基于公钥密钥连接:

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='root', 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('remote_path', 'local_path')
  
transport.close()

模拟haproxy更改配置文件

实现思路:

1、本地生成文件 uuid.ha

2、上传文件至服务器 uuid.ha

3、ha.cfg    -->    ha.cfg.bak

4、uuid.ha  -->    ha.cfg

5、 reload

传文件用paramiko模块的SFTPClient,命令操作()用paramiko模块的SSHClient,为了避免重复连接,所以都用Transport方式连接。

代码:

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
45
import paramiko
import uuid
#两个方法都用一个连接,减少连接开销
 
class Haproxy(object):
    def __init__(self):
        self.host='192.168.136.8'
        self.port=22
        self.username='root'
        self.pwd='123456'
    def create_file(self):
        file_name=str(uuid.uuid4())
        #uuid('9fb01137-e13d-4ea8-b16e-d7861c2b8d9a')==>'9fb01137-e13d-4ea8-b16e-d7861c2b8d9a'
        with open(file_name,'wb')as f:
            f.write('test')
        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)
        sftp.put(file_name,'/tmp/ttt.py')
 
    def rename(self):
        ssh = paramiko.SSHClient()
        ssh._transport=self.__transport
        stdin,stdout,stderro=ssh.exec_command('mv /tmp/ttt.py /tmp/nnn.py')
        result=stdout.read()
        print result
 
obj=Haproxy()
obj.run()





















标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!