前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python paramiko

python paramiko

作者头像
py3study
发布2020-01-06 11:28:23
1.4K0
发布2020-01-06 11:28:23
举报
文章被收录于专栏:python3

Win7下Python2.7环境安装paramiko模块

Win7下Python2.7环境安装paramiko模块,有需要的朋友可以参考下

近段时间用Python写一个小东西,每次修改代码后要手工上传到服务器,觉得很麻烦,虽然有WinSCP,找了一下资料,发现paramiko可以实现自动上传文件的功能,可惜的是,折腾了半天,在Python3.3下没有成功,最后退而求其次安装了2.7才弄好,记录如下:

1.下载安装Windows版本的Python2.7,我默认装在C:\Python27

2.下载PyCrypto2.6 for Python 2.7 64bit 地址为http://www.voidspace.org.uk/python/modules.shtml#pycrypto 以管理员权限执行安装程序,一路Next即可

3.下载安装ecdsa-0.10.tar.gz,地址 https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.10.tar.gz 解压缩 进入安装目录,执行 C:\Python27\python setup.py install

4.下载paramiko压缩包 地址:https://pypi.python.org/packages/source/p/paramiko/paramiko-1.12.1.tar.gz 解压缩后从cmd进入解压缩目录,执行命令 C:\Python27\python setup.sh install

5.确认安装成功 在cmd中执行C:\Python27\python进入python环境 输入import paramiko无错误提示则表示安装成功

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接了,下面我们就来给各位一起验证一下python模块paramiko与ssh安装与使用示例吧。

一、paramiko模块的安装 paramiko模块依赖PyCrypto模块,而PyCrypto需要GCC库编译,不过一般发行版的源里带有该模块。这里以centos6为例,直接借助以下命令可以直接完成安装:

代码如下

复制代码

# yum install gcc python-crypto python-paramiko python-devel  -y

windows版下可以安装windows版的GCC(MinGW),然后编辑安装pycrypto和paramiko ,下载安成后,直接运行python.exe setup.pybuild 和 python.exe setup.py install 就可以了。

二、paramiko的连接 使用paramiko模块有两种连接方式,一种是通过paramiko.SSHClient()函数,另外一种是通过paramiko.Transport()函数。

方法一:

代码如下

复制代码

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

上面的第二行代码的作用是允许连接不在know_hosts文件中的主机。

方法二:

代码如下

复制代码

import paramiko  t = paramiko.Transport(("主机","端口"))  t.connect(username = "用户名", password = "口令")

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

代码如下

复制代码

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

三、paramiko ssh连接 以下是一个简单的通过paramiko模块定义的ssh连接并执行命令的函数,如下:

代码如下

复制代码

#!/usr/bin/python  #-*- coding: utf-8 -*-  import paramiko  #paramiko.util.log_to_file('/tmp/sshout')  def ssh2(ip,username,passwd,cmd):      try:          ssh = paramiko.SSHClient()           ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())           ssh.connect(ip,22,username,passwd,timeout=5)          stdin,stdout,stderr =  ssh.exec_command(cmd)  #            stdin.write("Y")   #简单交互,输入 ‘Y’          print stdout.read()  #        for x in   stdout.readlines():  #          print x.strip("\n")          print '%s\tOK\n'%(ip)          ssh.close()      except :          print '%s\tError\n'%(ip)  ssh2("192.168.0.102","root","361way","hostname;ifconfig")  ssh2("192.168.0.107","root","123456","ifconfig")

其中第四行的日志部分,是记录ssh连接交互时的一些信息,可以看做是类似于debug的输出,一般情况下不需要开启。

stdin.write部分是用于交互情况下,通过该命令可以执行交互。注意这里可能会引起歧义,这里的交互并不是ssh连接过程中出现的让输入 yes的交互,因为paramiko模块在连接过程中会自动处理好yes确认。这里的交互是指后面的cmd需要的执行的程序可能出现交互的情况下,可以通 过该参数进行交互。

stdout标准输出,在输出内容比较少时,可以通过直接使用read读取出所有的输出;但在输出内容比较多时,建议通过按行读取进行处理。不过按行读取时,每行结尾会有换行符\n,这样输出的结果很不美观。可以通过strip进行字符串的处理。

在函数调用过程中需要注意的是,IP、username、passwd都是属于字符串型的,所以需要加引号。后面执行的cmd,如果有多个命令需要操作时,需要通过分号进行分割。

