paramiko 进阶01(远程连接服务器然后ssh到其它服务器执行命令)

import re
import time
import traceback
import logging
import paramiko

server01_ip = "192.168.1.1"
server01_port = "6666"
server01_username = "root"
server01_password = "root"
server02_ip = "192.168.1.2"
server02_username = "root"
server02_password = "root"


# ssh到server01
def connect_to_server01(server01_ip , port, server01_password, server01_username="root"):
    action = "connect to server01"
    trans, channel = "", ""
    try:
        trans = paramiko.Transport((server01_ip , int(server01_port)))
        trans.start_client()
        trans.auth_password(username=server01_username, password=server01_password)
        channel = trans.open_session(timeout=30)
        channel.get_pty()
        channel.invoke_shell()
        return channel
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        channel.close()
        trans.close()
        raise Exception(msg)


# 通过server01连接到server02
def connect_to_server02(server02_ip, server02_password, server02_username="root"):
    action = "connect to server02"
    channel = connect_to_server01(server01_ip, server01_port, server01_password, server01_username)
    try:
        ssh_cmd = "ssh root@%s\n" %server02_ip
        index = 1
        while index <= 5:
            channel.send(ssh_cmd)
            time.sleep(3)
            ret = channel.recv(65535).decode("utf-8")
            index += 1
            if not re.search("%s@%s's password:" %(server02_username, server02_ip), ret):
                msg = "%s execute [ %s ] failed: %s" % (action, ssh_cmd, ret)
                logging.error(msg)
                continue
            else:
                password_cmd = "%s\n" % server02_password
                channel.send(password_cmd)
                time.sleep(2)
                ret = channel.recv(65535).decode("utf-8")
                server02_hostname =  "需判断是否登录成功"
                if not ret.find(server02_hostname):
                    msg = "%s execute [ %s ] failed: %s" % (action, password_cmd, ret)
                    logging.error(msg)
                    return  None
                msg = "%s success" %action
                logging.info(msg)
                break
        return channel
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        channel.close()
        raise Exception(msg)


# 关闭server02的防火墙
def stop_server02_firewalld(channel):
    action = "stop server02 firewalld"
    try:
        channel.send("systemctl status firewalld\n")
        time.sleep(2)
        ret = channel.recv(65535).decode("utf-8")
        if ret.find("inactive (dead)") != -1:
            channel.send("systemctl stop firewalld\n")
            time.sleep(1)
            channel.recv(65535).decode("utf-8")
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        channel.close()
        raise Exception(msg)


# 判断server02机器上进程是否存在
def check_process_exists(channel, keyword=None, port=None):
    action = "check process exists [%s]" % keyword
    try:
        if keyword is not None:
            grep_cmd = "ps -aux |grep '%s' |grep -v grep | wc -l\n" % keyword
        else:
            grep_cmd = "netstat -nlp |grep %s |grep -v grep| wc -l\n" %port
        channel.send(grep_cmd)
        time.sleep(2)
        ret = channel.recv(65535).decode("utf-8")
        if ret.find("\r\n1\r\n") != -1:
            msg = "%s execute [ %s ] result: %s" % (action, grep_cmd, ret)
            logging.info(msg)
            return True
        else:
            return False
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        channel.close()
        raise Exception(msg)


#  kill掉server02机器上的进程
def kill_process(channel, keyword=None, port=None):
    action = "kill process"
    try:
        if keyword is not None:
            kill_cmd = "ps -aux |grep '%s' |grep -v grep |awk '{print $2}' | xargs kill -9 \n" %keyword
        else:
            kill_cmd = "netstat -nlp |grep %s |grep -v grep |awk '{print $2}' | xargs kill -9 \n" %port
        channel.send(kill_cmd)
        time.sleep(2)
        ret = channel.recv(65535).decode("utf-8")
        msg = "%s execute [ %s ] result: %s" % (action, kill_cmd, ret)
        logging.info(msg)
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        channel.close()
        raise Exception(msg)


# 从server01机器拷贝文件至server02
def scp_file_to_server02(server01_channel, server02_ip, source, destination):
    action = "scp file to server02"
    try:
        scp_yum_cmd = "scp %s root@%s:%s\n" % (source, server02_ip, destination)
        server01_channel.send(scp_yum_cmd)
        time.sleep(2)
        ret = server01_channel.recv(65535).decode("utf-8")
        if ret.find("root@%s's password:" % server02_ip) == -1:
            return None
        server01_channel.send(server02_password + "\n")
        index = 1
        while True:
            time.sleep(3)
            ret = server01_channel.recv(65535).decode("utf-8")
            if ret.find("100%") != -1:
                msg = "%s execute [ %s ] result: success" % (action, scp_yum_cmd)
                logging.info(msg)
                return True
            elif index > 10:
                msg = "%s execute [ %s ] result: failed" % (action, scp_yum_cmd)
                logging.error(msg)
                return False
            index += 1
    except Exception as e:
        msg = "%s failed with unknown error:%s\n%s" % (action, traceback.format_exc(), e)
        logging.error(msg)
        server01_channel.close()
        raise Exception(msg)


# 安装httpd至server02机器(拷包方式手动安装)
def install_httpd_to_server02(server02_ip, server02_password):
    action = "install httpd to server02"
    channel = connect_to_server02(server02_ip, server02_password)
    channel_server01 = connect_to_server01(server01_ip, server01_port, server01_password, server01_username)
    ret = scp_file_to_server02(channel_server01, server02_ip, "/root/tools/httpd.tar", "/root/")
    if ret == False: return False
    index = 1
    while True:
        # 解压
        tar_cmd = "tar -xvf /root/httpd.tar\n"
        channel.send(tar_cmd)
        time.sleep(1)
        channel.recv(65535).decode("utf-8")
        # 安装并判断httpd是否启动
        install_cmd = "cd /root/httpd && sh install.sh\n"
        channel.send(install_cmd)
        time.sleep(5)
        ret = channel.recv(65535).decode("utf-8")
        index += 1
        if ret.find("active (running)") != -1:
            msg = "%s execute [ %s ] result: httpd install and start success" % (action, install_cmd)
            logging.info(msg)
            return True
        elif index > 3:
            msg = "%s execute [ %s ] result: httpd install and start failed\n%s" % (action, install_cmd, ret)
            logging.error(msg)
            return False


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值