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中的魔法方法深入理解
Jul 09 Python
Python 模拟购物车的实例讲解
Sep 11 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
Python聊天室程序(基础版)
Apr 01 Python
用python写扫雷游戏实例代码分享
May 27 Python
Python走楼梯问题解决方法示例
Jul 25 Python
python 实现A*算法的示例代码
Aug 13 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
Python多进程编程技术实例分析
2014/09/16 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
银河香水:Galaxy Perfume
2019/03/25 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
JPA的特点
2014/10/25 面试题
小学生倡议书范文
2014/05/13 职场文书
减负增效提质方案
2014/05/23 职场文书
国际会计专业求职信
2014/08/04 职场文书
小学班级特色活动方案
2014/08/31 职场文书
企业承诺书格式范文
2015/04/28 职场文书
企业团队精神心得体会
2016/01/19 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技