基于paramiko模块对服务器进行ssh操作

paramiko 是python三方的ssh模块,通过socket实现了ssh的功能。

安装下载paramiko模块

pip install paramiko

在这里插入图片描述

使用paramiko模块登录Centos7,实现简单的Linux命令操作

import paramiko

# 创建一个ssh的客户端(对象实例化)
ssh = paramiko.SSHClient()
# 创建ssh连接的白名单(实现对服务器访问时,取消询问的效果)
known_hosts = paramiko.AutoAddPolicy()
# 加载白名单到ssh中
ssh.set_missing_host_key_policy(known_hosts)
# 连接我的Centos7服务器
ssh.connect(
    hostname = "10.10.21.73",  # 主机
    port = 22,  # 端口号
    username= "root",  # 用户名
    password= "q1q1q1"  # 密码
)
# 执行命令
stdin,stdout,stderr = ssh.exec_command("ls /")
    # ssh.exec_command() 返回三个类文件对象
    # stdin 是写权限的文件对象,标准输入
    # stdin 是读权限的文件对象,标准输出
    # stderr 是读权限的文件对象,标准错误,特殊的输出

# 查看执行的结果
result = stdout.read().decode()
print(result)
# 关闭连接,释放内存
ssh.close()

在这里插入图片描述

基于面向对象的多线程实现ssh登录

Pyhton 多线程模块threading通过Thread类构建新的线程
Thread类当做提供了run方法用于子类继承重写
当run方法被修改,在线程调用start的时候,会调用run的功能作为线程的功能。

import paramiko
import threading
# 定义一个多线程的paramiko类
class ParamikoThreading(threading.Thread):  # 继承多线程模块的Thread
    def __init__(self,command,host,username,password,port=22):
        self.host = host  # 初始化主机
        self.username = username  # 初始化用户名
        self.password = password  # 初始化密码
        self.port = port  # 初始化端口号
        self.command = command  # 初始化命令代码
        super(ParamikoThreading,self).__init__()  # 继承父类的属性和方法
    # 重写父类中的run方法
    def run(self):
        ssh = paramiko.SSHClient()
        know_host = paramiko.AutoAddPolicy()
        ssh.set_missing_host_key_policy(know_host)
        ssh.connect(
            hostname = self.host,
            port = self.port,
            username = self.username,
            password = self.password
        )
        #执行命令
        stdin,stdout,stderr = ssh.exec_command(self.command)
            #stdin 标准格式的输入,是一个写权限的文件对象
            #stdout 标准格式的输出,是一个读权限的文件对象
            #stderr 标准格式的错误,是一个读权限的文件对象
        print("=================================================")
        print("ip:%s\ncommand:%s\nresult:\n"%(self.host,self.command))
        print("-------------------------------------------------")
        print(stdout.read().decode()) #读出执行的结果
        print("=================================================")

        ssh.close() #关闭连接
if __name__ == "__main__":
    # 存储多个主机(服务器)
    pool = [
        dict(host = "10.10.21.73",username = "root", password = "123"),
        dict(host = "10.10.21.130",username = "root", password = "123")
    ]
    # 执行命令
    command = "ls"
    # 存储线程对象
    t_pool = []
    for host in pool:
        # 根据for循环遍历结果创建线程
        t = ParamikoThreading(
            host = host.get("host","localhost"),
            username = host.get("username","root"),
            password = host.get("password","123"),
            command = command
        )
        # 将创建的线程存储到列表中
        t_pool.append(t)
    # 启动线程
    for t in t_pool:
        t.start()
    # 优先执行自己的线程
    for t in t_pool:
        t.join()

在这里插入图片描述
在这里插入图片描述

交互式编程(实现Centos中类似的画面效果)

import paramiko

# 创建一个ssh的客户端(对象实例化)
ssh = paramiko.SSHClient()
# 创建ssh连接的白名单(实现对服务器访问时,取消询问的效果)
known_hosts = paramiko.AutoAddPolicy()
# 加载白名单到ssh中
ssh.set_missing_host_key_policy(known_hosts)
# 连接我的Centos7服务器
ssh.connect(
    hostname = "10.10.21.73",  # 主机
    port = 22,  # 端口号
    username= "root",  # 用户名
    password= "q1q1q1"  # 密码
)
# 实例化一个terminal
shell = ssh.invoke_shell()
# 命令执行的等待时间
shell.settimeout(1)
# 输入命令并回车(\n作用是使命令生效)
command = input(">>>") + "\n"
# 发送命令
shell.send(command)

# 制定死循环,实现输入输出交互式功能
while True:
    try:
        recv = shell.recv(512).decode()  # 接收返回的信息
        if recv:
            print(recv)
        else:
            continue
    except:
        command = input(">>>") + "\n"
        shell.send(command)

ssh.close()

效果展示:
在这里插入图片描述
在这里插入图片描述

paramiko实现文件的上传和下载

import paramiko

trans = paramiko.Transport(
    sock=(
        "10.10.21.73",22
    )
)

trans.connect(
    username = "root",
    password = "q1q1q1"
)

sftp = paramiko.SFTPClient.from_transport(trans)

# put 上传
# sftp.put("python_paramiko.py","/opt/python.py")

# get 下载
sftp.get("/root/aaa.tar","aaa.tar")

sftp.close()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孜孜孜孜不倦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值