Python进阶之-paramiko详解

✨简介:

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

🌟安装Paramiko

首先,需要确保安装了Paramiko。可以使用pip来安装:

pip install paramiko

🌟Paramiko的主要类

SSHClient: 最常用的类,表示一个SSH客户端连接。
SFTPClient: 用于SFTP传输操作。
Transport: 低级别的模块,可用来实现SSH2协议。
SSHClient主要方法
connect(hostname, port=22, username=None, password=None, pkey=None): 用于连接到远程服务器。可以选择使用用户名和密码或密钥进行认证。
exec_command(command): 在远程服务器上执行指令。
open_sftp(): 返回一个SFTPClient对象,可用于文件的上传与下载。
SFTPClient主要方法
get(remotepath, localpath, callback=None): 下载远程文件。
put(localpath, remotepath, callback=None, confirm=True): 上传本地文件。
listdir(path=“.”): 列出远程目录的内容。

✨示例

🌟SSH连接并执行命令

import paramiko

# 创建SSH客户端
client = paramiko.SSHClient()

# 自动添加未知的服务器密钥及策略
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接SSH服务端
client.connect('hostname', port=22, username='username', password='password')

# 执行命令
stdin, stdout, stderr = client.exec_command('ls -l')

# 获取命令执行结果
result = stdout.read()

print(result.decode())

# 关闭连接
client.close()

🌟通过SFTP上传和下载文件

import paramiko

# 创建SSH客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', port=22, username='username', password='password')

# 创建SFTP会话
sftp = client.open_sftp()

# 上传文件
sftp.put('localfile.txt', '/remote/path/remote.txt')

# 下载文件
sftp.get('/remote/path/remote.txt', 'localfile.txt')

# 关闭SFTP会话和SSH连接
sftp.close()
client.close()

⚠️注意事项

在使用connect方法时务必考虑安全性,例如使用密钥认证而非明文密码。
对于错误处理,应当尝试捕获paramiko.ssh_exception.SSHException异常。
当不再需要SSH或SFTP客户端时,应当调用close()方法关闭连接。

🌟SSH方法的封装

