python SSH模块 paramiko的学习和使用

paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令。
官方文档:http://docs.paramiko.org/

安装

使用pip安装即可,以下的都是在python2.7下操作的

核心的SSH协议类

从官方文档中翻译而来

Channel类

class paramiko.channel.Channel(chanid)

一个安全的使用SSH传输的通道。一个Channel通常表现地像是一个socket。而且与python套接字的API有所区别。
这个类的实例通常会用来当作一个上下文管理器。
以下是类中的一些常用方法
__init__(chanid)
创建一个新的Channel,这个Channel在传输到达之前不会连接上任何一个特定的会话或者是Transport类的对象。
其中的参数chanid,是这个Channel的ID,由一个已经存在的Transport类来传递。
close()
关闭这个Channel
exec_command(*args,**kwds)
在一个主机上执行命令,如果服务允许,这个Channel会直接连接到标准输入流输出流和标准错误中来执行指令。
fileno()
返回一个系统级别的文件描述符,这个描述符可以用于polling方式的I/O复用。
get_id()
返回一个int型的ID
get_name_()
如果这个Channel类之前被命名过,会返回它的名字。
其余的在官方文档中可以继续查阅学习
http://docs.paramiko.org/en/2.3/api/channel.html#paramiko.channel.Channel

Client类
这是最为常用的一个类。
class paramiko.client.AutoAddPolicy
自动的将新的主机名和key加入到本地的hostkey当中,并且保存。
在使用的过程中,作用是允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面。
class paramiko.client.SSHClient
这个类打包了Transport,Channel还有SFTPClient这几个类的功能,考虑到了大多数在认证方面的问题。
使用的一个例子:

client = SSHClient() #实例化SSHcleint类
client.load_system_host_keys()
client.connect('ssh.example.com')#连接到主机
stdin, stdout, stderr = client.exec_command('ls -l') #执行shell命令ls -l

这个类中的方法有
__init__()
创建一个新的SSHClient类,
close()
关闭这个SSHclient以及它下属的Transport

connect(hostname,port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True)

可以接多个参数
作用是连接到一个SSH服务端并且完成认证,如果没有指定的对策,默认就是将密钥拒绝并且抛出一个SSHException的异常。

exec_command(command, bufsize=-1, timeout=None, get_pty=False, environment=None)

在SSH的主机上执行命令。
参数主要有:
command:字符串类型 表明执行的指令
bufsize:int类型 缓冲区的大小
timeout:int类型 设置这个命令的响应时间。
enviroment():dict字典类型 指定shell命令的执行环境

get_host_keys()

获得本地的hostkey对象,这个可以用于检测本地密钥,或者是对本地的进行修改

get_transport

返回一个这个SSH连接下属的Transport对象

load_host_keys(filename)

从本地的host-key文件中加载host key

关于其他的详细可以查阅官方文档
http://docs.paramiko.org/en/2.3/api/client.html

Transport类
作为核心协议的实现

class paramiko.transport.SecurityOptions(transport

这是一个简单的对象包括了ssh传输安全的偏好选项。这些都是tuple类型,包括了可接受的密码,摘要,密钥的类型,还有加密算法都在这个偏好里头一一列出

class paramiko.transport.Transport(sock, default_window_size=2097152, default_max_packet_size=32768, gss_kex=False, gss_deleg_creds=True)

SSH运输附加到一个流(通常是一个套接字),协商一个加密的会话,进行身份验证,然后创建流的通道,称为channle,贯穿会话。多种渠道可以在单个会话多路复用(通常,在端口转发)
其余的可以在官方文档中查阅学习
http://docs.paramiko.org/en/2.3/api/transport.html

一些使用的案例

简单的SSH登录并且执行命令
借鉴http://blog.csdn.net/songfreeman/article/details/50920767
使用SSHclient登录

import paramiko
ssh = paramiko.SSHClient() #实例化SSHclient对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.connect(hostname='172.25.254.41', port=22, username='root', password='redhat') #进行远程主机的连接
stdin, stdout, stderr = ssh.exec_command('ls -l')
# 执行SHELL命令,结果放到stdout中,错误的输出将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()

使用transport登录
因为使用SSHclient知识简单的执行命令关闭连接如果需要实现传输文件或者是下载文件其他操作需要使用transport来完成

import paramiko
# 实例化一个transport对象
trans = paramiko.Transport(('172.25.254.41', 22))
# 建立连接
trans.connect(username='root', password='redhat')
# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())
# 关闭连接
trans.close()

传输文件到远程的服务器中
从172.25.254.40传输到172.25.254.41上传输文件
从172.25.254.40的/tmp/patamiko 中的文件
传输到172.25.254.41的/tmp/paramiko文件夹下

#encoding=utf-8
import paramiko,os
hostname='172.25.254.41'
username='root'
password='redhat'
port=22
local_dir='/tmp/paramiko'
remote_dir='/tmp/paramiko'

try:
    t=paramiko.Transport((hostname,port)) #实例化一个Transport对象
    t.connect(username=username,password=password) # 建立连接
    SFTP= paramiko.SFTPClient.from_transport(t) #实例化一个SFTPClient对象
    files=os.listdir(local_dir) #列出文件夹下的所有文件
    for file in files:
        SFTP.put(os.path.join(local_dir,file),os.path.join(remote_dir,file))
        #将本地的文件传输到远程主机相应的文件夹下
    t.close()
    #关闭Transport连接
except Exception:
    print "Error"

你可能感兴趣的:(python)