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
paramiko 进阶01(远程连接服务器然后ssh到其它服务器执行命令)
最新推荐文章于 2023-03-09 15:37:27 发布