下面提供一个比较简单的对SSH连接的封装的例子,实现了代理和不需要代理的方式连接服务器,以及发送命令,希望对大家有用。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/9
# @Author  : Summer
# @File    : SSH
# @describe:
"""
import paramiko


class SSHClient:
    def __init__(self, hostname, port=22, username=None, password=None, pkey=None, use_proxy=False, proxy_hostname=None,
                 proxy_port=None, proxy_username=None, proxy_password=None, timeout=5):
        """
        初始化SSH客户端。

        :param hostname: 主机名或IP地址
        :param port: 端口号,默认是22
        :param username: 用户名
        :param password: 密码
        :param pkey: 私钥文件对象,用于密钥认证
        :param use_proxy: 是否使用代理标志
        :param proxy_hostname: 代理的主机名称
        :param proxy_port: 代理的端口号
        :param proxy_username: 代理的用户名
        :param proxy_password: 代理的密码
        """
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.pkey = pkey
        self.use_proxy = use_proxy
        self.proxy_hostname = proxy_hostname
        self.proxy_port = proxy_port
        self.proxy_username = proxy_username
        self.proxy_password = proxy_password
        self.client = None
        self.timeout = timeout

    def _setup_proxy(self):
        """
        配置代理。
        """
        if self.use_proxy:
            proxy_ssh = paramiko.SSHClient()
            proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            proxy_ssh.connect(hostname=self.proxy_hostname, port=self.proxy_port, username=self.proxy_username,
                              password=self.proxy_password, timeout=self.timeout)
            vm_transport = proxy_ssh.get_transport()
            remote_address = (self.hostname, self.port)
            local_address = (self.proxy_hostname, self.proxy_port)
            vm_channel = vm_transport.open_channel("direct-tcpip", remote_address, local_address)
            return vm_channel
        else:
            return None

    def _connect(self):
        """
        创建SSH连接。
        """
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        proxy = self._setup_proxy()
        self.client.connect(self.hostname, port=self.port, username=self.username, password=self.password,
                            pkey=self.pkey, sock=proxy, timeout=self.timeout)

    def exec_command(self, command):
        """
        在远程服务器上执行命令。
        :param command: 要执行的命令字符串
        :return: 命令输出结果的标准输出和标准错误
        """
        if self.client is None:
            self._connect()
        stdin, stdout, stderr = self.client.exec_command(command)
        return stdout.read().decode(), stderr.read().decode()

    def close(self):
        """
        关闭SSH连接。
        """
        if self.client:
            self.client.close()
            self.client = None


# 使用示例
if __name__ == "__main__":
    # 直接连接
    ssh = SSHClient(hostname='hostname', port=22, username='username', password='password')
    stdout, stderr = ssh.exec_command('ls -l')
    print(stdout)
    ssh.close()

    # 通过代理连接
    ssh_with_proxy = SSHClient(hostname='hostname', port=22, username='username', password='password', use_proxy=True,
                               proxy_hostname='proxy_hostname', proxy_port=22, proxy_username='proxy_username',
                               proxy_password='proxy_password')
    stdout, stderr = ssh_with_proxy.exec_command('ls -l')
    print(stdout)
    ssh_with_proxy.close()

✨paramiko和pexpect对比

Paramiko和pexpect都是Python库,用于与外部进程、系统和设备进行交互,但它们的设计目的和使用场景存在明显的区别。

🌟Paramiko

Paramiko是一个纯Python实现的SSHv2协议库,它提供了客户端和服务器的SSH功能。Paramiko使得用户可以很容易地使用Python进行安全的远程连接、文件传输(SFTP)以及端口转发。
主要特点
提供了SSH客户端和服务器端编程接口。
支持密钥认证和密码认证。
支持SFTP客户端和服务器功能。
可以用于创建SSH隧道。
提供了底层的通信传输接口(Transport)和高层的功能封装(SSHClient)。

🌟pexpect

pexpect是一个用于控制和自动化命令行应用程序的Python库。它能够启动子程序,并通过预设的期望模式与其交互,从而模拟用户的输入。这类似于在Unix和Linux系统中的脚本工具expect。
主要特点
通过预期模式匹配来交互,类似于Unix中的expect命令。
广泛用于自动构造与许多命令行应用程序的交互会话,不局限于SSH连接。
可以等待特定的字符串出现在输出中,然后发送字符串给进程。
通常用于执行自动化测试,如自动与命令行工具交互输入、输出。

🌟对比与优势

使用场景
Paramiko专注于SSH连接,适用于需要通过SSH执行命令、传输文件等脚本化的自动化任务。pexpect更为通用,可以用于自动化控制任何命令行交互,不仅限于SSH。

安全性
Paramiko直接支持SSH协议的加密和认证机制,非常适合执行需要加密和认证的远程操作任务。而pexpect本身并不处理加密或认证,但可以通过pexpect去调用使用SSH的命令,比如ssh。

复杂性
Paramiko为SSH操作提供了丰富的API,对于复杂的SSH交互和文件操作有着更好的支持。pexpect则在模拟用户和程序间简单交互上的使用更为直观。

平台兼容性
Paramiko是纯Python实现,无需依赖系统命令,因此跨平台支持较好。而pexpect原本设计用于Unix-like系统,虽然有为Windows平台提供的类似库(如winpexpect),但并非原生。

性能
Paramiko可能比pexpect在处理大量文件传输时更高效,因为它直接处理SSH协议。相比之下,pexpect在某些情况下可能因为依赖终端输出的文本匹配而效率较低。

根据具体使用场景来选择适合的工具是关键。如果任务主要涉及SSH连接,文件传输然后执行远程命令,Paramiko是更好的选择。如果目标是广泛的自动化控制各种命令行交互,而不仅仅是通过SSH,那么pexpect是更合适的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Driftingblues靶机系列Driftingblues5

获取靶机的ip:192.168.108.37 扫描靶机的端口服务: 看到web服务和ssh服务: 先查看一下web服务: 扫描到web服务的信息: 访问web服务: 在源代码中并没有看到有什么新的信息,扫描一下靶机目录:…

vue地址选择器-三级联选择器+详细地址

在页面的显示情况 前端拼接实现存储 具体实现步骤 1.安装中国全省市区的数据 在命令提示符窗口使用管理员身份进入对应vue项目的文件夹,在窗口安装 npm install element-china-area-data -S2.在script内引入安装的数据 import {regionData,codeToText } from…

从Flutter范儿的单例来看Dart的构造函数

点击上方蓝字关注我,知识会给你力量 单例模式 单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotl…

某盾BLACKBOX逆向关键点

需要准备的东西: 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取,每次页面刷新,混淆的代码都会变,这是正常,以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…

Win10/11共享文件夹,访问提示需要输入用户名密码

Win10/11共享文件夹,访问提示需要输入用户名密码 问题 已经关闭了密码保护共享,但是局域网其他电脑访问该文件夹,提示需要输入用户名和密码 解决方法 操作步骤 1.按WINR键打开运行,输入gpedit.msc打开本地组策略编辑器 2.按如…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 (1)白鲸优化算法BWO 参考文献:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. (2)龙格-库塔优化…

【Android学习】简单的登录页面和业务逻辑实现

实现功能 1 登录页&#xff1a;密码登录和验证码登录 2 忘记密码页&#xff1a;修改密码 3 页面基础逻辑 java代码 基础页面 XML login_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.and…

Agent AI:智能代理的未来

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦 &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无不言&#xff0c;言无不尽。 目录 一、Agent AI的起源与发展 二、Agent A…

js,JavaScript 对象(2024-05-02)

对象是 JavaScript 的数据类型之一。 对象用于存储键/值&#xff08;名称/值&#xff09;集合。 JavaScript 对象是命名值的集合。 下例创建具有四个键/值属性的 JavaScript 对象&#xff1a; const person {firstName: "Bill",lastName: "Gates",age:…

Linux中的简单操作 ls/tar/pwd/cd/mkdir/touch 等

目录 前言 安装和卸载软件包 ls 查看指定路径下的文件和文件夹 tar 解压缩/压缩命令 pwd 查看当前路径 cd 改变目录 mkdir 创建目录 递归创建 rm rmdir 删除文件或目录 touch 创建文件 ll、echo、重定向符&#xff08;>,>>&#xff09; ll echo 重定向符…

嵌入式C语言高级教程:实现基于STM32的无线远程监控系统

无线远程监控系统可以广泛应用于安防、环境监测等领域&#xff0c;提供实时数据传输和警报功能。本教程将指导您如何在STM32微控制器上实现一个基本的无线远程监控系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;特别适合低功耗应用。开发板…

MySQL数据库实验三

本文承接前面的俩次实验基础上完成&#xff0c;不过实现的都是基础操作的练习 目录 目录 前言 实验目的 实验要求 实验内容及步骤 updata操作 delete操作 alter操作 添加列 删除列 修改列的数据类型 要求实现 实验结果 代码结果 注意事项 思考题 总结 前言 本文是MySQL数据库…

c++11 lambda 捕获,匿名,返回类型后置

lambda就是即写即用的匿名函数&#xff0c;可以用于解决匹配函数参数的问题 int main(int argc,char *argv[]) {vector<int> v{1,2,3,4,5,6,7,8};for_each(v.begin(),v.end(),[](int a){cout<<a;});return 0; } for_each是固定函数&#xff0c;我们需要他但是又没…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

分享5个免费AI一键生成毕业论文的网站

一、引言 对于忙碌的学生来说&#xff0c;毕业论文通常是一项艰巨的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。本文将介绍五个免费的AI工具&#xff0c;它们能够一键帮助你生成毕业论文&#xff0c;让你的学术生…

Linux流程控制

if语句 基本格式 if condition thencommand1 fi 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi if-else语句 格式 if condition thencommand1 command2...commandN elsecommand fi if else- if else if condition1 th…

wordpress忘记后台密码,在数据库中修改回来,然后再修改回去。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1421332.html 我们在做wordpess运维的时候&#xff0c;都会遇到很尴尬的时候&#xff0c;有时候在错误运维中&#xff0c;不知道删除了什么东西&#xff0c;造成wordpress后台不能登录&#xff0c;后台页面也直接失效&am…

Google Chrome浏览器便携增强版 v124.0.6367.61

01 软件介绍 Google Chrome v124.0.6367.61&#xff0c;这一版本经过精心设计&#xff0c;集成了一系列的功能增强和关键补丁&#xff0c;旨在提升用户体验。其中&#xff0c;Chrome引入了便携性数据保存选项&#xff0c;优化了标签页及标签栏的操作机制。此外&#xff0c;它还…

互联网黑话知所多少?

互联网黑话是互联网公司形成的一套带有浓厚互联网行业特色的“非正式语言”。这些黑话通常起源于社交媒体、网络论坛、技术博客以及职场交流中&#xff0c;它们可能是缩写词、行业术语、梗或者其它专业领域的词汇。来盘一盘你常听、常用的互联网黑话都有哪些吧&#xff01;

分布式与一致性协议之ZAB协议(七)

ZAB协议 ZAB协议:如何处理读写请求 你应该有这样的体会&#xff0c;如果你想了解一个网络服务&#xff0c;执行的第一个功能肯定是写操作&#xff0c;然后才会执行读操作。比如&#xff0c;你要了解ZooKeeper&#xff0c;那么肯定会在zkClient.sh命令行中执行写操作(比如crea…
最新文章