paramiko的概念

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。

有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

 paramiko的介绍

paramiko包含两个核心组件:SSHClient和SFTPClient。

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
  • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

paramiko的几个基本名称

1、Channel:是一种类Socket,一种安全的SSH传输通道;
2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

paramiko的基本使用

 远程连接服务器有两种方法:SSHClient、tranceport

基于用户名密码连接:

 1 import paramiko
 2 # 创建SSH对象
 3 ssh = paramiko.SSHClient()
 4 # 允许连接不在know_hosts文件中的主机
 5 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 6 # 连接服务器
 7 ssh.connect(hostname='连接主机的IP地址', port=22, username='root', password='111111')
 8 # 执行命令
 9 stdin, stdout, stderr = ssh.exec_command('pwd')
10 # 获取命令结果
11 result = stdout.read()
12 print(result)
13 # 关闭连接
14 ssh.close()

SShClient封装transport,进行连接

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

基于公钥秘钥连接:

 1 import paramiko
 2 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 3 # 创建SSH对象
 4 ssh = paramiko.SSHClient()
 5 # 允许连接不在know_hosts文件中的主机
 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 7 # 连接服务器
 8 ssh.connect(hostname='192.168.247.131', port=22, username='root', key=private_key)
 9 # 执行命令
10 stdin, stdout, stderr = ssh.exec_command('df')
11 # 获取命令结果
12 result = stdout.read()
13 
14 
15 
16 # 关闭连接
17 
18 ssh.close()

transport封装连接

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

SFTPClient

实现文件下载的方法:Tranceport

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

 1 import paramiko
 2 
 3  
 4 
 5 transport = paramiko.Transport(('hostname',22))
 6 
 7 transport.connect(username='wupeiqi',password='123')
 8 
 9  
10 
11 sftp = paramiko.SFTPClient.from_transport(transport)
12 
13 # 将location.py 上传至服务器 /tmp/test.py
14 
15 sftp.put('/tmp/location.py', '/tmp/test.py')
16 
17 # 将remove_path 下载到本地 local_path
18 
19 sftp.get('remove_path', 'local_path')
20 
21  
22 
23 transport.close()

基于公钥秘钥上传下载

 1 import paramiko
 2 
 3  
 4 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 5 
 6 
 7 transport = paramiko.Transport(('hostname', 22))
 8 
 9 transport.connect(username='wupeiqi', pkey=private_key )
10 
11  
12 
13 sftp = paramiko.SFTPClient.from_transport(transport)
14 
15 # 将location.py 上传至服务器 /tmp/test.py
16 
17 sftp.put('/tmp/location.py', '/tmp/test.py')
18 
19 # 将remove_path 下载到本地 local_path
20 
21 sftp.get('remove_path', 'local_path')
22 
23  
24 
25 transport.close()

 结合起来使用

 1 #能够返回命令结果
 2 #上传文件
 3 import paramiko
 4 
 5 class FtpClient():
 6     def __init__(self,host,port,username,password):
 7         self.host=host
 8         self.port=port
 9         self.username=username
10         self.password=password
11     def start(self):
12         self.connection()
13     def connection(self):
14         client = paramiko.Transport((self.host, self.port))
15         client.connect(username=self.username,password=self.password)
16         self._transport=client
17     def command(self,command):
18         ssh = paramiko.SSHClient()
19         ssh._transport=self._transport
20         stdin,stdout,stderr=ssh.exec_command(command)
21         return stdout.read()
22 
23     def update(self,start_file,up_file):
24         Sftp=paramiko.SFTPClient.from_transport(self._transport)
25         Sftp.put(start_file,up_file)
26         
27     def client_close(self):
28         self._transport.close()
29 start_client = FtpClient('192.168.15.131',22,'root','root')
30 start_client.start()
31 data=start_client.command('ls')
32 print(data)
33 print("yes")
34 start_client.update('hua','/home/pp')
35 print("ok")
36 start_client.client_close()

 

posted on 2020-03-19 16:48  学习永远没有尽头  阅读(443)  评论(0)    收藏  举报