今天和大家分享一个第三方库paramiko,主要应用场景是在实现自动化操作服务器时使用,模拟我们手动登录服务器、输入cmd命令等操作。最后封装成自己的工具,方便后面调用。

目录

一、安装paramiko 

二、学习paramiko 

三、开始实现

1.首先我们创建SSH类

2.代码展示

四、效果展示

编辑

五、优化

六、结束语


一、安装paramiko 

pip install paramiko

二、学习paramiko 

这里我直接和大家分享需要学习的几个方法

- Transport:这个模块主要用来创建虚拟客户端,比如我们经常用到的putty、finallshell等。在这个模块中有一个特别重要的方法connect,其中包括的参数有:

hostkey=None,
username="",
password=None,
pkey=None,
gss_host=None,
gss_auth=False,
gss_kex=False,
gss_deleg_creds=True,
gss_trust_dns=True,

最主要的还是hostkey,username,password

- SSHClient:这个模块主要是模拟用户创建登录实例,其中最重要的两个方法:set_missing_host_key_policy、exec_command。一个是连接我们刚才创建好的客户端,一个是执行cmd命令,其中exec_command的返回值有三个,stdin、stdout、stderr。分别表示:输入、输出、错误输出。

三、开始实现

1.首先我们创建SSH类

里面存在:

        - 初始化__init__

        - 创建客户端并连接

        - 关闭客户端

        - 执行cmd命令

        - 上传资源

        - 下载资源

2.代码展示

import paramiko
import os
import time


def to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes):
        value = bytes_or_str.decode('utf-8')
    else:
        value = bytes_or_str
    return value


class SSHConnection(object):
    def __init__(self, host_dict):
        self.host = host_dict['host']
        self.port = host_dict['port']
        self.username = host_dict['username']
        self.passwd = host_dict['passwd']
        self.__k = None

    def connect(self):
        transport = paramiko.Transport(self.host, self.port)
        transport.connect(username=self.username, password=self.passwd)
        self.__transport = transport

    def close(self):
        self.__transport.close()

    def run_cmd(self, command):
        """
        执行shell命令,返回字典
        return {'color': 'red', 'res':error}
        return {'color': 'red', 'res':res}
        :param command:
        :return:
        """
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        ssh._transport = self.__transport
        # 执行命令
        stdin, stdout, stderr = ssh.exec_command(command)
        # 获取命令的结果
        res = to_str(stdout.read())
        # 获取错误信息
        error = to_str(stderr.read())
        # 如果有错误信息,返回error
        # 否则返回res
        if error.strip():
            return {'color': 'red', 'res': error}
        else:
            return {'color': 'green', 'res': res}

    def upload(self, local_path, target_path):
        # 连接,上传
        sftp = paramiko.SFTPClient.from_transport(self.__transport)
        # 将xx文件上传至服务器 /xxx/xx
        sftp.put(local_path, target_path, confirm=True)
        print(os.stat(local_path).st_mode)
        # 增加权限
        sftp.chmod(target_path, os.stat(local_path).st_mode)
        sftp.chmod(target_path, 0o755)

    def download(self, target_path, local_path):
        # 连接,下载
        sftp = paramiko.SFTPClient.from_transport(self.__transport)
        # 将xx 下载至服务器 /xx/xxx
        sftp.get(target_path, local_path)

if __name__ == "__main__":
    host_dict = dict(host='43.142.33.58', port=22, username='root', passwd='xxxx')
    ssh = SSHConnection(host_dict)
    ssh.connect()
    cmd1 = "ls -l"
    re1 = ssh.run_cmd(cmd1)
    print(re1['res'])

四、效果展示

手动登录我们的服务器看看是不是这个结果:

python 监控服务资源 python控制服务器_服务器

 成功!!!!

五、优化

此工具算是已经可以实现自动化对服务器进行操控了。但是有一个缺陷可以优化,就是在输入cmd命令的时候是否可以一次性输入多个命令,逐个执行,感兴趣的朋友可以再研究。

六、结束语

paramiko的使用可以方便我们对服务器进行操控,这也就方便了我们在实现自动化的过程中可以更好的、更精确地实现我们的需求。