paramiko

一、安装

pip3 install paramiko

  

二、使用

1、SSHClient

用于连接远程服务器并执行基本命令

import paramiko

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123') # 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果
result = stdout.read() # 关闭连接
ssh.close()

 看代码:

1、ssh = paramiko.SSHClient()
def __init__(self):
"""
Create a new SSHClient.
"""
self._system_host_keys = HostKeys()
self._host_keys = HostKeys()
self._host_keys_filename = None
self._log_channel = None
self._policy = RejectPolicy()
self._transport = None
self._agent = None

2、ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')

326    t = self._transport = Transport(sock, gss_kex=gss_kex, gss_deleg_creds=gss_deleg_creds)

#其实SSHClient内部就是定义了transport来链接的

import paramiko

#创建transport指定主机地址和端口
transport = paramiko.Transport(('hostname', 22)) #使用transport连接主机
transport.connect(username='wupeiqi', password='') #创建ssh
ssh = paramiko.SSHClient() #赋值transport
ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read() transport.close()

SSHClient 封装了 transport

使用公钥链接

import paramiko

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

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key) # 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read() # 关闭连接
ssh.close()
import paramiko

#定义秘钥位置
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') #创建transport
transport = paramiko.Transport(('hostname', 22)) #使用transport 指定用户名,指定秘钥
transport.connect(username='wupeiqi', pkey=private_key) #连接
ssh = paramiko.SSHClient() #使用将transport赋值
ssh._transport = transport #执行命令
stdin, stdout, stderr = ssh.exec_command('df') transport.close()

SSHClient 封装了 transport

  

2、SFTPClient

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

基于用户名密码上传下载:

import paramiko

#使用 transport 创建链接
transport = paramiko.Transport(('hostname',22))
transport.connect(username='wupeiqi',password='') #并且将transport倒入 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()
基于公钥密钥上传下载:

3、总结通过上面的ssh 和 sftp 可以看出来paramiko的链接都是使用的transport来实现的

根据上面的例子在一个连接中执行多条命令

import paramiko
import uuid class SSHConnection: def __init__(self, host='192.168.109.134', port=22, username='han',pwd=''):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.__k = None def connect(self):
transport = paramiko.Transport((self.host,self.port))
transport.connect(username=self.username,password=self.pwd)
self.__transport = transport                  #创建transport def close(self):
     #关闭连接
