iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何在python中使用paramiko第三方库
  • 442
分享到

如何在python中使用paramiko第三方库

2023-06-06 10:06:26 442人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这期内容当中小编将会给大家带来有关如何在python中使用paramiko第三方库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性

这期内容当中小编将会给大家带来有关如何在python中使用paramiko第三方库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Python是什么意思

Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。

三种常用方式

paramiko 的三种常用方式如下:

  • 使用密码进行登录

  • 使用密钥免密码登录

  • SFTP 传输文件

其中最割裂的就是SFTP 传输文件,很多文章登陆使用sshClient类,传输文件使用Transport类,我也是这样用了很长时间。

如果你也是这么用的,你没有啥想法吗?用python就是节约心智,怎么一个变形还能出来两种东西呢,没有办法统一吗?

网上的统一就是实例化Transport类然后实例化SSHClient类,再把实例化的Transport类添加到实例化SSHClient类。总是有一种别扭的感觉。

重点:查看源码可以发现,SSHClient类直接提供了 SFTP 传输文件的实例化方法,直接用就行了,世界顿时清爽了很多

使用密码进行登录

import paramikohostname = 'localhost'port = 22username = 'aaron'# 看密码就知道我是用的redhat系linux系统passWord = 'redhat'# 实例化SSHClient类ssh = paramiko.SSHClient()# 远程主机没有本地密钥时的处理规则,主要有三个# AutoAddPolicy:直接建立连接,不进行yes/no的确认# WarningPolicy:直接建立连接,但是会提示是新连接# RejectPolicy:拒绝未知的连接,依赖系统密钥的信息。默认选项。ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到服务器ssh.connect(hostname, port, username, password)# 执行命令,获取标准输入、标准输出、标准错误输出,均为流式输入输出# 函数原型为 exec_command(self, command, bufsize=-1, timeout=None, get_pty=False, environment=None, )# 理论上可以通过标准输入,也就是下面的额stdin变量完成连续输入# 同时参数中有布尔型参数 get_pty 可以指定是否获取 tty 通道,这样阻塞输入,比如sudo输入密码什么的都能做。貌似就可以做成你想要的任何东西。# 但是以上两点没有验证,貌似比较麻烦,我太懒了-_-|||## 另外,exec_command方法每次都是新开一个通道执行命令,执行完成后状态消失。SSHClient类还提供一个invoke_shell方法,这个方法可以连续输入命令。# 这两个的区别主要是 invoke_shell使用SSH shell通道,而exec_command使用SSH exec通道。# shell通道就是常用的终端软件登陆的通道,登陆变量都会进行加载比如 ~/bashrc 等# 而 exec通道 则不进行加载登陆文件,相当于linux桌面系统上右键开terminal一样。# 如果你还是不懂,没关系,invoke_shell nb就完事了stdin, stdout, stderr = ssh.exec_command('df')# 打印输出print(stdout.read().decode())# 不要忘记关闭连接ssh.close()

使用密钥免密码登录

这里使用密钥文件,但是为了一般情况,我给密钥文件设置了密码,如果你只是想免密码,不设置密码即可.

在客户机上生成密钥对,将公钥传递给服务器

ssh-keygen -t rsa # 这里设置密码为redhat_rsa,这里是给密钥设置密码,如果想免密,不设置密码即可ssh-copy-id -i ~/.ssh/id_rsa.pub aaron@localhost
import paramikohostname = 'localhost'port = 22username = 'aaron'# 这里是密钥文件的密码password = 'redhat_rsa'# 密钥文件的位置,可以是列表,paramiko会把列表里文件顺序尝试,登陆上位置private_key_path = '/home/aaron/.ssh/id_rsa'ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 这里网上很多先设置pkey传入,但是直接传文件路径也可以,还简单。# 我使用的和网上不同,另一个版本请自行搜索,资料n多# 如果没有密钥,则不需添加password# look_for_keys默认为True,就是会找你 .ssh 目录下有没有合适的密钥文件# 也就是说如果密钥文件存在,但是你传 key_filename 时传错了,不影响,paramiko已经替你想好了,这才是正经 python 应有的待遇,舒服!ssh.connect(hostname, port, username=username, password=password, key_filename=private_key_path, look_for_keys=False)stdin, stdout, stderr = ssh.exec_command('ip a')print(stdout.read().decode())ssh.close()

