Python中paramiko模块的基础操作与排错问题

目录
  • 关于
  • 应用
  • 安装
  • 示例
    • 1.秘钥登陆
    • 2.单个命令执行
    • 3.执行多个命令
    • 4.SFTPClient下载文件
    • 5.上传文件
    • 6.ssh工具封装
  • 补充
  • 学习参考

关于

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.单个命令执行

创建一个.py文件,引入 paramiko模块

import paramiko
  1. 建立SSHClient对象
ssh = paramiko.SSHClient()
  1. 设置可信任,将主机加到host_allow列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  1. 创建连接
ssh.connect("150.158.16.123", 22, "wuyanping", "2022")
  1. 创建命令,发送并获取响应结果
 stdin, stdout, stderr = ssh.exec_command("ls /home")
    print(stdout.read().decode("utf-8"))
  1. 关闭连接
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学习之paramiko模块的基础操作与排错的文章就介绍到这了,更多相关Python paramiko模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题

    Python - paramiko 模块远程执行ssh 命令 nohup 不生效的问题解决 1.使用 paramiko 模块ssh 登陆到 linux 执行nohup命令不生效 # 执行命令 def command(ssh_config, cmd, result_print=None, nohup=False): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.con

  • Python操作远程服务器 paramiko模块详细介绍

    前言 paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是python自带的标准库,需要自行下载安装,建议使用pip自动安装.方法如下: (1)配置pip命令和镜像源路径.如果已配置,跳过. (2)执行pip install paramiko进行安装.出现successful字样表示安装完成. paramiko常用函数介绍 SSHclient类 (1

  • Python如何使用paramiko模块连接linux

    python程序需要连接linux时,需要使用密码或者秘钥验证以登录os进行命令操作或者文件传输,python中实现此功能的模块为paramiko;下面是该模块的基础用法 下面是通过密码进行linux登录执行命令和文件传输示例 import paramiko #python程序需要批量管理linux时需要借助paramilo模块登录linux执行命令或者传输文件,下面是最简单的登录主机执行命令 ssh_client = paramiko.SSHClient() #创建连接对象 ssh_clien

  • 使用Python paramiko模块利用多线程实现ssh并发执行操作

    1.paramiko概述 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作. 由于paramiko属于第三方库,所以需要使用如下命令先行安装 2.安装paramiko pip install paramiko 3.常用方法 connect():实现远程服务器的

  • Python paramiko模块的使用示例

    paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 1 基于用户名和密码的 sshclient 方式登录 # 建立一个sshclient对象 ssh = paramiko.SSHClient() # 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 调用c

  • Python Paramiko模块的使用实际案例

    本文研究的主要是Python Paramiko模块的使用的实例,具体如下. Windows下有很多非常好的SSH客户端,比如Putty.在python的世界里,你可以使用原始套接字和一些加密函数创建自己的SSH客户端或服务端,但如果有现成的模块,为什么还要自己实现呢.使用Paramiko库中的PyCrypto能够让你轻松使用SSH2协议. Paramiko的安装方法网上有很多这样的帖子,这里就不描述了.这里主要讲如何使用它.Paramiko实现SSH2不外乎从两个角度实现:SSH客户端与服务端.

  • Python paramiko模块使用解析(实现ssh)

    开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 安装paramiko模块 pip3 install paramiko 基于用户密码方式 import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.con

  • Python中paramiko模块的基础操作与排错问题

    目录 关于 应用 安装 示例 1.秘钥登陆 2.单个命令执行 3.执行多个命令 4.SFTPClient下载文件 5.上传文件 6.ssh工具封装 补充 学习参考 关于 python的ssh库操作需要引入一个远程控制的模块——paramiko,可用于对远程服务器进行命令或文件操作. 应用 登陆服务器,问题排查.可用于编写脚本,在服务器上做一些繁琐的重复操作. 安装 打开cmd,输入命令python -m pip install paramiko 示例 1.秘钥登陆 配置免密登录,linux上信任

  • Python 中包/模块的 `import` 操作代码

    用实例来说明 import 的作用吧. 创建以下包结构.一个文件夹 cookFish/,下面包含两个文件, __init__.py和cookBook.py. 为什么取这几个名字呢?假设我想用 Python 去做和鱼相关的菜,这件事情很复杂,所以我给它创建了一个包,名叫cookFish, 既然是包,在它下面必须得创建一个文件__init__.py.烧鱼必备条件之一就是菜谱,所以接着创建了 cookBook.py.这几个文件对我们这次来说就足够了,所以就没有再创建其他文件了. cookFish/ _

  • 浅谈Python中os模块及shutil模块的常规操作

    如下所示: #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以字母顺序. 它不包括 '.' 和'..' 即使它在文件夹中. #只支持在 Unix, Windows 下使用 import os, sys # 打开文件 path=r'C:\Users\Administrator.SKY-20180518VHY\Desktop\rx\ore' dirs = os.listdir( path ) print(dirs) # 输出所有文件和文件夹 for fil

  • Python中os模块的简单使用及重命名操作

    前言 OS模块虽然基础的时候已经学过了,但是谁让本人属于那种不用立马就忘的人呢,所以在在下爬取某个不可名状的男人都喜欢的网站的时候,在遇到爬取下来的数据需要保存的时候,就需要用到OS模块了 OS模块基础回顾 先回顾一下基础 OS模块用于操作文件夹(基于我的理解) import os os.mkdir("path") # 创建该路径 然后,基础就没了,对的,我学基础OS模块的时候,就学了个这个,在当时来看,还是够用的啦 OS模块小应用 这下面就是本人在写爬虫小程序的时候用到的啦 1. 保

  • python中argparse模块基础及使用步骤

    目录 argparse模块用法 一. 概念 二. 基础 1. 使用步骤 1.1 总步骤 1.2 创建对象 1.3 添加参数 1.4 解析参数 三. 使用案例 argparse模块用法 一. 概念 argsparse是python的命令行解析的标准模块,内置于python,不需要安装.这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行. 官方文档的位置:[https://docs.python.org/zh-cn/3/library/argparse.html] 在这里我们利用git

  • Python使用Paramiko模块编写脚本进行远程服务器操作

    简介: paramiko是python(2.2或更高)的模块,遵循SSH2协议实现了安全(加密和认证)连接远程机器. 安装所需软件包: http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.5.tar.gz http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz tar zxvf pycrypto-2.5.tar.gz cd pycrypto-2.5 python se

  • python 使用paramiko模块进行封装,远程操作linux主机的示例代码

    import time import paramiko class HandleParamiko: ''' 定义一个linux处理类 ''' def __init__(self, hostname, password, port=22, username='root'): ''' 构造器 :param hostname: 主机ip,type:str :param password: 密码,type:str :param port: 端口,type:int 默认22 :param username

  • 利用Python中xlwt模块操作excel的示例详解

    目录 一.安装 二.创建表格并写入 三.设置单元格样式 四.设置单元格宽度 五.设置单元格背景色 六.设置单元格内容对齐方式 七.单元格添加超链接 八.单元格添加公式 九.单元格中输入日期 十.合并行和列 十一.单元格添加边框 一.安装 pip install xlwt 二.创建表格并写入 import xlwt # 创建一个workbook并设置编码 workbook = xlwt.Workbook(encoding = 'utf-8') # 添加sheet worksheet = workb

  • 使用Python中Tkinter模块的Treeview 组件显示ini文件操作

    前言: Tkinter模块的Treeview组件类似于Dev中的treelist控件,但前者还可以当做树控件和表格控件使用,虽然功能可能没有dev和winform控件那么强大,但是在Tkinter中算是比较复杂.用处较多的了. Treeview组件位于ttk模块,该模块自Tk8.5开始引入,如果 Python 未基于 Tk 8.5 编译,只要安装了 Tile 仍可访问本模块.Treeview支持按层次结构展示一组数据项,用excel做了个简单的示意图(如下所示),Treeview 组件左侧可以理

  • python的paramiko模块实现远程控制和传输示例

    本文介绍了python的paramiko模块实现远程控制和传输示例,分享给大家,具体如下: 1 安装 sudo pip install paramiko 2 ssh实现远程控制 #LINUX下执行shell ssh username@ip #输入密码后就可以对远程机器进行操作 ssh username@ip command #输入密码后远程机器就执行command ssh运行后,想退出,可以kill掉ssh进程. 3 paramiko实现ssh import paramiko hostname

随机推荐