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

 

posted @ 2017-08-30 17:29  lichenxi  阅读(247)  评论(0编辑  收藏  举报