SFTP 传输文件

import paramikohostname = 'localhost'port = 22username = 'aaron'password = 'redhat'# 还是SSHClient登陆,以上两种方式都可以。ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname, port, username, password)# 重头戏,直接使用打开方法即可sftp = ssh.open_sftp()# do something# 从这里到下面的ssh.close()为止都是sftp能做的事情,具体能做啥,请看下一个代码段,这里只列举上传(put) 下载(get) 文件,这两个也比较重要# 回调函数,没想到吧,上传下载还能有回调函数# 参数一定,都是传入的两个size,int型数据# size 已传输文件累计大小# file_size 文件总大小def callback(size, file_size): print(f"目前传输文件比例: {size} / {file_size}")# 上传文件,参数都给你们了,看看啥意思就行了# 主要就是这个confirm, 如果定义会检测一下上传到服务器文件大小和本地大小是否一致,默认Falsestat = sftp.put(localpath='/tmp/s.avi', remotepath='/tmp/a.avi', callback=callback, confirm=True)print(stat)# 下载文件,同样参数都给你们了,看看啥意思就行了sftp.get(localpath='/tmp/s.avi', remotepath='/tmp/a.avi', callback=callback)ssh.close()

stfp 能 do 的 something

# 列出当前路径下有什么文件,默认path="."print(sftp.listdir())# 列出当前路径下文件属性,默认path="."attrs = sftp.listdir_attr()print(attrs)print("="*20)# listdir函数就是遍历的每个属性的filenameprint(attrs[0].filename)print(attrs[0].longname)print(attrs[0].st_atime)print(attrs[0].st_mtime)print(attrs[0].st_gid)print(attrs[0].st_uid)print(attrs[0].st_mode)# 就是 listdir_attr 的迭代器版本attrs = sftp.listdir_iter()print("="*20)for i in attrs: print(i.filename) print(i.longname) print(i.st_atime) print(i.st_mtime) print(i.st_gid) print(i.st_uid) print(i.st_mode)# 和内置open用法基本相同,只不过是打开外部文件with sftp.open("a.txt", "w") as f: f.write("aaa")# 删除文件,只能删除文件,删除目录使用rmdir函数。文件不存在则报错。sftp.remove("/home/aaron/a.txt")# 文件改名,类似于movesftp.rename("/home/aaron/as.txt", "/tmp/soon.txt",)# 符合posix标准的改名,没有测试sftp.posix_rename("/home/aaron/as.txt", "/tmp/soon.txt",)# 新建目录sftp.mkdir("/home/aaron/as")# 删除目录,类似rmdir,删除的必须为空目录sftp.rmdir("/home/aaron/as")# 返回单个文件的attr信息,如果是软连接则直接返回真实文件信息stat = sftp.stat("/tmp/soon.txt")print(stat)# 测试和stat差不多,如果是软链接则返回软链接文件信息stat = sftp.lstat("/tmp/soon.txt")print(stat)# 修改权限,权限为八进制数,需要把权限换算为十进制数。比如下面的例子就是权限333sftp.chmod("/tmp/soon.txt", 219)# 修改属主和属组,属主和属组为gid和uid表示。需要有权限。sftp.chown("/tmp/soon.txt", 0, 0)# 设置atime和mtime,如果传入None,则设置为当前时间。否则必须传入两个元素的元组或数组,分别为 (atime, mtime)sftp.utime("/tmp/soon.txt", None)import timesftp.utime("/tmp/soon.txt", (time.time(), time.time()))# 读取软链接指定的目标print(sftp.readlink("/etc/rc.local"))# 读取软连接制定目标的绝对路径print(sftp.nORMalize("/etc/rc.local"))# 切换工作路径。SFTP没有工作路径的概念,但是paramiko进行了模拟。如果设置了路径,所有的相对路径都是根据这个路径来的。如果想要切换回去传入None即可。sftp.chdir("/tmp")# 获取当前的工作路径。如果没有使用chdir切换过,则会返回Noneprint(sftp.getcwd())

terminal demo

自己一直想做一个类似xshell的东西,尤其是Mac本的iterm或者iterm2是啥垃圾,还被吹的不行不行的,是没用过好东西吗。

