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 30 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python如何判断数独是否合法
Sep 08 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
django使用LDAP验证的方法示例
Dec 10 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 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的图形函数中显示汉字
2006/10/09 PHP
php实现的ping端口函数实例
2014/11/12 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
ExpressJS入门实例
2015/01/14 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
详解使用Python处理文件目录的相关方法
2015/10/16 Python
Python图算法实例分析
2016/08/13 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
印度购物网站:TATA CLiQ
2017/11/23 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
投标保密承诺书
2014/05/19 职场文书
追悼会悼词大全
2015/06/23 职场文书
优质服务标语口号
2015/12/26 职场文书
商业计划书范文
2019/04/24 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android