使用Python的paramiko模块实现ssh与scp功能

   2017-02-05 0
核心提示:#1. 介绍这篇文章简单地介绍了python的paramiko模块的用法,paramiko实现了SSH协议,能够方便地与远程计算机交互。简单的说,就是你在terminal下执行的如下语句,现在可以通过python的paramiko实现了。# 执行shell语句ssh -i ~/.ssh/id_rsa -p 1098rds@12.164

#1. 介绍

这篇文章简单地介绍了python的paramiko模块的用法,paramiko实现了SSH协议,能够方便地与远程计算机交互。简单的说,就是你在terminal下执行的如下语句,现在可以通过python的paramiko实现了。

# 执行shell语句
    ssh -i ~/.ssh/id_rsa -p 1098  rds@12.164.145.21-e 'ls -al'# 拷贝数据到远程计算机
    scp -i ~/.ssh/id_rsa -P 1098-r data rds@12.164.145.21:~/data

这里不讨论shell与python实现的优缺点,如果你没有需求,也不会看到这篇博客了。我个人使用paramiko是为了使用python的多线程,并发地对多台远程计算机执行相同的操作。

这篇博客虽然篇幅不大,但是,可能是目前网络上最好的中文入门教程了。那就开始吧!

2. 安装

安装非常简单,直接使用pip安装即可:

sudo pip instal paramiko

3. 建立SSH连接

使用密码连接:

import paramiko
ssh = paramiko.SSHClient()#这行代码的作用是允许连接不在know_hosts文件中的主机。
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("IP",  port,"username","password")

使用私钥连接:

ssh = paramiko.SSHClient()
ssh.connect('10.120.48.109', port,'用户名',
key_filename='私钥')

连接以后可以执行shell命令:

In[8]: ssh.exec_command('ls')Out[8]:(<paramiko.ChannelFilefrom<paramiko.Channel1(open) window=2097152-><paramiko.Transport at 0x377c690L(cipher aes128-ctr,128 bits)(active;2 open channel(s))>>>,<paramiko.ChannelFilefrom<paramiko.Channel1(open) window=2097152-><paramiko.Transport at 0x377c690L(cipher aes128-ctr,128 bits)(active;2 open channel(s))>>>,<paramiko.ChannelFilefrom<paramiko.Channel1(open) window=2097152-><paramiko.Transport at 0x377c690L(cipher aes128-ctr,128 bits)(active;2 open channel(s))>>>)

执行shell命令以后,并不会立即打印命令的执行结果,而是返回几个Channel, 只能像下面这样获取输出:

In[9]: stdin, stdout, stderr = ssh.exec_command('ls')In[10]:print stdout.readlines()['AgentBackkup_2015-06-11\n','AgentBackup\n','log\n','mysql.sh\n','rdsAgent\n']

注意:命令执行出错并不会抛出异常,所以,对于命令出错需要根据自己的需求进行相应的处理:

In[54]: stdin, stdout, stderr = ssh.exec_command('cat file_not_found')In[55]:print stdout.readlines()[]In[56]:print stderr.readlines()[u'cat: file_not_found: No such file or directory\n']In[57]: stdin, stdout, stderr = ssh.exec_command('ls')In[58]:print stderr.readlines()[]

API文档: https://paramiko-docs.readthedocs.org/en/1.15/api/client.html

4. SCP vs SFTP

通过paramiko还可以传输文件,这是我??这篇博客的主要原因。搜了很多博客,都没有说明白如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式:

sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
sftp = ssh.open_sftp()

即新建一个SFTPClient对象,该对象复用之前的SSH连接,因此,我们使用sftp传输文件时,不需要再次进行用户认证。

  • 文件上传

    In[59]: sftp.put('memory.py','memory.py')Out[59]:<SFTPAttributes:[ size=288 uid=1000 gid=1000 mode=0100644 atime=1435391914 mtime=1435391914]>
  • 文件下载

    In[60]: sftp.get('memory.py','backup.py')
  • 执行命令

    paramiko并没有提供一个叫做scp的子模块,如果我们希望在计算机之间传输数据,可以通过sftp(sftp实现了scp所有的功能,也就没有必再实现一个scp)传输文件,还可以通过sftp执行命令,如下所示:

    In[44]: sftp.listdir()Out[44]:['.viminfo','.bash_logout','.bash_history','AgentBackkup_2015-06-10','AgentBackup','rdsAgent']In[45]: sftp.rename('AgentBackkup_2015-06-10','AgentBackkup_2015-06-11')In[46]: sftp.listdir()Out[46]:['AgentBackkup_2015-06-11','.viminfo','.bash_logout','.bash_history','AgentBackup','rdsAgent']

