1、下载安装 pycrypto-2.6.1.tar.gz  (apt-get install python-dev)

    解压,进入,python setup.py build【编译】,python setup.py install 【安装】  ----》import Crypto

  2、下载安装 paramiko-1.10.1.tar.gz  

    解压,进入,python setup.py build【编译】,python setup.py install 【安装】---》  import paramiko

1、连接远程服务器,并执行操作
用户名和密码连接1

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.50.30', 22, 'root', '123456')
stdin, stdout, stderr = ssh.exec_command('ifconfig')
print stdout.read()
ssh.close();
用户名和密码连接2  (SSHClient 封装 Transport)推荐
transport = paramiko.Transport(('10.10.50.30', 22))
transport.connect(username='root', password='jichuang')
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('ifconfig')
print stdout.read()
transport.close()

公钥私钥链接
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub "-p 22 root@10.10.50.30"

import paramiko
private_key_path = '/root/.ssh/id_rsa' #本机私钥存放位置
key = paramiko.RSAKey.from_private_key_file(private_key_path)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.50.31 ', 22, 'root' ,pkey=key)
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()
ssh.close();

  

公钥私钥链接2 (SSHClient 封装 Transport)推荐

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
transport = paramiko.Transport(('10.10.50.30', 22))
transport.connect(username='root', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df')
transport.close()

  

2、SFTP上传下载
基于用户名和密码
import os,sys
import paramiko
t = paramiko.Transport(('10.10.50.30',22))
t.connect(username='yangmv',password='123456')
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('C:\Users\yangmingwei\Desktop\error.jpg','/home/yangmv/error.jpg')
#将error.jpg上传到服务器/home/yangmv目录
sftp.get('/home/yangmv/sftp.txt','C:\Users\yangmingwei\Desktop\sftp.txt')
#将sftp.txt下载到本机桌面
t.close()

  

基于公钥秘钥上传下载
import paramiko

private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')

transport = paramiko.Transport(('hostname', 22))
transport.connect(username='yangmv', 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('remove_path', 'local_path') transport.close()

  

 
 
Paramiko 批量执行命令
版本一:

缺点: 每次执行一个操作,就要进行一次连接

import paramiko
import uuid
class Comm(object):
def __init__(self): #初始化参数
self.host = '10.10.50.30'
self.port = 22
self.username = 'root'
self.pwd = '123456'
self.file_name = '' def create_file(self): #本地创建文件
file_name = str(uuid.uuid4()) #uuid创建一个不会重复的随机字符串作为文件名
with open(file_name,'w') as f_obj:
f_obj.write('sb')
return file_name #返回文件名
def run(self):
self.upload() #执行上传
self.rename() #执行重命名 def upload(self): #用于上传
self.file_name = self.create_file()
t = paramiko.Transport((self.host,self.port))
t.connect(username=self.username,password=self.pwd)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(self.file_name,'/home/yangmv/%s'%self.file_name)
t.close()
def rename(self): #用于重命名
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(self.host, self.port, self.username, self.pwd)
stdin, stdout, stderr = ssh.exec_command('mv /home/yangmv/%s /home/yangmv/xxxx.txt'%(self.file_name))
print stdout.read()
ssh.close();
startcmd = Comm()
startcmd.run()

  

版本二:(推荐)
优点:不管执行多少个操作,都只连接一次
import paramiko
import uuid
class Comm(object):
def __init__(self): #初始化参数
self.host = '10.10.50.30'
self.port = 22
self.username = 'root'
self.pwd = '123456' def create_file(self): #本地创建文件
file_name = str(uuid.uuid4()) #uuid创建一个不会重复的随机字符串作为文件名
with open(file_name,'w') as f_obj:
f_obj.write('sb2')
return file_name #返回文件名
def run(self):
self.connect()
self.upload() #执行上传
self.rename() #执行重命名
self.close() def connect(self): #用于ssh连接
t = paramiko.Transport((self.host,self.port))
t.connect(username=self.username,password=self.pwd)
self.__transport = t
def close(self): #用于ssh关闭
self.__transport.close()
def upload(self): #用于上传
self.file_name = self.create_file()
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(self.file_name,'/home/yangmv/%s'%self.file_name)
def rename(self): #用于重命名
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
stdin, stdout, stderr = ssh.exec_command('mv /home/yangmv/%s /home/yangmv/ssss.txt'%self.file_name)
result = stdout.read()
startcmd = Comm()
startcmd.run()

  

 
Paramiko持续连接服务器1 select
import paramiko
import select #无法在windows下操作
import sys
t = paramiko.Transport(('10.10.50.31', 22))
t.start_client()
#基于公钥验证
##default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
#key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
#t.auth_publickey('root',key)
#基于用户密码验证
t.auth_password('root', '123456') #打开一个通道
chan = t.open_session()
#获取一个终端
chan.get_pty()
#激活器
chan.invoke_shell() #########
# 利用sys.stdin,肆意妄为执行操作
# 用户在终端输入内容,并将内容发送至远程服务器
# 远程服务器执行命令,并将结果返回
# 用户终端显示内容
while True:
# 监视用户输入和服务器返回数据
# sys.stdin 处理用户输入
# chan 是之前创建的通道,用于接收服务器返回信息
r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
if chan in r_list: #接收命令执行后返回的结果
try:
x = chan.recv(1024)
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r_list: #用户输入
inp = sys.stdin.readline()
chan.sendall(inp) #把用户输入命令发送执行
#########
chan.close()
t.close()

  

成功登陆机器,并可以持续连接,不断输入命令,并到达返回结果

 
Paramiko持续连接服务器2 改进
1的缺点:

    输入端,以行为单位,敲回车后才执行命令     ( ls + 回车 → 发送远端)
    无法使用tab补全
2的改进:
    改变默认终端,由 行stdin, 一个字符stdin    ( l  → 发送远端,s → 发送远端  ) 
    每输入一次,向远端发送一次 
    无法使用tab补全
import paramiko
import select #无法在windows下操作
import sys
import termios
import tty t = paramiko.Transport(('10.10.50.31', 22))
t.start_client()
#基于公钥验证
##default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
#key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
#t.auth_publickey('root',key)
#基于用户密码验证
t.auth_password('root', '123456') #打开一个通道
chan = t.open_session()
#获取一个终端
chan.get_pty()
#激活器
chan.invoke_shell() #########
#获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
try:
# 为tty设置新属性
# 默认当前tty设备属性:
# 输入一行回车,执行
# CTRL+C 进程退出,遇到特殊字符,特殊处理。
# 这是为原始模式,不认识所有特殊符号
# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
tty.setraw(sys.stdin.fileno())
chan.settimeout(0.0)
while True:
#监视用户输入和远程服务器的返回数据socket
#阻塞,直到句柄可用
r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
if chan in r_list:
try:
x = chan.recv(1024)
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r_list:
inp = sys.stdin.read(1) #每次读1个字符
if len(inp) == 0:
break
chan.sendall(inp)
finally:
#退出后恢复终端属性
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty) #########
chan.close()
t.close()

  


 
Paramiko持续连接服务器3  记录操作日志
import paramiko
import select #无法在windows下操作
import sys
import termios
import tty t = paramiko.Transport(('10.10.50.31', 22))
t.start_client()
t.auth_password('root', '123456') chan = t.open_session()
chan.get_pty()
chan.invoke_shell() #########
oldtty = termios.tcgetattr(sys.stdin)
try:
tty.setraw(sys.stdin.fileno())
chan.settimeout(0.0)
f = open('record.log','a')
records = []
while True:
r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
if chan in r_list:
try:
x = chan.recv(1024)
if len(x) == 0:
print '\r\n*** EOF\r\n',
f.close() #异常中断,或者exit退出时保存
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r_list:
inp = sys.stdin.read(1)
records.append(inp) #把个字符键入列表暂时保存 ['l','s']
if len(inp) == 0:
break
if inp == '\t': #tab键不记录
pass
if inp == '\r': #每次回车
cmd = ''.join(records).replace('\r','\n') #[ls]+换行
f.write(cmd)
records = [] #每次记录一个条命令
chan.sendall(inp)
finally:
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)
#########
chan.close()
t.close()

  

