Python中paramiko模块的基础操作与排错问题
作者:程序员-小李 发布时间:2023-06-21 04:45:33
关于
python的ssh库操作需要引入一个远程控制的模块——paramiko,可用于对远程服务器进行命令或文件操作。
应用
登陆服务器,问题排查。可用于编写脚本,在服务器上做一些繁琐的重复操作。
安装
打开cmd,输入命令
python -m pip install paramiko
示例
1.秘钥登陆
配置免密登录,linux上信任了windows的公钥,然后脚本在windows上跑,使用windows的私钥就可以直接不要密码登录linux
注意
:提供秘钥的paramiko.RSAKey.from_private_key_file('文件')
,这里面的"文件"是你本机上的秘钥,不是指你被控机上的公钥哦!
import paramiko
key = paramiko.RSAKey.from_private_key_file("C:\\Users\\liyansheng\\.ssh\\id_rsa")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print("connecting")
ssh.connect(hostname="192.168.220.128", username="root", pkey=key)
print("connected")
commands = "uname -a"
stdin, stdout, stderr = ssh.exec_command(commands)
stdin.close()
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result)
ssh.close()
if __name__ == '__main__':
print()
2.单个命令执行
1.创建一个.py
文件,引入 paramiko
模块
import paramiko
2.建立SSHClient
对象
ssh = paramiko.SSHClient()
3.设置可信任,将主机加到host_allow
列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
4.创建连接
ssh.connect("150.158.16.123", 22, "wuyanping", "2022")
5.创建命令,发送并获取响应结果
stdin, stdout, stderr = ssh.exec_command("ls /home")
print(stdout.read().decode("utf-8"))
6.关闭连接
ssh.close()
3.执行多个命令
# 执行多条命令,注意传入的参数有个list
def execMultiCmd(host, user, psw, cmds: list, port=22) -> (str, str):
with paramiko.SSHClient() as ssh_client:
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=host, port=port, username=user, password=psw)
cmd = ";".join(cmds)
_, stdout, stderr = ssh_client.exec_command(cmd, get_pty=True)
result = stdout.read().decode('utf-8')
err = stderr.read().decode('utf-8')
return result, err
if __name__ == '__main__':
cmdList = ["cd /home", "ls"]
print(execMultiCmd("192.168.220.128", "root", "root", cmdList))
4.SFTPClient下载文件
方法封装:
def down_file(host, user, psw, local_file, remote_file, port=22):
with paramiko.Transport((host, port)) as transport:
# 连接服务
transport.connect(username=user, password=psw)
# 获取SFTP示例
sftp = paramiko.SFTPClient.from_transport(transport)
# 下载
sftp.get(remote_file, local_file)
transport.close()
问题:(错误)
if __name__ == '__main__':
down_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download", "/home/test.txt")
Traceback (most recent call last):
File "D:\MyCode2\py-1\ssh\download.py", line 17, in <module>
down_file("192.168.220.128", "root", "root", "D:\\ssh_download", "/home/test.txt")
File "D:\MyCode2\py-1\ssh\download.py", line 11, in down_file
sftp.get(remote_file, local_file)
File "D:\MyCode2\py-1\venv\lib\site-packages\paramiko\sftp_client.py", line 810, in get
with open(localpath, "wb") as fl:
PermissionError: [Errno 13] Permission denied: 'D:\\ssh_download'
正确使用
要指定下载的文件名,不能只是一个目录
if __name__ == '__main__':
down_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download\\test.txt", "/home/test.txt")
5.上传文件
def upload_file(host, user, psw, local_file, remote_file, port=22):
with paramiko.Transport((host, port)) as transport:
# 连接服务
transport.connect(username=user, password=psw)
# 获取SFTP示例
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_file, remote_file)
transport.close()
测试同下载,特别要注意路径问题
。如
if __name__ == '__main__':
upload_file(my_linux.host, my_linux.user, my_linux.psw, "D:\\ssh_download\\test123.txt", "/home/test/test123.txt")
6.ssh工具封装
import os
import paramiko
class SSHTool():
def __init__(self, ip, port, user, psw):
"""
初始化
:param ip:
:param port:
:param user:
:param psw:
"""
self.ip = ip
self.port = port
self.user = user
self.psw = psw
def connect_ssh(self):
"""
创建连接
:return:
"""
try:
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(
hostname=self.ip,
port=self.port,
username=self.user,
password=self.psw
)
except Exception as e:
print(e)
return self.ssh
def close_ssh(self):
"""
关闭连接
:return:
"""
try:
self.ssh.close()
except Exception as e:
print(e)
def exec_shell(self, shell):
ssh = self.connect_ssh()
try:
stdin, stdout, stderr = ssh.exec_command(shell)
return stdin, stdout, stderr
except Exception as e:
print(e)
def sftp_put_file(self, file, local_dir, remote_dir):
try:
t = paramiko.Transport((self.ip, self.port))
t.connect(username=self.user, password=self.psw)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(os.path.join(local_dir, file), remote_dir)
t.close()
except Exception:
print("connect error!")
def sftp_get_file(self, file, local_dir, remote_dir):
try:
t = paramiko.Transport((self.ip, self.port))
t.connect(username=self.user, password=self.psw)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(remote_dir, os.path.join(local_dir, file))
t.close()
except Exception:
print("connect error!")
补充
获取当前文件路径:os.getcwd()
import os
if __name__ == '__main__':
print(os.getcwd()) # D:\MyCode2\py-1\ssh
python函数返回多个参数
def get_strs() -> (str, str):
return "hello", "word"
if __name__ == '__main__':
# 返回值为元祖的形式
print(get_strs()) # ('hello', 'word')
# 获取元祖的个数
print(len(get_strs())) # 2
# 通过下标获取元祖的某一个值
print(get_strs().__getitem__(1)) # word
# 通过元祖的某个元素定位对应的下标
print(get_strs().index("hello")) # 0
with … as …使用
为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在 Python 中,对应的解决方式是使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。简单的理解,同时包含 enter() 和 exit() 方法的对象就是上下文管理器。
格式:
with 表达式 [as target]:
代码块
学习参考
Python]远程SSH库Paramiko简介_alwaysrun的博客-CSDN博客_python ssh库
Python with as用法详解 (biancheng.net)
Python中的with-as用法 - 简书 (jianshu.com)
来源:https://blog.csdn.net/weixin_44107140/article/details/126729548


