import sys
import os
import time
import re
import traceback
import threading
import paramiko
class Ssh():
def __init__(self, ip, username, password, port=22, recv_len=96, logfile="ssh.log", timeout=3600):
self.info = {
"ip": ip,
"port": port,
"username": username,
"password": password
}
self.timeout = timeout
self.recv_len = recv_len
self.logfile = logfile
self.logs = self._log()
self.ssh_status = False
self.channel = self.login()
self._keep_alive()
# def log(self, msg, encoding="utf-8"):
# msg = msg.replace("[01;31m[K", "")
# msg = msg.replace("[m[K", "")
# msg = msg.replace("[01;34m", "")
# msg = msg.replace("[0m", "")
# msg = msg.replace("[01;36m", "")
# msg = msg.replace("[1m", "")
# msg = msg.replace("[00m", "")
# msg = msg.replace("[m", "")
# msg = msg.replace("[0m", "")
# if self.logfile == None:
# print(msg)
# else:
# # print(msg)
# with open(self.logfile, mode="a", encoding=encoding) as f:
# # print(msg)
# f.write(msg)
# f.flush()
def _log(self):
f = open(self.logfile,'ab')
return f
def log(self,msg):
self.logs.write(msg)
self.logs.flush()
def _login(self):
trans = paramiko.Transport((self.info["ip"], self.info["port"]))
trans.start_client()
trans.auth_password(
username=self.info["username"], password=self.info["password"])
channel = trans.open_session()
channel.settimeout(self.timeout)
channel.get_pty()
channel.invoke_shell()
self.ssh_status = True
# channel.send("date\n")
time.sleep(1)
self.log(channel.recv(self.recv_len))
# self.log2(channel.recv(self.recv_len))
return channel
def login(self):
for i in range(3):
try:
channel = self._login()
return channel
except:
if i == 2:
print("*****************************登录失败********************************")
traceback.print_exc()
sys.exit(0)
time.sleep(10)
def logout(self):
self.excute_cmd("exit")
self.channel.close()
self.logs.close()
sys.exit(0)
def excute_cmd(self, cmd, timer=0.5, encoding="utf-8"):
if self.channel.closed:
for i in range(10):
if self.channel.closed:
try:
self.channel = self._login()
break
except:
if i == 9:
traceback.print_exc()
sys.exit(0)
time.sleep(1)
cmd = cmd + "\r"
self.channel.send(cmd)
time.sleep(timer)
res_bin = b""
i = 0
while True:
if not self.channel.recv_ready():
i = i + 1
if i < 11:
time.sleep(0.05)
continue
else:
break
res_bin_tmp = self.channel.recv(self.recv_len)
self.log(res_bin_tmp)
res_bin = b"".join([res_bin,res_bin_tmp])
res = res_bin.decode(encoding)
return res
def _alive(self):
while True:
if self.channel.closed:
try:
self.channel = self._login()
except:
pass
def _keep_alive(self):
t = threading.Thread(target=self._alive)
t.setDaemon(True)
t.start()
def ssh_login(ssher, hostip, username, password, port=22):
res_list = [
"(yes/no", "yes or no", "password", "Password", "@@@@"
]
if checkhost(ssher,hostip):
print("**********************当前就是目标环境{},不需要登陆***************************".format(hostip))
return
while True:
if not checkhost(ssher,ssher.info["ip"]):
ssher.excute_cmd("exit")
else:
break
cmd = "ssh {}@{} -p {}".format(username, hostip, port)
res = ssher.excute_cmd(cmd)
time.sleep(1)
i = 0
while True:
if res_list[0] in res or res_list[1] in res:
res = ssher.excute_cmd("yes")
time.sleep(0.5)
res = ssher.excute_cmd(password)
elif res_list[4] in res:
ssher.excute_cmd("rm -f /root/.ssh/known_hosts")
time.sleep(0.5)
res = ssher.excute_cmd(cmd)
time.sleep(0.5)
elif res_list[2] in res or res_list[3] in res:
res = ssher.excute_cmd(password)
time.sleep(1)
# return
if checkhost(ssher, hostip):
return
else:
res = ssher.excute_cmd(cmd)
else:
i += 1
if i < 3:
time.sleep(0.05)
continue
else:
return
def ssh_exit(ssher):
if checkhost(ssher,ssher.info["ip"]):
return
ssher.excute_cmd("exit")
def checkhost(ssher, ip):
cmd = "ip addr show | grep {}".format(ip)
res = ssher.excute_cmd(cmd)
if res.count(ip) > 1:
print("*************************OK*****************************")
return True
else:
print("*************************NO*****************************")
return False
def shutdown_vm(ssher, hostip,username,password,port=22):
if hostip == ssher.info["ip"]:
print("host机关机需要60s")
ssher.excute_cmd("shutdown -h 1")
return
ssh_login(ssher,hostip,username,password,port)
ssher.excute_cmd("shutdown now")
if __name__ == "__main__":
ip = "192.168.192.128"
username = "root"
password = "root"
ssher = Ssh(ip, username, password, logfile="ssh.log")
ssher.excute_cmd("top")
ssher.excute_cmd("\x03") #ctrl + c
ssher.logout()