成功记录

 
Paramiko持续连接服务器4 适用windows
import paramiko
import sys
import threading t = paramiko.Transport(('10.10.50.31', 22))
t.start_client()
t.auth_password('root', '123456') chan = t.open_session()
chan.get_pty()
chan.invoke_shell() #########
sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n")
def writeall(sock):
while True:
data = sock.recv(256)
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,))
writer.start() try:
while True:
d = sys.stdin.read(1)
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass
#########
chan.close()
t.close()

  

 
 
 
 

Paramiko使用的更多相关文章

  1. paramiko 的使用

    paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于远程连接机器执行基本命令,也可以执行shell脚本 基于用户名密码连接: def ssh_connect ...

  2. python+paramiko库+svn写的自动化部署脚本

    第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...

  3. 离线安装 Python 2.7, paramiko 和 tornado

    无非就是离线安装, 步骤比较繁琐, 记录一下. 需求很简单, 一个离线安装的 Python, 能跑 tornado 和 paramiko 1. 离线安装 Python 2.7 .tgz cd Pyth ...

  4. CentOS 安装Paramiko模块

    转自:http://www.cnblogs.com/hyli/p/3910585.html 1.下载安装包: https://pypi.python.org/packages/source/p/par ...

  5. paramiko模块的安装

    1.找到自己python安装的目录(默认路径:C:\Users\zhangliyuan\AppData\Local\Programs\Python\Python35) 注:cmd中所有命令 2.进入S ...

  6. 使用paramiko如何连接服务器?

    本文和大家分享的是python开发中使用paramiko连接服务器的方法和步骤,希望通过本文的,对大家学习和使用paramiko有所帮助. ssh连接步骤 1.ssh server建立server p ...

  7. python paramiko 进行文件上传处理

    #!/usr/bin/env python # -*- coding:utf-8 -*- import paramiko import uuid class Ha(object): def __ini ...

  8. python远程连接paramiko 模块和堡垒机实现

    paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...

  9. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  10. python之实现基于paramiko和mysql数据库的堡垒机

    一.堡垒机结构 堡垒机执行流程: 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码) 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表 用户选择服务器,并自动登陆 ...