猜你喜欢
- HTML与CSS在Flash中的应用:不小心看到同事Den在弄个小东西:在Flash里使用HTML和CSS,代码是这样:var m
- 1.安装mysql5.6 docker run mysql:5.6等所有项目都是Download complet 安装完毕5.6: Pull
- 原文:http://blog.rexsong.com/?p=746#comments加速的关键,不是降低重量,而是减少个数。如果重量在200
- 请定义函数,将列表[10, 1, 2, 20, 10, 3, 2, 1, 15, 20, 44, 56, 3, 2, 1]中的重复元素除去,
- 1. 函数式编程概述1.1. 什么是函数式编程?函数式编程使用一系列的函数解决问题。函数仅接受输入并产生输出,不包含任何能影响产生输出的内部
- 本文实例讲述了Python中XlsxWriter模块用法。分享给大家供大家参考,具体如下:XlsxWriter,可以生成excel文件(xl
- 1. 什么是phpDocumentor ? PHPDocumentor 是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具
- 当逐渐在用python开发项目或者日常使用时,一般需要大量使用别人提供的包,这些包能高效的帮助我们快速高效的完成指定任务或者需求,不过有时也
- 工作中,网页设计师经常会遇见这些状况:时间这么短又要出彩、又是要大气要有气氛、风格不明确很难把握、栏目这么多页面又这么长……突然觉得束手无策
- rabbitmq中文翻译的话,主要还是mq字母上:Message Queue,即消息队列的意思。前面还有个rabbit单词,就是兔子的意思,
- 如果我们的web应用有大量的异步请求,而这些异步请求是在web服务器认证的情况下,那当我们请求发生在服务器认证失效下,服务器自动302到登录
- 话说网站首页是用.NET语言写的,而二级栏目页却是用ASP写的,然后再配上众多全手工的静态专题页,整个网站形成了一个大杂烩。想要在这大杂烩中
- 如果说哪个开源程序不需要介绍大家就认识,那一定是phpMyAdmin,一款流行的MySQL数据库的Web管理界面。MySQL是全球最流行的W
- asp判断网址格式是否合法代码 具体实现办法见下列代码:<% function checki
- 异步编程带来的问题在客户端Javascript中并不明显,但随着服务器端Javascript越来越广的被使用,大量的异步IO操作使得该问题变
- 场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来
- 自己搭建后台网站,需求:实现类似django Admin站点对每一张表的增删改查权限控制。实现步骤:1.权限控制Django框架已自带,共6
- 前言python内置了一些非常巧妙而且强大的内置函数,对初学者来说,一般不怎么用到,我也是用了一段时间python之后才发现,哇还有这么好的
- 利用pymongo包进行数据库的连接,使用xlrd包读取excel数据,由于二者数据结构的不同,要将excel格式数据转换为json格式数据
- Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。下载Go语言开发包大家可以在Go语