但是每次执行exec_command都会从家目录开始,无法切换目录,十分不方便。一直没有啥进展,知道遇到了 invoke_shell ,一切看起来都有了些可能。

import timefrom threading import Threadimport paramiko# 接收消息并打印的函数# 返回的消息会分成好几段,如果只是发送命令后直接打印是打印不全的,这里直接循环检测缓冲区,有结果就打印。def recv_and_print(channel): # 定义全局变量,recv_func_flag 此接收函数退出标志,cmd 当前执行命令 global recv_func_flag, cmd while recv_func_flag: # 如果此次命令是exit并且退出完成,则设置退出标志 if cmd == "exit" and channel.exit_status_ready():  # 打印退出状态,为int型数字  print(f"此次退出状态:{channel.recv_exit_status()}")  # 退出标志置为假  recv_func_flag = False # 吐过缓冲区有数据 if channel.recv_ready():  # 接收数据  response = channel.recv(1024).decode().strip()  # 需要注意的是接收的数据会把传入的命令也返回一遍,这里我们只保留自己打在屏幕上的,不要传回的,所以传回的数据如果和命令相同则不打印,略过  if response != cmd:  print(response, end="") print("接收函数退出......")# 定义全局变量recv_func_flag = Truecmd = ""# ssh登陆,老一套东西hostname = 'localhost'port = 22username = 'aaron'password = 'redhat010;'ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname, port, username, password)# 获取invoke_shellinvoke_shell = ssh.invoke_shell()# 接收函数使用另一个线程运行,因为和当前主线程一同退出,所以不需要join方法t = Thread(target=recv_and_print, args=(invoke_shell,))t.start()# 主线程退出标志flag = Truewhile flag: # 输入命令 cmd = input() # 输入命令必须有回车才会执行,这里我发送的是linux命令,\r之后能执行命令,如果系统不同,需要测试\r\n等回车字符 invoke_shell.send(f"{cmd}\r") # 如果命令是exit则退出循环 if cmd == "exit": flag = False# 检测接收函数已经退出,这里停止0.5s是因为退出命令发送给服务器,服务器会返回注销的信息,之后检测接收函数才会完全退出,认为设置了一个等待时间,这个时间因为是本机,设置的相对不长,如果是其他主机,需要根据网络以及超时情况进行设置while recv_func_flag: time.sleep(0.5)# 别忘了关闭sshssh.close()

这个demo直接运行然后输入命令即可,就像是使用terminal直接登陆一样。

ll等定义的alias也是能使用的。

但是双击tab ctrl+c 等没有实现,留待诸君完善吧

这个demo目前还有一些问题。时间原因也懒得解决了,以后用到的时候再深入探究吧。

  • 换行总是有问题,时好时坏,感觉每次发送数据有时命令、结果、信息提示符有时合并发送,有时分开发送,没有啥必然规律。也许和linux发行版有关?和tcp通信有关?目前原因不明(具体现象请自行测试)

  • 显示信息使用了 print(response, end="") 退出时也使用相同的显示命令,到时系统注销的显示信息和函数的提示信息"接收函数退出......"拼接在一起了(对啊,提示信息之前我可以加个回车啊,哎呀,不再测试了,太累了)

  • su命令也可以正常执行,输入密码啥的不影响,但是密码会明文显示。。。。。

  • 接上条,su退出成问题,su退出使用exit,整个函数就退出了。算了,不修复了/-_-\

上述就是小编为大家分享的如何在python中使用paramiko第三方库了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网Python频道。

--结束END--

本文标题: 如何在python中使用paramiko第三方库