随机推荐

  1. <问吧>调查问卷心得体会

    <问吧>调查问卷心得与体会 在这之前,我们已经组成了一个六个人的小团队---“走廊奔跑队”,我们这次做的这个项目的名称是:问吧.在项目实施之前,我们必做的一步就是需求分析,目的就是充分了解 ...

  2. 小程序解密 encryptedData 获取 unionID 等信息

    index.php <?php include_once "wxBizDataCrypt.php"; // $appid 由小程序微信官方后台获取 $appid = 'wx4 ...

  3. python接口自动化测试框架实现之字符串插入变量(字符串参数化)

    问题: 在做接口自动化测试的时候,请求报文是json串,但是根据项目规则必须转换成字符串,然后在开头拼接“data=” 接口中很多入参值需要进行参数化. 解决方案: 1.Python并没有对在字符串中 ...

  4. Struts2拦截器配置和使用

    拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 说到拦截器interceptor,就会想到过滤器filter: 过滤器f ...

  5. 第155天:canvas(二)

    一.添加样式和颜色 ​ 在前面的绘制矩形章节中,只用到了默认的线条和颜色. ​ 如果想要给图形上色,有两个重要的属性可以做到. fillStyle = color 设置图形的填充颜色 strokeSt ...

  6. 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包

    题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...

  7. P2812 校园网络【[USACO]Network of Schools加强版】

    题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...

  8. debug - vue中通过ajax获取数据时,如何避免绑定的数据中出现property of undefined错误

    因为获取服务器是异步的,所以 vue 先绑定数据. 如果 ??? 是通过 ajax 异步获取的,在获取之前,???是未定义的.此时在外面的标签上添加一个 v-if="???" 可以 ...

  9. UVA - 11997(巧妙的优先队列)

    题意: 有k个整数数组,各包含k个元素,在每个数组中取一个元素加起来,可以得到kk个和,求这些和中最小的k个值 解析: 从简单的情况开始分析:经典方法,对原题没有思路,那么分析问题的简化版 这是对于两 ...

  10. 【Django实例】博客1

    (上一篇) 一.概述 Blog是一个博客应用. dbe工程的目录结构,参考<序言>的最后部分.blog应用位于/home/russellluo/Django/dbe/dbe/blog目录下 ...