#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2019-12-13 16:35:33
# @Author : Zhongyi Qiao
# @Link : ${link}
# @Version : $Id$
import sys,os,getopt
import paramiko
import threading
import configparser
from scp import SCPClient
def getConnection(ip,username,password,command,port=22,local_filename="",remotepath="",remote_filename="",localpath=""):
"""
:param ip: 服务器的ip
:param username: 服务器的用户名称
:param password: 服务器的密码
:param CMD: 服务器的命令
:param port: 服务器的端口
"""
ssh = paramiko.SSHClient()
policy = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(policy)
ssh.connect(
hostname = ip, # 服务器的ip
port = port, # 服务器的端口
username = username, # 服务器的用户名
password = password # 用户名对应的密码
)
#传输文件
if command:
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read().decode()
error = stderr.read().decode()
print("+++++++++++++++++++++++start++++++++++++++++++++")
print("[connect success] | ip : %s" % ip)
print("result: \n %s"%result)
if error != " ":
print("error: \n %s"%error)
print("+++++++++++++++++++++++done++++++++++++++++++++")
if all([local_filename,remotepath]):
scpclient=SCPClient(ssh.get_transport(), socket_timeout=15.0)
scpclient.put(local_filename, remotepath)
if all([remote_filename,localpath]):
scpclient=SCPClient(ssh.get_transport(), socket_timeout=15.0)
scpclient.get(remote_filename,localpath)
ssh.close()
#读取配置文件
def read_conf(config):
cf = configparser.ConfigParser()
filename = cf.read(config)
opt = cf.options("hosts")
host_list = []
for ooo in opt:
tmp_host = cf.get("hosts",ooo)
host_list.append(tmp_host.split(","))
return host_list
#采用多线程
def multi_thread(thread_target,args_lists):
thread_list = []
for args_tuple in args_lists:
#args_tuple=[(ip.strip(),username.strip(),password.strip(),command,"local_filename=","remote_filename=","remote_filename=","localpath=")]
thread = threading.Thread(target = thread_target, args = args_tuple)
thread_list.append(thread)
for tmp_argv in thread_list:
tmp_argv.start()
for tmp_argv in thread_list:
tmp_argv.join()
def main():
#初始化参数
ip=""
username=""
password=""
config=""
conf=""
command=""
local_filename=""
remotepath=""
remote_filename=""
localpath=""
#获取外参
opts,args = getopt.getopt(sys.argv[1:], "hH:U:P:f:c:p:u:g:d:", ["help","host=","username","password","conf","command","local_filename","remotepath","remote_filename","localpath"])
for o,a in opts:
if o in ("-h", "--help") or not o:
print ('Usage:python3 remote_cmd.py [options]... ')
print ("""Script supports remote command execution, file upload and file download
The script supports remote command execution, file upload and file download;
the host can be a target or multiple hosts;
the single host uses the - H IP - U username - P password parameter;
the multiple hosts use the format of the configuration file host.ini;
the content of the host.ini file takes [host] as the first line,
the second line uses the format of id = IP, username, passwd.
Examples are as follows:
-H :host ip -H 192.168.11.11
-U :-U uername
-P :-P passwd
-f :config file host.ini配置如下
[hosts]
###hostname=ip,username,password
1 = 192.168.152.131,root,123456
2 = 192.168.152.132,autotest,123456
3 = 192.168.152.133,root,123456
4 = 192.168.152.134,root,123456
-c :command -c 'ls ~/'
-p :local filename -u :remote path
-g :remote filename -d :local path
Usage :python3 remote_cmd.py -f /home/host.ini -c 'pwd' #remote hosts execute command , the list of host in the host.ini
python3 remote_cmd.py -f /home/conf/host.ini -p test.py -u /home/autotest ##Upload files to remote host
python3 remote_cmd.py -H '192.168.152.131' -U 'autotest' -P 'qia' -g ~/Videos.tar -d /home/autotest/test/ ###get remote file download /home/autotest/tests
python3 remote_cmd.py -H '192.168.152.131' -U 'autotest' -P 'qia' -c 'pwd' ##remotehost execute command
""")
sys.exit()
if o in ("-H","--host"):
ip=a
# print(ip)
if o in ("-U","--username"):
username=a
# print(username)
if o in ("-P","--password"):
password=a
# print(password)
if o in ("-f","--conf"):
config=a
#print(config)
if o in ("-c","--command"):
command=a
#print(command)
if o in ("-p","--local_filename"):
local_filename=a
# print(local_filename)
if o in ("-u","--remotepath"):
remotepath=a
# print(remotepath)
if o in ("-g","--remote_filename"):
remote_filename=a
#print(remote_filename)
if o in ("-d","--localpath"):
localpath=a
# print(localpath)
#判断是读参数还是读配置文件
host_list=[]
if all([ip,username,password]) and not config:
host_list=[(ip,username,password)]
elif config:
host_list=read_conf(config)
args_lists=[]
if not host_list:
print("Usage:python3 remote_cmd.py -h")
for ip,username,password in host_list:
args_lists.append([ip.strip(),username.strip(),password.strip(),command,22,local_filename,remotepath,remote_filename,localpath])
multi_thread(getConnection,args_lists)
if __name__ == "__main__":
main()