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用GET方法上传文件
Mar 10 Python
在Django的session中使用User对象的方法
Jul 23 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
python爬取微信公众号文章的方法
Feb 26 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
python实现xml转json文件的示例代码
Dec 30 Python
python中Pexpect的工作流程实例讲解
Mar 02 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获取当前时间不准确问题解决方案
2020/08/14 PHP
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
requireJS使用指南
2016/04/27 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
jstree的简单实例
2016/12/01 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
Python Socket编程入门教程
2014/07/11 Python
Python列表append和+的区别浅析
2015/02/02 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
在python中画正态分布图像的实例
2019/07/08 Python
python实现中文文本分句的例子
2019/07/15 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python zip函数打包元素实例解析
2019/12/11 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
python3 实现口罩抽签的功能
2020/03/11 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
春节联欢晚会主持词
2014/03/24 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
Nginx的反向代理实例详解
2021/03/31 Servers
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