*仅测试了centos
import paramiko
import threading
import argparse
def do_job(host,username,password,exec_cmd,port):
ssh = paramiko.SSHClient()
key = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(key)
try:
ssh.connect(hostname=host, port=port, username=username, password=password, timeout=10)
stdin, stdout, stderr = ssh.exec_command(exec_cmd)
print('{}: \n {}'.format(host,stdout.read().decode()))
ssh.close
except:
print('{}: \n {}'.format(host,'user_name or password error'))
class MyThread(threading.Thread):
def __init__(self, func, args):
super(MyThread, self).__init__()
self.func = func
self.args = args
def run(self):
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except Exception:
print('Error item: {}'.format(str(self.args)))
return None
def main():
li=[]
parser = argparse.ArgumentParser(description='python3 ./exec_command.py '+ '-f <ip.txt> -u <root> -p <password> -c <commad>')
parser.add_argument('-f', dest='ip_file',
help='ip file location')
parser.add_argument('-u', dest='username',
help='username for the servers')
parser.add_argument('-p', dest='password',
help='password for the servers')
parser.add_argument('-P', nargs = "?", type=int, dest='port', default=22,
help='ssh port')
parser.add_argument('-c', dest='exec_cmd',
help='command')
arguments = parser.parse_args()
#get the value of argument
ip_file = arguments.ip_file
username = arguments.username
password = arguments.password
exec_cmd = arguments.exec_cmd
port = arguments.port
if ip_file == None or username == None or password == None or exec_cmd == None:
print(parser.print_help())
exit(0)
#if 'reboot' or 'restart' in exec_cmd:
# print()
file = open(ip_file)
ip_list = file.readlines()
for host in ip_list:
host= host.rstrip()
t = MyThread(do_job, args=(host,username,password,exec_cmd,port))
li.append(t)
t.start()
print('Begin to login server:')
for t in li:
t.join() # 一定要join,不然主线程比子线程跑的快,会拿不到结果
t.get_result()
if __name__ == "__main__":
main()
网友评论