Python――远程管理脚本(一)

前言:Python初学者。

脚本实现目的:

    通过一台集中控制的服务器管理其他所有服务器。

    主要功能有:远程执行命令、上传文件、获取文件

    此脚本只能实现同时管理一台服务器,批量多进程管理多台服务器需要与另一个脚本配合实现。

脚本思路:

    利用Python的paramiko模块(初步思路来源于Python入门老师Alex)

脚本不足:

    不能实现多个文件或者目录的传输

    执行命令时,当命令中有空格时必须使用 \ 转义,否则会有报错

    以上不足后期慢慢解决,毕竟脚本都是长出来的。

脚本内容:

#!/usr/bin/env python
# coding=UTF-8
#This script is use for host manage
#Create by eleven in 2014-06-01
#Last changed in 2014-06-09

import paramiko as PO
import sys,os,time,socket

help_info='''\
Options:
	cmd		Run command in remote host
	get		Download file from remote host
	put		Upload file to remote host
	host		Remote host ipaddress or hostname
	user		Remote host username
	key		Use ssh-key authentication
	password 	Use password authentication
	null		If use ssh-key,then password is null
	command		Run command
	filename1	Download filename or upload filename
	filename2	Local save filename or remote save filename
Example:
	%s cmd 10.0.0.1 test key null ifconfig
	%s get 10.0.0.1 test password 123 '/etc/network' '/tmp/network'\n ''' %(sys.argv[0],sys.argv[0])

error_info='''\
Usage: \033[31m%s [cmd|get|put] host user [key|password] 'PASSWORD|null' [command|filename1 filename2]\033[0m
Detail: \033[31m%s --help\033[0m\n ''' %(sys.argv[0],sys.argv[0])

if sys.argv[1] == '--help':
	print help_info
	sys.exit()
elif len(sys.argv) < 7:
	print error_info
	sys.exit()

host = sys.argv[2]
user = sys.argv[3]
atype = sys.argv[4]
password=sys.argv[5]
cmd=sys.argv[6]
keyfile=os.path.expanduser("~/.ssh/id_rsa")
mykey=PO.RSAKey.from_private_key_file(keyfile)
ssh=PO.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(PO.AutoAddPolicy())

def ssh_con():
	try:
		if atype == 'key':
			ssh.connect(host,22,user,pkey=mykey,timeout=3)	#authentication of key
		elif atype == 'password':
			ssh.connect(host,22,user,password=password,timeout=3)	#authentication of password
		else:
			print 'Wrong authentication !\n'
	except PO.AuthenticationException:
		print "Use '%s' connect to '%s' authentication fail !\n" %(user,host)	
		sys.exit()
	except:
		print "Use '%s' connect to '%s' fail !\n" %(user,host)	
		sys.exit()
		
	try:
		stdin,stdout,stderr=ssh.exec_command(cmd,timeout=10)
		out=stdout.read()
		errout=stderr.read()
		print '%s:' %host
		if errout:
			print errout
		elif out:
			print out
		else:
			print '\tCommand <%s> exec ok !'%cmd
	except socket.timeout:
		print "Command '%s' exec in '%s' timeout !\n"%(cmd,host)
	finally:
		ssh.close()

def sftp_get():			#get file in remote host
	try:
		t=PO.Transport((host,22))
		getfile=sys.argv[6]	#remote host filename
		localfile=sys.argv[7]	#save in localpath and rename
		if atype == 'key':
			t.connect(username=user,pkey=mykey)
		elif atype == 'password':
			t.connect(username=user,password=password)
		else:
			print 'Wrong authentication !\n'
		sftp = PO.SFTPClient.from_transport(t)
		sftp.get(getfile,localfile)
		print 'Host is: %s\nGetfile_Name is: %s\nLocalfile_Name is: %s\n' %(host,getfile,localfile)
	except socket.error:
		print "Can not connect to '%s'\n " %host
	except PO.AuthenticationException:
		print "Use '%s' connect to '%s' authentication fail !\n" %(user,host)	
	except IOError:
		print "Remote file '%s' does not exist !\n"%getfile
	finally:
		ssh.close()
		#t.close()

def sftp_put():			#put file to remote host
	try:
		t=PO.Transport((host,22))
		putfile=sys.argv[6]	#local file name
		remotefile=sys.argv[7]	#put in remote host path and rename
		if atype == 'key':
			t.connect(username=user,pkey=mykey)
		elif atype == 'password':
			t.connect(username=user,password=password)
		else:
			print 'Wrong authentication !\n'
		sftp = PO.SFTPClient.from_transport(t)
		sftp.put(putfile,remotefile)
		print 'Host is: %s\nPutfile_Name is: %s\nRemotefile_Name is: %s\n' %(host,putfile,remotefile)
	except socket.error:
		print "Can not connect to '%s'\n" %host
	except PO.AuthenticationException:
		print "Use '%s' connect to '%s' authentication fail !\n" %(user,host)	
	except OSError:
		print "Local file '%s' does not exist !\n"%putfile
	except IOError:
		print "Put file '%s' error,Maybe remote server permission denied !\n"%putfile
	finally:
		ssh.close()
		#t.close()

action=sys.argv[1]
if action == 'cmd':
	if len(sys.argv) == 7:
		ssh_con()
	else:
		print error_info
elif action == 'get':
	if len(sys.argv) == 8:
		sftp_get()
	else:
		print error_info
elif action == 'put':
	if len(sys.argv) == 8:
		sftp_put()
	else:
		print error_info
else:
	print 'Wrong action !\n'

   


你可能感兴趣的:(linux,python,paramiko)