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写的Socks5协议代理服务器
Aug 06 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
Python threading的使用方法解析
Aug 28 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
Pandas-DataFrame知识点汇总
Mar 16 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 阴历-农历-转换类代码
2012/01/16 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
js直接编辑当前cookie的脚本
2008/09/14 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
python实现读取命令行参数的方法
2015/05/22 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
python机器学习实现决策树
2019/11/11 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
捐款倡议书怎么写
2014/05/13 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js