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()
                    
                
                
            
        
浙公网安备 33010602011771号