sftp提供了很多命令,具体内容可以参考 官方文档

零基础如何入门Python http://www.linuxidc.com/Linux/2016-10/136485.htm

Ubuntu 14.04安装Python 3.3.5  http://www.linuxidc.com/Linux/2014-05/101481.htm

CentOS上源码安装Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm

Ubuntu 14.04下Python数据处理环境搭建 http://www.linuxidc.com/Linux/2017-01/139568.htm

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm

在CentOS 6.5上安装Python2.7 http://www.linuxidc.com/Linux/2016-10/136206.htm

在Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htm

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-01/139972.htm

 
标签: Python SSH
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 一个用 Python 分析 Apache 日志的故事
    一个用 Python 分析 Apache 日志的故事
    介绍不久前,公司里有人告诉我“我想知道 Apache 的访问日志是否可以用来做一些事情”。数据分析,Apache,发文章,我是初学者,写的不好请见谅。访问日志分析导入模块我正在使用以下模块。# データの処理import pandas as pdimport numpy as np# グラフ表示i
    03-08
  • debian的python蓝牙库
    sudo apt-get install libglib2.0-devpip install bluepy 
    02-10
  • linux下将Python环境默认更改为Python3.6
    步骤:#删除原来指向python2的软链接sudo mv /usr/bin/python /usr/bin/python.bak #/usr/local/python3.6/bin/python3.6 这个路径为实际的python3.6的bin文件夹下的Python3.6的路径,这个按照自己的实际情况进行更改 sudo ln -s /usr/bin/python3.6 /usr/bin
    02-10
  • 通过python-libvirt管理KVM虚拟机 代码实现
    初步代码 [python] view plain copy span style="font-size:18px;"''''' Work with virtual machines managed by libvirt     :depends: libvirt Python module '''  # Special Thanks to Michael Dehann, many of the conce
    02-10
  • centos安装python与jdk centos安装python3.7
    centos安装python与jdk centos安装python3.7
    安装python#压缩包安装[root@china ~]# yum -y install zlib*Loaded plugins: fastestmirror, refresh-packagekit, securityLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun
    02-10
  • centos6下同时安装python2和python3
    #build-essential compile packagesyum groupinstall "Development Tools"yum install openssl-develyum install zlib-develyum install make gcc gcc-c++ kernel-develhttp://unix.stackexchange.com/questions/291737/zipimport-zipimporterror-cant-decomp
    02-10
  • CentOS7 安装 Python3.8后 pip 安装报错
    [root@localhost Python-3.8.0]# pip install bs4Collecting bs4Using cached https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gzERROR: Command errored out with exit status
    02-10
  • CentOS 7 - 安装Python 3
    Enable Software Collections (SCL)Software Collections, also known as SCL is a community project that allows you to build, install, and use multiple versions of software on the same system, without affecting system default packages. By enabl
    02-10
  • Nginx+uWSGI部署Python Web应用
    Nginx+uWSGI部署Python Web应用
    web开发的过程中一定会遇到 cgi、wsgi 之类的名词,然后看着他们十分相似的解释估计还没开始写代码就晕了,这都什么鬼? 今天我就聊聊这些容易搞混的名称。CGI(Common Gateway Inteface)  字面的意思就是通用网关接口,它是外部应用程序与Web服务器之间的
    02-10
  • Nginx+uwsgi+python配置
    Nginx+uwsgi+python配置
    版本:Nginx 1.0.5   uwsgi 1.1.2   Python 2.7.2原理: nginx配置 location /python { include uwsgi_params; uwsgi_pass 127.0.0.1:9090;}uwsgi启动参数    uwsgi --socket :9090 --wsgi-file /var/www/project/hello.pyhello.py 文件def appli
    02-10
点击排行