您的位置:首页 > 编程语言 > Python开发

python paramiko实现多线程远程执行命令、多线程远程上传文件、多线程远程下载文件

2014-01-06 11:05 1136 查看
python paramiko实现多线程远程执行命令、多线程上传文件、多线程下载文件 最近内部服务器有在测试,需要更新一些和修改些文件,因为服务器比较少,不想使用以前的一些技术,于是就自己写一个python这个脚本去实现,基本功能可以实现,也没有做优化,如果哪些朋友需要的话,自己优化,不懂的地方可以一起交流,直接上代码
# coding=utf8
import paramiko,datetime,os,threading
runing = True
class run_cmd(threading.Thread):
def __init__(self,hostname=None,password=None,username=None,port=None,echo_cmd=None):
threading.Thread.__init__(self)
self.hostname=hostname
self.password=password
self.username=username
self.port=port
self.echo_cmd=echo_cmd
self.thread_stop=False
def run(self):
paramiko.util.log_to_file('paramiko.log')
s=paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname = self.hostname,username=self.username, password=self.password)
stdin,stdout,stderr=s.exec_command(self.echo_cmd)
print stdout.read()
s.close()
def stop(self):
self.thread_stop=True
class upload_thread(threading.Thread):
def __init__(self,hostname=None,password=None,username=None,port=None,local_dir=None,remote_dir=None):
threading.Thread.__init__(self)
self.hostname=hostname
self.port=port
self.username=username
self.password=password
self.local_dir=local_dir
self.remote_dir=remote_dir
self.thread_stop=False
def run(self):
try:
t=paramiko.Transport((self.hostname,self.port))
t.connect(username=self.username,password=self.password)
sftp=paramiko.SFTPClient.from_transport(t)
print 'upload file start %s ' % datetime.datetime.now()
for root,dirs,files in os.walk(self.local_dir):
for filespath in files:
local_file = os.path.join(root,filespath)
a = local_file.replace(self.local_dir,remote_dir)
remote_file = os.path.join(self.remote_dir,a)
try:
sftp.put(local_file,remote_file)
except Exception,e:
sftp.mkdir(os.path.split(remote_file)[0])
sftp.put(local_file,remote_file)
print "upload %s to remote %s" % (local_file,remote_file)
for name in dirs:
local_path = os.path.join(root,name)
a = local_path.replace(self.local_dir,remote_dir)
remote_path = os.path.join(self.remote_dir,a)
try:
sftp.mkdir(remote_path)
print "mkdir path %s" % remote_path
except Exception,e:
print e
print 'upload file success %s ' % datetime.datetime.now()
t.close()
except Exception,e:
print e
def stop(self):
self.thread_stop=True
class get_thread(threading.Thread):
def __init__(self,hostname=None,password=None,username=None,port=None,local_dir=None,remote_dir=None):
threading.Thread.__init__(self)
self.hostname=hostname
self.port=port
self.username=username
self.password=password
self.local_dir=local_dir
self.remote_dir=remote_dir
self.thread_stop=False
def run(self):
try:
t=paramiko.Transport((self.hostname,self.port))
t.connect(username=self.username,password=self.password)
sftp=paramiko.SFTPClient.from_transport(t)
print 'get file start %s ' % datetime.datetime.now()
for root,dirs,files in os.walk(self.remote_dir):
for name in dirs:
remote_path = os.path.join(root,name)
a = remote_path.replace(self.remote_dir,local_dir)
local_path = os.path.join(self.local_dir,a)
try:
sftp.mkdir(local_path)
print "mkdir path %s" % local_path
except Exception,e:
print e
for filespath in files:
remote_file = os.path.join(root,filespath)
a = remote_file.replace(self.remote_dir,self.local_dir)
local_file = os.path.join(self.local_dir,a)
try:
sftp.get(remote_file,local_file)
except Exception,e:
sftp.mkdir(os.path.split(local_file)[0])
sftp.get(remote_file,local_file)
print "get %s to remote %s" % (remote_file,local_file)
print 'get file success %s ' % datetime.datetime.now()
t.close()
except Exception,e:
print e
def stop(self):
self.thread_stop=True

while runing:
print  "1 执行cmd命令"
print  "2 上传文件"
print  "3 下载文件"
print  "* quit"
ten = int(raw_input('Enter a number:'))
if type(ten) is not int:
break
else:
if ten == 1:
while runing:
print "1 手动输入命令"
print "*(任意输入) 返回上级目录"
cmd_number = int(raw_input('Enter a number(命令):'))
if cmd_number == 1:
username='root'
password='redhat'
port=22
echo_cmd=raw_input('Enter echo cmd:')
ip=raw_input('enter hostname:')
host=ip.split(' ')
for hostname in host:
cmd_thread=run_cmd(hostname,password,username,port,echo_cmd)
print hostname
cmd_thread.start()
cmd_thread.stop()
if (cmd_thread.isAlive()):
cmd_thread.join()
else:
break
elif ten == 2:
while runing:
print "1 上传文件"
print "*(任意输入) 返回上级目录"
file_put = int(raw_input('Enter a number(上传文件):'))
if file_put == 1:
local_dir = raw_input('enter 源路径 :')
remote_dir = raw_input('enter 目录路径:')
host = []
ip=raw_input('enter hostname:')
host=ip.split(' ')
username='root'
password='redhat'
port=22
for hostname in host:
print hostname
uploadthread=upload_thread(hostname,password,username,port,local_dir,remote_dir)
uploadthread.start()
uploadthread.stop()

if (uploadthread.isAlive()):
uploadthread.join()

else:
break
elif ten == 3:
while runing:
print "1 下载文件"
print "*(任意输入) 返回上级目录"
file_get = int(raw_input('Enter a number(下载文件):'))
if file_get == 1:
username='root'
password='redhat'
port=22
remote_dir= raw_input('enter 服务器的路径 :')
local_dir= raw_input('enter 本地的路径:')
hostname=raw_input('enter请输入其中一台服务器地址即可:')
getthread=get_thread(hostname,password,username,port,local_dir,remote_dir)
getthread.start()
getthread.stop()
if (getthread.isAlive()):
getthread.join()
else:
break
else:
break
这里的用户输入我作的判断不是很完美,判断是否是数字,是否输入空的,我都没有做,这些就比较简单,我就不多说了,希望能帮助到一些朋友
本文出自 “游造技术博客” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