python Paramiko使用示例


Posted in Python onSeptember 21, 2020

Paramiko 是由 Python 语言编写的一个扩展模块,提供了基于 SSHv2 协议 (包括客户端和服务端)的多种功能实现。通常被用来远程控制类 UNIX 系统。

Paramiko 可以直接使用 pip 命令安装:

$ pip install paramiko

此处不作过多介绍,参考后文中的代码示例。

远程执行 Linux 命令

代码如下:

import paramiko

# 初始化 SSH 客户端,通过用户名密码连接至远程服务器
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(hostname='remoteserver_ip', username='username', password='password')

# 通过 RSA 秘钥验证的方式连接至远程 SSH 服务
# private_key = paramiko.RSAKey.from_private_key_file('~/.ssh/id_rsa')
# client.connect(hostname="remoteserver_ip", username="username", pkey=private_key)

# 远程执行 df -h 命令并打印输出
stdin, stdout, stderr = client.exec_command('df -h')
print(stdout.read().decode('utf-8'))

client.close()

运行效果如下:

python Paramiko使用示例

SFTP 文件传输

示例代码如下:

import paramiko

transport = paramiko.Transport(('hostname_or_ip', port))

# 通过用户名密码完成验证建立连接
transport.connect(username='username', password='password')

# 通过 RSA 私钥文件完成验证建立连接
# private_key = paramiko.RSAKey.from_private_key_file('/path/to/private_key_file')
# transport.connect(username='username', pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(transport)

localpath = "localfile"
remotepath = "remotefile_fullpath"
sftp.put(localpath, remotepath)
print("Successfully uploaded")

transport.close()

综合示例

代码如下(文件名 ssh_connection.py ):

import paramiko
import getpass
import os


class SSHConnection():

  def __init__(self, user, host, port=22, password=''):
    self.username = user
    self.host = host
    self.port = port
    self.password = password
    self.keyfile = self.get_keyfile()

  def get_keyfile(self, path=os.getcwd()):
    default_keyfile = os.path.join(
      os.environ['HOME'], '.ssh', 'id_rsa')

    if 'id_rsa' in os.listdir(path):
      keyfile = os.path.join(path, 'id_rsa')
    elif os.path.isfile(default_keyfile):
      keyfile = default_keyfile
    else:
      keyfile = ''

    return keyfile

  def connect(self):
    transport = paramiko.Transport((self.host, self.port))

    if self.password:
      transport.connect(username=self.username, password=self.password)
    elif self.keyfile:
      transport.connect(
        username=self.username,
        pkey=paramiko.RSAKey.from_private_key_file(self.keyfile))
    else:
      password = getpass.getpass(
        "Password for %s@%s: " % (self.username, self.host))
      transport.connect(username=self.username, password=password)

    self._transport = transport

    print("Connected to %s as %s" % (self.host, self.username))

  def close(self):
    self._transport.close()

  def run_cmd(self, command):
    ssh = paramiko.SSHClient()
    ssh._transport = self._transport

    stdin, stdout, stderr = ssh.exec_command(command)
    res = stdout.read().decode('utf-8')
    error = stderr.read().decode('utf-8')

    if error.strip():
      return error
    else:
      return res

  def trans_file(self, localpath, remotepath, method=''):
    sftp = paramiko.SFTPClient.from_transport(self._transport)
    if method == 'put':
      sftp.put(localpath, remotepath)
      print("File %s has uploaded to %s" % (localpath, remotepath))
    elif method == 'get':
      sftp.get(remotepath, localpath)
      print("File %s has saved as %s" % (remotepath, localpath))
    else:
      print('usage: trans_file(localpath, remotepath, method="get/put"')

  def __del__(self):
    self.close()

测试结果如下:

(python3) D:\Program\python\devops>python
Python 3.7.2 (default, Jan 2 2019, 17:07:39) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ssh_connection import SSHConnection
>>> client = SSHConnection('starky','127.0.0.1')
>>> client.connect()
Connected to 127.0.0.1 as starky
>>> client.run_cmd('uname -a')
'Linux server1 5.0.0-20-generic #21-Ubuntu SMP Mon Jun 24 09:32:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
>>> client.trans_file('id_rsa.pub', '/home/starky/id_rsa.pub', method='put')
File id_rsa.pub has uploaded to /home/starky/id_rsa.pub
>>> client.run_cmd('ls -l /home/starky/id_rsa.pub')
'-rw-rw-r-- 1 starky starky 410 7月 20 15:01 /home/starky/id_rsa.pub\n'
>>> exit()

以上就是python Paramiko使用示例的详细内容,更多关于python Paramiko的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
跟老齐学Python之集成开发环境(IDE)
Sep 12 Python
Python编写屏幕截图程序方法
Feb 18 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
Python对多属性的重复数据去重实例
Apr 18 Python
详解python pandas 分组统计的方法
Jul 30 Python
python批量读取文件名并写入txt文件中
Sep 05 Python
python实现监控阿里云账户余额功能
Dec 16 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
python pillow库的基础使用教程
Jan 13 Python
python re模块和正则表达式
Mar 24 Python
Python 键盘事件详解
Nov 11 Python
Python引入多个模块及包的概念过程解析
Sep 21 #Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 #Python
简单了解python关键字global nonlocal区别
Sep 21 #Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 #Python
python 字符串格式化的示例
Sep 21 #Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 #Python
属性与 @property 方法让你的python更高效
Sep 21 #Python
You might like
做个自己站内搜索引擎
2006/10/09 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
laravel自定义分页效果
2017/07/23 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
php session_decode函数用法讲解
2019/05/26 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
javascript 闭包详解
2015/07/02 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
bootstrap fileinput完整实例分享
2016/11/08 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
layer弹出层全屏及关闭方法
2018/08/17 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
安全生产宣传标语
2014/06/06 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2016公司新年问候语
2015/11/11 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL