python工具箱——远程操作linux

环境要求

需要python的第三方模块:paramiko
注意:该模块的依赖包非常多,并且安装中可能出现各种报错,安装时需要有心理准备~~~

远程操作的核心模块

设如下脚本的名称为REXEC.py:

脚 本 第 11 行 注 意 这 个 端 口 号 和 密 码 ! \color{red}{脚本第11行注意这个端口号和密码!} 11
( 一 般 各 个 团 队 下 的 各 台 服 务 器 的 用 户 名 、 密 码 、 端 口 都 相 同 的 , 所 以 这 里 定 义 了 h o s t d e f a u l t i n f o 这 个 默 认 值 。 以 便 调 用 该 模 块 时 只 用 传 I P 即 可 ) \color{red}{(一般各个团队下的各台服务器的用户名、密码、端口都相同的,所以这里定义了host_default_info这个默认值。以便调用该模块时只用传IP即可)} hostdefaultinfo便IP

#/usr/bin/python
#! -*- coding:utf-8 -*-
# @CreateTime: 2019/9/6 17:19
# @Auth      : WillZhu
# @FileName  : REXEC.py
# @UpdateTime: -

import paramiko


host_default_info = {'port':端口号,'user':'你的用户名','pwd':'你猜你猜'}



def rexec_single(host_msg_dict, command):
    """
    :param host_msg_dict: 某台服务器的授权信息,类型为字典,包含的key有:ip/port/user/pwd.其中后面3个key可缺失,缺失的部分用host_default_info中对应的键值代替
    :param command: 需要在远程服务器上执行的指令
    :return: 返回远程执行结果:  {'status':'执行状态(P成功,E为错误,F为返回内容中有失败信息,)', 'ef_msg':'错误或失败信息', 'result':结果内容}
    """
    #解析远程服务器授权信息

    if type(host_msg_dict) != dict:
        return {'status':'E', 'ef_msg':"""远程服务器登录信息格式错误!\n输入的远程连接权限信息必须为字典格式,如:\n{'ip':'', 'port':'','user':'','pwd':''}\n其中ip键值对必须存在,其余键值对如果不存在,本程序则使用默认值。""", 'result':''}
    if 'ip' not in host_msg_dict.keys():
        return {'status': 'E', 'ef_msg': '远程服务器IP必须输入', 'result':''}

    ip = host_msg_dict['ip']
    port = host_default_info['port'] if 'port' not in host_msg_dict.keys() else host_msg_dict['port']
    user = host_default_info['user'] if 'user' not in host_msg_dict.keys() else host_msg_dict['user']
    pwd  = host_default_info['pwd'] if 'pwd' not in host_msg_dict.keys() else host_msg_dict['pwd']

    #开始远程处理
    try:
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  #防止出现not found in known_hosts
        ssh_client.connect(ip,port,user,pwd)
        std_in, std_out, std_err = ssh_client.exec_command(command)
        get_stdout = str(std_out.read(),encoding='utf-8')
        get_stderr = str(std_err.read(),encoding='utf-8')
        return_msg = [ get_stdout, get_stderr]
        ssh_client.close()
        status = 'F' if return_msg[1] else 'P'
        return {'status':status, 'ef_msg': return_msg[1], 'result':return_msg[0]}
    except Exception as e:
        return {'status': 'E', 'ef_msg':  '[远程操作发生异常]%s'%e, 'result':''}


$\color{blue} {PS:目前只支持单个服务器的远程操作,后续需要使用多线程和队列模块增加一个并行等落多个服务器的方法。} $

调用方法

调用示例test.py:

from REXEC import rexec_single
#host_msg的格式为:{"ip":"", "port":"","user":"","pwd":""},其中ip是必须的,其余key值如果和默认值相同,可不用填
host_msg = {"ip":"10.255.4.17"}
remote_script = "df -h"
res = rexec_single(host_msg, remote_script)
if res['status'] != 'P':
    print(res['ef_msg'])
else:
    print(res['result'])

执行结果:

>>test.py
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              20G  4.0G   15G  21% /
/dev/vdb              153G   22G  123G  16% /data


Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值