python paramikoマルチスレッドリモート実行コマンド、マルチスレッドリモートアップロードファイル、マルチスレッドリモートダウンロードファイルを実現
8415 ワード
python paramikoマルチスレッドリモート実行コマンド、マルチスレッドアップロードファイル、マルチスレッドダウンロードファイルを実現
最近内部のサーバーはテストがあって、いくつかファイルを更新して修正する必要があって、サーバーが比較的に少ないため、以前のいくつかの技術を使いたくなくて、そこで自分でpythonというスクリプトを書いて実現して、基本的な機能は実現することができて、最適化もしていません.もしどんな友达が必要ならば、自分で最適化して、分からないところは一緒に交流することができて、直接コードに行きます
ここのユーザーは私の判断を入力して完璧ではありませんて、数字かどうかを判断して、入力が空いているかどうかを判断して、私はすべてしていませんて、これらは比較的に簡単で、私は多く言わないで、いくつかの友达を助けることができることを望みます
最近内部のサーバーはテストがあって、いくつかファイルを更新して修正する必要があって、サーバーが比較的に少ないため、以前のいくつかの技術を使いたくなくて、そこで自分で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
ここのユーザーは私の判断を入力して完璧ではありませんて、数字かどうかを判断して、入力が空いているかどうかを判断して、私はすべてしていませんて、これらは比較的に簡単で、私は多く言わないで、いくつかの友达を助けることができることを望みます