zoukankan      html  css  js  c++  java
  • python paramiko模块简介

    python paramiko模块简介

     

    一:简介

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

    由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

    举个常见的例子,现有这样的需求:需要使用windows客户端,远程连接到Linux服务器,查看上面的日志状态,大家通常使用的方法会是:

    1:用telnet

    2:用PUTTY

    3:用WinSCP

    4:用XManager等…

    那现在如果需求又增加一条,要从服务器上下载文件,该怎么办?那常用的办法可能会是:

    1:Linux上安装FTP并配置

    2:Linux上安装Sambe并配置…

    大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了。

    使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助。

    二:安装

    安装paramiko有两个先决条件,python和另外一个名为PyCrypto的模块。

      通常安装标准的python模块,只需要在模块的根目录下运行:

    python setup.py build

    python setup.py install

    备注:安装前先检查是否安装gcc(yum -y install gcc)

    2.1 PyCrypto安装

    wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz

    tar -zxvf pycrypto-2.6.tar.gz

    cd pycrypto-2.6/

    python setup.py build && python setup.py install

      测试:

    python>> import Crypto

      (编译时报错:error: command 'gcc' failed with exit status 1;这是因为缺少python-dev的软件包,所yum -y install python-devel)

    2.2 paramiko安装

    wget http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz

    tar xvzf paramiko-1.7.7.1.tar.gz

    cd paramiko-1.7.7.1/

    python setup.py build && python setup.py install

    Crypto error: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'

      测试:

    python>> import paramiko

      (Crypto error: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'

      找到 /usr/lib/python2.7/site-packages/Crypto/Util/number.py

      把if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

      注释了

      #if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

      )

    三: 使用paramiko

    #设置ssh连接的远程主机地址和端口
    t=paramiko.Transport((ip,port))
    #设置登录名和密码
    t.connect(username=username,password=password)
    #连接成功后打开一个channel
    chan=t.open_session()
    #设置会话超时时间
    chan.settimeout(session_timeout)
    #打开远程的terminal
    chan.get_pty()
    #激活terminal
    chan.invoke_shell()
    然后就可以通过chan.send('command')和chan.recv(recv_buffer)来远程执行命令以及本地获取反馈。

    paramiko有两个模块SSHClient()和SFTPClient()

    利用SSHClient()

    复制代码
     1 #coding:utf-8
     2 import paramiko
     3 
     4 #创建SSH对象
     5 ssh = paramiko.SSHClient()
     6 # 允许连接不在know_hosts文件中的主机
     7 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     8 # 连接服务器
     9 ssh.connect(hostname='192.168.2.103', port=22, username='root', password='123456')
    10 
    11 # 执行命令
    12 stdin, stdout, stderr = ssh.exec_command('ls')
    13 # 获取命令结果
    14 result = stdout.read()
    15 print (str(result,encoding='utf-8'))
    16 # 关闭连接
    17 ssh.close()
    复制代码

    SSHClient()里面有一个transport变量,这个是用于获取连接的,因此我们也可以单独的获取到transport变量,然后执行连接操作

    复制代码
     1 #coding:utf-8
     2 import paramiko
     3 
     4 transport = paramiko.Transport(('192.168.2.103', 22))
     5 transport.connect(username='root', password='123456')
     6 
     7 ssh = paramiko.SSHClient()
     8 ssh._transport = transport
     9 
    10 stdin, stdout, stderr = ssh.exec_command('df')
    11 print (str(stdout.read(),encoding='utf-8'))
    12 
    13 transport.close()
    复制代码

    用transport实现上传下载以及命令的执行:

    复制代码
     1 #coding:utf-8
     2 import paramiko
     3 import uuid
     4 
     5 class SSHConnection(object):
     6 
     7     def __init__(self, host='192.168.2.103', port=22, username='root',pwd='123456'):
     8         self.host = host
     9         self.port = port
    10         self.username = username
    11         self.pwd = pwd
    12         self.__k = None
    13 
    14     def connect(self):
    15         transport = paramiko.Transport((self.host,self.port))
    16         transport.connect(username=self.username,password=self.pwd)
    17         self.__transport = transport
    18 
    19     def close(self):
    20         self.__transport.close()
    21 
    22     def upload(self,local_path,target_path):
    23         # 连接,上传
    24         # file_name = self.create_file()
    25         sftp = paramiko.SFTPClient.from_transport(self.__transport)
    26         # 将location.py 上传至服务器 /tmp/test.py
    27         sftp.put(local_path, target_path)
    28 
    29     def download(self,remote_path,local_path):
    30         sftp = paramiko.SFTPClient.from_transport(self.__transport)
    31         sftp.get(remote_path,local_path)
    32 
    33     def cmd(self, command):
    34         ssh = paramiko.SSHClient()
    35         ssh._transport = self.__transport
    36         # 执行命令
    37         stdin, stdout, stderr = ssh.exec_command(command)
    38         # 获取命令结果
    39         result = stdout.read()
    40         print (str(result,encoding='utf-8'))
    41         return result
    42 
    43 ssh = SSHConnection()
    44 ssh.connect()
    45 ssh.cmd("ls")
    46 ssh.upload('s1.py','/tmp/ks77.py')
    47 ssh.download('/tmp/test.py','kkkk',)
    48 ssh.cmd("df")
    49 ssh.close()
    复制代码

    四,与linux连接

    下面是两种使用paramiko连接到linux服务器的代码

    方式一:

    1 ssh = paramiko.SSHClient()
    2 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    3 ssh.connect("某IP地址",22,"用户名", "口令")

    方式二:

    1 t = paramiko.Transport((“主机”,”端口”))
    2 t.connect(username = “用户名”, password = “口令”)

    SFTPClient()也是使用transport来实现的,因此如果有需求需要执行命令和上传文件糅合在一起的话,那么就需要使用transport的方式来实现。

    如果连接远程主机需要提供密钥,上面第二行代码可改成:

    t.connect(username = “用户名”, password = “口令”, hostkey=”密钥”)

    3.1 windows对linux运行任意命令,并将结果输出

    如果linux服务器开放了22端口,在windows端,我们可以使用paramiko远程连接到该服务器,并执行任意命令,然后通过 print或其它方式得到该结果,

    代码如下

    复制代码
     1 #coding:Utf8
     2 
     3 import paramiko
     4  
     5 ssh = paramiko.SSHClient()
     6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     7 ssh.connect("某IP地址",22,"用户名", "口令")
     8 stdin, stdout, stderr = ssh.exec_command("你的命令")
     9 print stdout.readlines()
    10 ssh.close()
    复制代码

    其中的”你的命令”可以任意linux支持的命令

    3.2 从widnows端下载linux服务器上的文件

    复制代码
     1 coding:utf8
     2 
     3 import paramiko
     4  
     5 t = paramiko.Transport((“主机”,”端口”))
     6 t.connect(username = “用户名”, password = “口令”)
     7 sftp = paramiko.SFTPClient.from_transport(t)
     8 remotepath=’/var/log/system.log’
     9 localpath=’/tmp/system.log’
    10 sftp.get(remotepath, localpath)
    11 t.close()
    复制代码

    3.3 从widnows端上传文件到linux服务器

    复制代码
    1 import paramiko
    2 
    3 t = paramiko.Transport((“主机”,”端口”))
    4 t.connect(username = “用户名”, password = “口令”)
    5 sftp = paramiko.SFTPClient.from_transport(t)
    6 remotepath=’/var/log/system.log’
    7 localpath=’/tmp/system.log’
    8 sftp.put(localpath,remotepath)
    9 t.close()
    复制代码

    3.4 在Linux上安装paramiko模块

    安装scrapy这个应用中遇到的问题
    c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory
    sudo apt-get install python-dev
    c/_cffi_backend.c:13:17: fatal error: ffi.h: No such file or directory
    1 sudo apt-get install libffi-dev
    * make sure the development packages of libxml2 and libxslt are installed *
    1 sudo apt-get install libxslt1-dev

    1.下载安装wget http://peak.telecommunity.com/dist/ez_setup.py

    2.python ez_setup.py

    3.easy_install paramiko

    每天记录一点,就能多学一点,充实一点
  • 相关阅读:
    Android : reletive layout
    Android Studio 使用图片
    Android 笔记一:线性布局
    Qt笔记——右键菜单
    Qt笔记——连接第三方库&用libZPlay库获取音频文件的艺术家、专辑等信息
    git常用命令总结
    Qt项目——数字内容管理系统的参考资料和细节
    .Net转Java自学之路—基础巩固篇二十二(XML)
    .Net转Java自学之路—基础巩固篇二十一(模块化思想)
    .Net转Java自学之路—基础巩固篇二十(Lambda)
  • 原文地址:https://www.cnblogs.com/lgj8/p/12982643.html
Copyright © 2011-2022 走看看