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 Django模板的使用方法(图文)
Nov 04 Python
Python 处理数据的实例详解
Aug 10 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
在django中form的label和verbose name的区别说明
May 20 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
python等待10秒执行下一命令的方法
Jul 19 Python
python实现双人五子棋(终端版)
Dec 30 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 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
PHP中的CMS的涵义
2007/03/11 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
基于jquery的拖动布局插件
2011/11/25 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
vuejs如何配置less
2017/04/25 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
Python-while 计算100以内奇数和的方法
2019/06/11 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
儿科护士自我鉴定
2013/10/14 职场文书
水务局局长岗位职责
2013/11/28 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
2014信息公开实施方案
2014/02/22 职场文书
股份转让协议书
2014/04/12 职场文书
机械工程师岗位职责
2014/06/16 职场文书
图书室标语
2014/06/21 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
债务纠纷委托书
2014/08/30 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
党员剖析材料范文
2014/12/18 职场文书
房贷工资证明范本
2015/06/12 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL