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实现求最大公约数及判断素数的方法
May 26 Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python中scatter函数参数及用法详解
Nov 08 Python
python实现textrank关键词提取
Jun 22 Python
python实现ID3决策树算法
Aug 29 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
python标识符命名规范原理解析
Jan 10 Python
python numpy实现rolling滚动案例
Jun 08 Python
Jupyter Notebook安装及使用方法解析
Nov 12 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
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python 构造三维全零数组的方法
2018/11/12 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
环卫工人节活动总结
2014/08/29 职场文书
委托书的样本
2015/01/28 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
大学生读书笔记范文
2015/07/01 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书