• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python 第三方库paramiko的常用方式

python 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论
文章目录[隐藏]

介绍

paramiko是什么可以参考其他人的博客或文章,这里不再赘述,直入正题。

本次测试的版本信息如下:

  • python 3.9
  • paramiko 2.7.2
  • centos 8

三种常用方式

paramiko 的三种常用方式如下:

  • 使用密码进行登录
  • 使用密钥免密码登录
  • SFTP 传输文件

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

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

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

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

使用密码进行登录

import paramiko

hostname = 'localhost'
port = 22
username = '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)

# 执行命令,获取标准输入、标准输出、标准错误输<a style="color:transparent">来@源gao*daima.com搞@代#码网</a>出,均为流式输入输出
# 函数原型为 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 paramiko

hostname = 'localhost'
port = 22
username = '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 paramiko

hostname = 'localhost'
port = 22
username = '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, 如果定义会检测一下上传到服务器文件大小和本地大小是否一致,默认False
stat = 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()

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python 第三方库paramiko的常用方式

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址