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基础教程之分支、循环简单用法
Jun 16 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
Python合并多个Excel数据的方法
Jul 16 Python
python 图像平移和旋转的实例
Jan 10 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
在django中自定义字段Field详解
Dec 03 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
Python容器类型公共方法总结
Aug 19 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
简单了解Django模板的使用
2017/12/20 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python集合常见运算案例解析
2019/10/17 Python
python装饰器代替set get方法实例
2019/12/19 Python
python相对企业语言优势在哪
2020/06/12 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
意大利单身交友网站:Meetic
2020/07/12 全球购物
经济担保书范文
2014/04/02 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技