self.__transport.close() def upload(self,local_path, target_path):
# 连接,上传,local_path 本地文件,target_path目标地址
sftp = paramiko.SFTPClient.from_transport(self.__transport) sftp.put(local_path, target_path) def rename(self, old_path, new_path): ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
cmd = "mv %s %s" % (old_path, new_path,)
stdin, stdout, stderr = ssh.exec_command(cmd)
# 获取命令结果
result = stdout.read() def cmd(self, command):
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令结果
result = stdout.read()
return result connect = SSHConnection()
connect.connect()
before = connect.cmd('ls /home/han')
print(before.decode())
connect.upload('sshclient.py','/home/han/sshclient1.py')
after = connect.cmd('ls /home/han')
connect.close()
print(after.decode())
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuid class SSHConnection(object): def __init__(self, host='172.16.103.191', port=22, username='wupeiqi',pwd=''):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.__k = None def create_file(self):
file_name = str(uuid.uuid4())
with open(file_name,'w') as f:
f.write('sb')
return file_name def run(self):
self.connect()
self.upload('/home/wupeiqi/tttttttttttt.py')
self.rename('/home/wupeiqi/tttttttttttt.py', '/home/wupeiqi/ooooooooo.py)
self.close() def connect(self):
transport = paramiko.Transport((self.host,self.port))
transport.connect(username=self.username,password=self.pwd)
self.__transport = transport def close(self): self.__transport.close() def upload(self,target_path):
# 连接,上传
file_name = self.create_file() sftp = paramiko.SFTPClient.from_transport(self.__transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put(file_name, target_path) def rename(self, old_path, new_path): ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
cmd = "mv %s %s" % (old_path, new_path,)
stdin, stdout, stderr = ssh.exec_command(cmd)
# 获取命令结果
result = stdout.read() def cmd(self, command):
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令结果
result = stdout.read()
return result ha = SSHConnection()
ha.run()

版本2

3、利用终端实现xshell的效果

import paramiko
import sys
import os
import socket
import select
import getpass tran = paramiko.Transport(('192.168.109.134', 22,))
tran.start_client()
tran.auth_password('han', '') # 打开一个通道
chan = tran.open_session() # 获取一个终端
chan.get_pty() # 激活器这个终端
chan.invoke_shell() #########
在激活终端和关闭终端之间我们就可以利用终端的sys.stdin执行任意操作 利用sys.stdin,肆意妄为执行操作
用户在终端输入内容,并将内容发送至远程服务器
远程服务器执行命令,并将结果返回
用户终端显示内容
######### chan.close()
tran.close()

实现原理

import paramiko
import sys
import os
import socket
import select
import getpass
#from paramiko.py3compat import u 有人这么用,没看出有什么效果 tran = paramiko.Transport(('192.168.109.134', 22,))
tran.start_client()
tran.auth_password('han', '') # 打开一个通道
chan = tran.open_session() # 获取一个终端
chan.get_pty() # 激活器这个终端
chan.invoke_shell()
while True:
# 监视用户输入和服务器返回数据
# sys.stdin 处理用户输入
# chan 是之前创建的通道,用于接收服务器返回信息
readable, writeable, error = select.select([chan, sys.stdin,],[],[],1)
#[chan, sys.stdin, ]
#chan 就是 chan = tran.open_session() 这个session的通道,只要这里面有值就证明远程发回了命令
#sys.stdin 就是输入,只要有变化就发生变化
#终端可以设置成没点一个按键变化一次,或者每次点回车编译一次 if chan in readable:
try:
x = chan.recv(1024)
#x = u(chan.recv(1024)) 然后这里把u用上了
if len(x) == 0:
print('\r\n*** EOF\r\n')
break
sys.stdout.write(x.decode()) #往屏幕上写 sys.stdout.flush() #刷新,显示出来
except socket.timeout:
pass
if sys.stdin in readable:
inp = sys.stdin.readline() #读取数据的值
chan.sendall(inp) #利用chan将数据发送出去
chan.close()
tran.close()

肆意妄为 一,不支持tab

上面的方式是按一下回车发送以下,不支持tab不全,所以我们要把每次按键,按一次发送一次。

#!/usr/bin/env python3
# Created by han on 2016/8/4
import paramiko
import sys
import os
import socket
import select
import getpass import paramiko
import sys
import os
import socket
import select
import getpass
import termios
import tty
from paramiko.py3compat import u tran = paramiko.Transport(('192.168.109.134', 22,))
tran.start_client()
tran.auth_password('han', '') # 打开一个通道
chan = tran.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, w, e = select.select([chan, sys.stdin], [], [], 1)
if chan in r:
try:
x = u(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: #输入有变化
x = sys.stdin.read(1) #读取每一个按下的按钮
if len(x) == 0: #如果是空返回继续监听
break
chan.send(x) #不为空就发送 finally:
# 重新设置终端属性,回复到原来的状态
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) chan.close()
tran.close()

肆意妄为 二,支持tab补全

python_way day13 paramiko的更多相关文章

  1. python_way day13 sqlalchemy

    sqlalchemy 一对多 多对多 1.一对多 一.#创建表结构 class Host(Base): #所有的子类都继承这个基类 #创建表结构 __tablename__ = 'hosts' id ...

  2. SQLALchemy(连表)、paramiko

    本节内容:

  3. python运维开发(十三)----SQLalchemy和paramiko续

    内容目录: ORM架构SQLalchemy Paramiko SQLalchemy对表的操作 使用 ORM/Schema Type/SQL Expression Language/Engine/Con ...

  4. CentOS7 Python3上安装paramiko

    1. CentOS 7下安装Python3.5 CentOS7默认安装了python2.7.5,要用 Python3需要自己手动安装.注意不要删除python2. 1.1 下载python3源码包 w ...

  5. paramiko 的使用

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

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

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

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

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

  8. CentOS 安装Paramiko模块

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

  9. paramiko模块的安装

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

随机推荐

  1. php防盗链,php ci在control里面控制除了自己站内的链接点击跳转,其他来源的都跳到站内页面

    php防盗链,php ci在control里面控制除了自己站内的链接点击跳转,其他来源的都跳到站内页面 $route['jump/(:any)/(:any)'] = "index/jump/ ...

  2. JSP/Servlet 中的汉字编码问题

    JSP/Servlet 中的汉字编码问题 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区 ...

  3. WordPress博客系统搜索引擎优化seo全攻略方法

    WordPress的文章.评论等很多数据都是存放在数据库的,所以搭建wordpress网站的时间,网站的空间不需要多大,而数据库一定要充足,而在WordPress数据库中主要使用 wp_posts 表 ...

  4. Codeforces 735D:Taxes(哥德巴赫猜想)

    http://codeforces.com/problemset/problem/735/D 题意:给出一个n,这个n可以分解成 n = n1 + n2 + -- + nk,其中k可以取任意数.要使得 ...

  5. hdwiki中model模块的应用

    control中调用model原则是这样的,如果你的这个model在本control中大部分方法中都要用到,那么,就写在构造函数里面.例如,名字为doc的control的构造函数如下: functio ...

  6. java 面试每日一题4

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?  1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. publ ...

  7. [lua]lua简介

    在这篇文章中,我想向大家介绍如何进行Lua程序设计.我假设大家都学过至少一门编程语言,比如Basic或C,特别是C.因为Lua的最大用途是在宿主程序中作为脚本使用的. Lua 的语法比较简单,学习起来 ...

  8. ACM学习之路————一个大整数与一个小整数不得不说得的秘密

    这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...

  9. ado.net基础思想-abstract

    抽象类用做基类不能被实例化用途是派生出其他非抽象类 接口主要是实现多重继承 abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的:• 抽象类不能 ...

  10. 短信轰炸PC版

    前言 之前用过android版短信轰炸的apk,于是想反编apk查看源码找短信接口,做一个PC版本的,不料反编失败.后不了了之... 昨日逛论坛时无意中看到一个网站有此功能,打开一试究竟,效果可以,于 ...