四、paramiko sftp示例 单个文件小传下载的示例:

代码如下

复制代码

import paramiko  #建立一个加密的管道  scp=paramiko.Transport(('192.168.0.102',22))  #建立连接  scp.connect(username='root',password='361way')  #建立一个sftp客户端对象,通过ssh  transport操作远程文件  sftp=paramiko.SFTPClient.from_transport(scp)  #Copy a remote file (remotepath) from the SFTP server to the local host  sftp.get('/root/testfile','/tmp/361way')  #Copy a local file (localpath) to the SFTP server as remotepath  sftp.put('/root/crash-6.1.6.tar.gz','/tmp/crash-6.1.6.tar.gz')  scp.close()

一个目录下多个文件上传下载的示例:

代码如下

复制代码

#!/usr/bin/env python  #-*- coding: utf-8 -*-  import paramiko,datetime,os  hostname='192.168.0.102'  username='root'  password='361way'  port=22  local_dir='/tmp/getfile'  remote_dir='/tmp/abc'  try:      t=paramiko.Transport((hostname,port))      t.connect(username=username,password=password)      sftp=paramiko.SFTPClient.from_transport(t)      #files=sftp.listdir(dir_path)      files=sftp.listdir(remote_dir)      for f in files:          print ''          print  '#########################################'          print 'Beginning to download  file  from %s  %s ' % (hostname,datetime.datetime.now())          print 'Downloading  file:',os.path.join(remote_dir,f)           sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,f))#下载           #sftp.put(os.path.join(local_dir,f),os.path.join(remote_dir,f))#上传          print 'Download file success %s '  % datetime.datetime.now()          print ''          print  '##########################################'      t.close()  except Exception:         print "connect error!"

注:本处的目录下所有文件进行下载或上传的示例中,在遇到目录下还有嵌套的目录存在时,会将目录也当做文件进行处理,所以如果想要更加的完美的话,可以通过引入stat模块下的S_ISDIR方法进行处理

paramiko.transport对象也支持以socket的方式进行连接,如下示例:

代码如下

复制代码

import paramiko  transport = paramiko.Transport(('localhost',22))  transport.connect(username='root', password = 'password')  sftp = paramiko.SFTPClient.from_transport(transport)  sftp.get(remotefile,localfile)  #如果是上传则用:  #sftp.put(localfile, remotefile)  transport.close()  #用socket连接  tcpsock =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)  tcpsock.settimeout(5)  tcpsock.connect((ip,22),)  ssh = paramiko.Transport(tcpsock)  ssh.connect(username=user,password=password)  sftpConnect=paramiko.SFTPClient.from_transport(ssh)

五、利用paramiko实现ssh的交互式连接 以下是通过paramiko模块直接用ssh协议登陆到远程服务器的操作代码,这里先定义一个interactive模块,代码如下:

代码如下

复制代码

import socket  import sys  # windows does not have termios...  try:      import termios      import tty      has_termios = True  except ImportError:      has_termios = False  def interactive_shell(chan):      if has_termios:          posix_shell(chan)      else:          windows_shell(chan)  def posix_shell(chan):      import select      oldtty = termios.tcgetattr(sys.stdin)      try:          tty.setraw(sys.stdin.fileno())          tty.setcbreak(sys.stdin.fileno())          chan.settimeout(0.0)          while True:              r, w, e =  select.select([chan, sys.stdin], [], [])              if chan in  r:                   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:                   x = sys.stdin.read(1)                   if len(x) == 0:                       break                   chan.send(x)      finally:          termios.tcsetattr(sys.stdin,  termios.TCSADRAIN, oldtty)  # thanks to Mike Looijmans for this code  def windows_shell(chan):      import threading      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

代码内容可以从paramiko 在github项目上的demo里获取。再另外写一个ssh_inter.py的交互主程序,内容如下:

代码如下

复制代码

import paramiko  import interactive  #记录日志  paramiko.util.log_to_file('/tmp/test')  #建立ssh连接  ssh=paramiko.SSHClient()  ssh.load_system_host_keys()  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  ssh.connect('192.168.0.102',port=22,username='root',password='xxxxxx',compress=True)  #建立交互式shell连接  channel=ssh.invoke_shell()  #建立交互式管道  interactive.interactive_shell(channel)  #关闭连接  channel.close()  ssh.close()

