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中使用itertools模块中的组合函数的教程
Apr 13 Python
Python对文件操作知识汇总
May 15 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
对python3 urllib包与http包的使用详解
May 10 Python
python3.x实现发送邮件功能
May 22 Python
Python3中详解fabfile的编写
Jun 24 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
python用for循环求和的方法总结
Jul 08 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
如何基于python实现脚本加密
Dec 28 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
杏林同学录(八)
2006/10/09 PHP
使用adodb lite解决问题
2006/12/31 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
python缩进区别分析
2014/02/15 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
使用python制作一个解压缩软件
2019/11/13 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Python函数调用追踪实现代码
2020/11/27 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
医生实习工作总结的自我评价
2013/09/27 职场文书
入团者的自我评价分享
2013/12/02 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
迟到检讨书800字
2014/01/13 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
英文演讲稿
2014/05/15 职场文书
违章停车检讨书
2014/10/21 职场文书
初中毕业感言300字
2015/07/31 职场文书
三好学生竞选稿
2015/11/21 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Nginx反向代理学习实例教程
2021/10/24 Servers
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技