Python 之paramiko 模块
一. 简介 |
paramiko 是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClient,即一个远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作
二. 使用 |
1. 下载安装
1 #安装pip 2 wget --no-check-certificate https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz 3 tar -xf pip-9.0.1.tar.gz 4 cd pip-9.0.1 5 python setup.py build 6 python setup.py install 7 # pycrypto 由于paramiko 模块内部依赖pycrypto, 所以先下载安装pycrypto 8 pip3 install pycryto 9 pip3 install paramiko
SSHClient:
远程链接分为两种:(1)基于用户名密码连接 (2)基于公钥密钥连接 通过是用paramiko远程操作 其实本质也分两种
(1) 只用SSHClient (2) 自己创建一个transport
基于用户名和密码连接 |
1 #-*- coding:utf-8 -*- 2 import paramiko 3 #创建SSH对象 4 ssh = paramiko.SSHClient() 5 #允许连接不在know_hosts文件中的主机 //连接主机的IP地址不在know_hosts文件中是拒绝连接的。以linux为例know_hosts 文件在 当前用户家目录.ssh目录中 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 #连接服务器 8 ssh.connect(hostname="IP",username="public",port=60022,password="1234qwer!@#$") 9 # 标准输入,标准输出,错误输出。 只用标准输出和错误输出有结果 10 stdin,stdout,stderr = ssh.exec_command("df") #执行命令 11 #获取命令执行结果 12 result = stdout.read() 13 #打印执行结果到终端上, 因为传输的是bytes类型 需要坐下格式转换 14 print(result.decode()) #另外一种写法 print(str(result,"utf-8")) linux平台默认 utf-8 转换成的bytes类型 15 #关闭SSH连接 16 ssh.close()
SSHClient 封装Transport |
1 #-*- coding:utf-8 -*- 2 import paramiko 3 transport = paramiko.Transport(("222.73.236.179",60022)) 4 transport.connect(username="public",password="1234qwer!@#$") 5 ssh = paramiko.SSHClient() 6 ssh._transport = transport 7 stdin,stdout,stderr = ssh.exec_command("ls") 8 result = stdout.read() 9 print(result.decode())
SShClient 基于密钥连接 |
1 import os,paramiko 2 default_key = os.path.join(os.environ['HOME'],".ssh","id_rsa") #获取当前用户的私钥 3 private_key = paramiko.RSAKey.from_private_key_file(default_key) 4 # 创建SSH对象 5 ssh = paramiko.SSHClient() 6 # 允许连接不在know_hosts文件中的主机 7 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 8 # 连接服务器 9 ssh.connect(hostname='IP', port=60022, username='public', pkey=private_key) 10 # 执行命令 11 stdin, stdout, stderr = ssh.exec_command('df') 12 # 获取命令结果 13 result = stdout.read() 14 # 关闭连接 15 ssh.close()
SFTPClient 用于连接远程服务器并进行上传下载功能 |
(1)基于用户名密码上传下载
1 #(1)基于用户名密码上传下载) 2 import paramiko 3 2 transport = paramiko.Transport(("IP",60022)) 4 3 transport.connect(username="public",password="1234qwer!@#$") 5 4 SFTP=paramiko.SFTPClient.from_transport(transport) 6 5 SFTP.get("/home/public/copy.py","E:\ISO\copy2.py") 7 #将/home/public/copy.py 下载到本地 E:\ISO\ 并重复名copy2.py 8 6 SFTP.put("E:\ISO\copy2.py","/home/public/copy2.py") 9 #将本地 E:\ISO\copy2.py 上传到服务器端/home/public/copy2.py 10 7 transport.close() 11 12 #(2)基于密钥上传下载 13 default_key = os.path.join(os.environ['HOME'],".ssh","id_rsa") 14 private_key = paramiko.RSAKey.from_private_key_file(default_key) 15 transport = paramiko.Transport(("222.73.236.179",60022)) 16 transport.connect(username="public",pkey=private_key) 17 SFTP=paramiko.SFTPClient.from_transport(transport) 18 SFTP.get("/home/public/copy.py","E:\ISO\copy2.py") 19 SFTP.put("E:\ISO\copy2.py","/home/public/copy2.py") 20 transport.close()
Demo: 实现远程命令执行和文件上传
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import paramiko 4 5 class SSHConnection(object): 6 7 def __init__(self, host='192.168.12.68', port=22, username='locojoy',pwd='123321QQ!'): 8 self.host = host 9 self.port = port 10 self.username = username 11 self.pwd = pwd 12 self.__k = None 13 14 def run(self): 15 self.connect() # 连接远程服务器 16 self.upload('db.py','/tmp/1.py') # 将本地的db.py文件上传到远端服务器的/tmp/目录下并改名为1.py 17 self.cmd('df') # 执行df 命令 18 self.close() # 关闭连接 19 20 def connect(self): 21 transport = paramiko.Transport((self.host, self.port)) 22 transport.connect(username=self.username, password=self.pwd) 23 self.__transport = transport 24 25 def close(self): 26 self.__transport.close() 27 28 def upload(self,local_path,target_path): 29 sftp = paramiko.SFTPClient.from_transport(self.__transport) 30 sftp.put(local_path,target_path) 31 32 def cmd(self, command): 33 ssh = paramiko.SSHClient() 34 ssh._transport = self.__transport 35 # 执行命令 36 stdin, stdout, stderr = ssh.exec_command(command) 37 # 获取命令结果 38 result = stdout.read() 39 print(result) 40 return result 41 42 obj = SSHConnection() 43 obj.run()