执行效果就像我们平时直接使用ssh登录一样。

六、总结 paramiko模块是一个比较强大的ssh连接模块,以上的示例只是列出了该模块的一些简单的使用方法,还可以使用threading模块加块程序并发 的速度;也可以使用configparser模块处理配置文件,而我们将所有IP、用户信息操作都放入配置文件;使用setproctitle模块为执行 的程序加一个容易区分的title等。

同样,虽然连fabric这样大名鼎鼎的软件使用的ssh都是用paramiko模块进行的封装,不过你依然可以选择不使用它,你也可以选择pexpect模块实现封装一个简易的ssh连接工具、或者使用同样比较火的salt-ssh模块。

paramiko模块是基于Python实现的ssh远程安全链接,实现命令远程、文件传输、SSH代理等功能。本文详细介绍了paramiko模块常用的方法,且实用价值非常高,稍作修改就能做出一个实用的运维工具。

安装

letong@me:~$ sudo pip install paramiko

简单的远程执行命令实例

代码语言:javascript
复制
#!/usr/bin/env python
代码语言:javascript
复制
import paramiko
代码语言:javascript
复制
hostname='127.0.0.1'
代码语言:javascript
复制
username='root'
代码语言:javascript
复制
password='123456'
代码语言:javascript
复制
port=2222
代码语言:javascript
复制
代码语言:javascript
复制
ssh=paramiko.SSHClient()
代码语言:javascript
复制
ssh.load_system_host_keys()
代码语言:javascript
复制
ssh.connect(hostname=hostname,port=port,username=username,password=password)
代码语言:javascript
复制
stdin,stdout,stderr=ssh.exec_command('ls /')
代码语言:javascript
复制
print stdout.read()
代码语言:javascript
复制
ssh.close()

SSHClient类

SSHClient类是SSH服务会话的高级表示,封装了传输、通道以及SFTPClient的校验、建立方法,通常用于执行命令。

connect方法

connect(self, hostname, port=22, username=None,password=None, pkey=None, Key_filename=None, timeout=None, allow_agent=True,look_for_keys=True, compress=False)

参数说明:

hostname,连接目标的主机地址 port,连接目标的端口,默认22 username,用户名 password,用户密码 pkey,私钥方式用户验证 key_filename,私钥文件名 timeout,超时时间 allow_agent,是否允许ssh代理 look_for_keys,是否允许搜索私钥文件 compress,打开时是否压缩

exec_command方法

exec_command(self, command, bufzise=-1)

参数说明:

command,执行的命令 bufsize,文件缓冲区大小,-1不限制

load_system_host_keys方法

load_system_host_keys(self, filename=None)

参数说明:

filename,指定远程主机公钥文件

set_missing_host_key_policy方法

ssh=paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

参数说明:

AutoAddPolicy,自动添加主机名及密钥到本地并保存,不依赖load_system_host_keys()配置 RejectPolicy,自动拒绝未知主机名和密钥,依赖load_system_host_keys()配置 WarnningPolicy,功能与AutoAddPolicy相同,但是未知主机会报警

SFTPClient类

根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作。

from_transport方法

from_transport(cls, t)

参数说明:

t,一个已通过验证的传输对象

例:

>>> import paramiko >>> a = paramiko.Transport((“127.0.0.1″,2222)) >>> a.connect(username=”root”, password=’123456′) >>> sftp = paramiko.SFTPClient.from_transport(a)

put方法

put(self, localpath, remotepath, callback=None,confirm=True)

参数说明:

localpath,上传源文件的本地路径 remotepath,目标路径 callback,获取接收与总传输字节数 confirm,上传完毕后是否调用stat()方法,以便确认文件大小

例:

>>> localpath=’ftp-test.log’ >>> remotepath=’/data/ftp-test.log’ >>> sftp.put(localpath,remotepath)

get方法

get(self, remotepath, localpath, callback=None)

参数说明:

remotepath,需要下载的远程文件 localpath,本地存储路径 callback,同put方法

其他方法

mkdir,用于创建目录 remove,删除目录 rename,重命名 stat,获取文件信息 listdir,获取目录列表

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSHClient类
    • connect方法
      • exec_command方法
        • load_system_host_keys方法
          • set_missing_host_key_policy方法
          • SFTPClient类
            • from_transport方法
              • put方法
                • get方法
                  • 其他方法
                  相关产品与服务
                  命令行工具
                  腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档