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 21 Python
python添加模块搜索路径方法
Sep 11 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
Django ModelForm组件使用方法详解
Jul 23 Python
python flask几分钟实现web服务的例子
Jul 26 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
python requests证书问题解决
Sep 05 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Pytorch中的数据集划分&正则化方法
May 27 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP输出时间差函数代码
2013/01/28 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP答题类应用接口实例
2015/02/09 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
关于Js中new操作符的作用详解
2021/02/21 Javascript
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
介绍一下Ruby的多线程处理
2013/02/01 面试题
应用外语系自荐信
2014/06/26 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL