paramiko模块

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



















来自为知笔记(Wiz)


你可能感兴趣的:(paramiko模块)