本文链接: https://www.lsjlt.com/news/246603.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在python中使用paramiko第三方库
    这期内容当中小编将会给大家带来有关如何在python中使用paramiko第三方库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性...
    99+
    2023-06-06
  • Python第三方库paramiko S
    基于用户名和密码的sshclient方式登录:#!/usr/bin/env python #-*- coding=utf-8 -*- #说明:基于用户名和密码的sshclient方式登录 import paramiko try:     s...
    99+
    2023-01-31
    第三方 Python paramiko
  • python如何调用第三方库
    Python调用第三方库通常需要以下几个步骤:1. 安装第三方库:使用pip工具安装第三方库,比如`pip install requ...
    99+
    2023-10-11
    python
  • 如何在Clion中引入第三方库
    如何在Clion中引入第三方库?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如何配置CMake的所有配置都写在一个叫CMakeLists.txt的文件当中,所有的配置都写在该文...
    99+
    2023-06-06
  • Python第三方库undetected_chromedriver的使用
    undetected_chromedriver是专门针对浏览器识别做出来的拓展 直接使用undetected_chromedriver第三方库 if __name__ == '__m...
    99+
    2023-01-12
    undetected_chromedriver使用 undetected_chromedriver
  • Python的第三方调试库pysnooper​​如何使用
    本篇内容主要讲解“Python的第三方调试库pysnooper如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的第三方调试库pysnooper如何使用”吧!一、背景我们在进行代...
    99+
    2023-07-05
  • 如何安装 Python在的第三方库:curl_cffi
    要安装Python的第三方库 curl_cffi,您可以使用以下步骤: 打开终端(Linux/macOS)或命令提示符(Windows)。 运行以下命令来使用pip安装curl_cffi: pip...
    99+
    2023-10-01
    python 开发语言
  • 如何在pyCharm中下载第三方库
    这篇文章主要介绍如何在pyCharm中下载第三方库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!安装第三方库有俩个方法使用pip命令来进行安装(pip是Python的包管理器。这意味着它是一个工具,允许你安装和管理不...
    99+
    2023-06-14
  • 如何在 Golang 中使用第三方库生成随机数?
    在 go 中生成随机数时,math/rand 标准库提供基本功能。对于更复杂的需求,可以使用第三方库。github.com/bxcodec/faker 提供了生成随机数据的功能,包括:f...
    99+
    2024-05-13
    golang 随机数 git 标准库
  • python如何下载第三方库
    要使用 pip 安装 python 第三方库,请执行以下步骤:如果未安装 pip,请使用 "python3 -m ensurepip --upgrade" 命令安装。使用 "pip in...
    99+
    2024-04-02
  • python如何导入第三方库
    要导入第三方库,首先需要确保已经安装了该库。可以使用pip命令来安装第三方库,例如:```pip install 库名```安装完成...
    99+
    2023-10-10
    python
  • Python中第三方库Faker的使用详解
    目录背景介绍实战:模拟1w条数据写入ExcelPython库讲解1. 生成姓名2. 生成详细地址3. 生成所在省份4. 生成手机号5. 生成身份证号6. 生成出生年月7. 生成邮箱补...
    99+
    2024-04-02
  • python中第三方库pyecharts的使用详解
    与pyecharts有关的两个网站:官方网站:pyecharts - A Python Echarts Plotting Library built with love. ,画廊功能...
    99+
    2024-04-02
  • python在哪安装第三方库
    python 的第三方库安装在用户目录 (~/.local/lib/python3.x/site-packages) 和系统目录 (/usr/local/lib/python3.x/si...
    99+
    2024-04-02
  • Angular-Cli中如何引用第三方库
    这篇文章给大家分享的是有关Angular-Cli中如何引用第三方库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。初试我最初的想法是直接将相对路径写到index.html即可,如下...
    99+
    2024-04-02
  • python第三方库pygame的使用详解
    作用:pygame一般用来做游戏 注意:1.在使用pygame提供的功能之前,需要调用init方法 2.在游戏结束前需要调用 quit 方法 pygame中的各个函数: 1.pyga...
    99+
    2024-04-02
  • Python中如何使用第三方netifaces库获取本机IP地址
    这篇文章主要介绍Python中如何使用第三方netifaces库获取本机IP地址,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用第三方netifaces库获取的是局域网IP。net...
    99+
    2024-04-02
  • Python标准库及第三方库怎么使用
    本篇内容介绍了“Python标准库及第三方库怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、time模块1.time模块简介tim...
    99+
    2023-07-06
  • vscode中如何导入第三方库
    在vscode中导入第三方库的方法:1.打开vscode;2.新建终端;3.安装pip模块;4.使用pip install命令导入第三方库;具体步骤如下:首先,打开vscode软件,进入vscode操作界面;在vscode操作界面中,点击上...
    99+
    2024-04-02
  • github项目中如何引用第三方库
    本文小编为大家详细介绍“github项目中如何引用第三方库”,内容详细,步骤清晰,细节处理妥当,希望这篇“github项目中如何引用第三方库”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Github是全球最大的开...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作