远程执行命令、远程添加信任、远程自动分区挂盘

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import time
import argparse
import datetime
import paramiko

reload(sys)
sys.setdefaultencoding("utf-8")

username = 'root'
password = '123456'

rsa = [
'ssh-rsa1',
'ssh-rsa2 '
]


#change return color
def G(s):
    return "%s[32;2m%s%s[0m"%(chr(27), s, chr(27))
def R(s):
    return "%s[31;2m%s%s[0m"%(chr(27), s, chr(27))
 

def cmd_exc(ip, username, password):
    conn = paramiko.SSHClient()
    conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        conn.connect(hostname = ip, username = username, password = password, timeout = 5)
        stdin, stdout, stderr = conn.exec_command(cmd)
        result = stdout.readlines()
        ret = ''.join(result)
    except:
        print R("无法连接")
    conn.close()
    try:
        return G(ret)
    except UnboundLocalError:
        pass


def copy_rsa(ip, username, password):
    conn = paramiko.SSHClient()
    conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        conn.connect(hostname = ip, username = username, password = password, timeout = 5)
        stdin, stdout, stderr = conn.exec_command("echo '{0}'>>/root/.ssh/authorized_keys;echo '{1}'>>/root/.ssh/authorized_keys".format(rsa[0], rsa[1]))
        result = stdout.readlines()
        ret = ''.join(result)
    except:
        print R("无法连接")
    conn.close()
    try:
        return G(ret)
    except UnboundLocalError:
        pass


def auto_disk(Disk):
    if os.path.exists('./auto_disk.sh'):
        os.remove('./auto_disk.sh') 
    with open('auto_disk.sh', 'a') as f:
        print >>f, '#!/bin/bash'
        print >>f, 'rpm -aq|grep expect'
        print >>f, 'if [ $? != 0 ];then'
        print >>f, '    yum install -y expect'
        print >>f, 'fi'
        print >>f, '/usr/bin/expect -c"'
        print >>f, 'set timeout -1'
        print >>f, 'spawn  /sbin/fdisk /dev/{0}'.format(Disk)
        print >>f, 'expect \"*m for help*:\"'
        print >>f, 'send -- \"n\r\"' 
        print >>f, 'expect \"*p*\n\"' 
        print >>f, 'send -- \"p\r\"'
        print >>f, 'expect  \"*number (1-4):\"' 
        print >>f, 'send -- \"1\r\"'
        print >>f, 'expect  \"*default 1*:\"'
        print >>f, 'send -- \"\r\"'
        print >>f, 'expect  \"*default*:\"' 
        print >>f, 'send -- \"\r\"'
        print >>f, 'expect  \"*m for help*:\"'
        print >>f, 'send -- \"w\r\"'
        print >>f, 'expect eof'
        print >>f, '"'
        print >>f, 'mkfs.ext4 /dev/{0}1'.format(Disk)
        print >>f, 'echo "/dev/{0}1    /home/    ext4   defaults  0  0" >> /etc/fstab'.format(Disk)
        print >>f, 'mount /dev/{0}1   /home/'.format(Disk)


def sftp_auto(ip, username, password):
    t = paramiko.Transport((ip,22))
    t.connect(username = username, password = password)
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('./auto_disk.sh','/tmp/auto_disk.sh')
    t.close()
    conn = paramiko.SSHClient()
    conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        conn.connect(hostname = ip, username = username, password = password, timeout = 5)
        stdin, stdout, stderr = conn.exec_command('sh /tmp/auto_disk.sh')
        result = stdout.readlines()
        ret = ''.join(result)
    except:
        print R("无法连接")
    conn.close()
    try:
        return G(ret)
    except UnboundLocalError:
        pass
        


if __name__ == "__main__":
    parser=argparse.ArgumentParser(description='ssh_cmd', usage='%(prog)s [options]')
    parser.add_argument('-H','--host', nargs='?', dest='listhost', help='主机/多个主机用","分割')
    parser.add_argument('-f','--file', nargs='?', dest='filehost', help='主机列表文件')
    parser.add_argument('-m','--command', nargs='?', dest='command', help='执行命令')
    parser.add_argument('-I','--init', nargs='?', dest='init', help='自动分区挂盘')
    parser.add_argument('-A','--add', nargs='?', dest='add_rsa', help='添加信任')
    if len(sys.argv)==1:
        parser.print_help()
    else:
        args=parser.parse_args()
        cmd = args.command
        if args.listhost is not None and args.filehost is None: 
            if args.command is not None:
                for ip in args.listhost.split(','):
                    print G(ip) 
                    print G('-'*80)
                    print cmd_exc(ip, username, password)
                    print 
            elif args.init is not None:
                auto_disk(args.init)
                for ip in args.listhost.split(','):
                    print G(ip)
                    print G('-'*80)
                    print sftp_auto(ip, username, password)
                    print
            elif args.add_rsa == 'root':
                for ip in args.listhost.split(','):
                    print G(ip)
                    print G('-'*80)
                    print copy_rsa(ip, username, password)
                    print
            else:
                print R('功能选项为空')
        elif args.listhost is None and args.filehost is not None:
            if args.command is not None:
                try:
                    with open(args.filehost) as f:
                        for ips in f.readlines():
                            ip = ips.replace('\n', '')
                            print G(ip)
                            print G('-'*80)
                            print cmd_exc(ip, username, password)
                            print 
                except IOError:
                    print R('主机列表文件不存在')
            elif args.init is not None:
                auto_disk(args.init)
                for ip in args.listhost.split(','):
                    print G(ip)
                    print G('-'*80)
                    print sftp_auto(ip, username, password)
                    print
            elif args.add_rsa == 'root':
                for ip in args.listhost.split(','):
                    print G(ip)
                    print G('-'*80)
                    print copy_rsa(ip, username, password)
                    print
            else:
                print R('功能选项为空')
        else:
            print R('主机或命令不能为空')


转载于:https://my.oschina.net/honglongwei/blog/670892

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值