基於paramiko的檔案批次分發和命令批次執行
在實際工作環境中,有可能需要去運維百臺伺服器,甚至更多。以應用升級為例,對應用做升級操作,首先得停止應用服務,防止新的應用資料寫入,並備份應用部署目錄,然後替換成新的程式碼檔案、配置檔案等。替換完成後,啟動應用服務。但是由於應用伺服器數量過多,如果一臺一臺伺服器去做升級,這會花費很多時間。這時,便可使用paramiko編寫python指令碼,讓這些重複性的操作批次執行,去實現應用升級的自動化。這個小工具實現了在堡壘機模式和非堡機模式的運用。
1.maintool.py(控制整個指令碼的執行),程式碼如下:
maintool.py執行效果如下:
2.operation.py(定義非堡壘機模式下的相關操作),程式碼如下:
3.blhost_operation.py(定義堡壘機模式下的相關操作),程式碼如下:
至此,這個python小工具製作完成。
1.maintool.py(控制整個指令碼的執行),程式碼如下:
點選(此處)摺疊或開啟
-
#!/usr/bin/python
-
#coding:utf-8
-
import sys
-
######指令碼執行操作提示
-
def login():
-
print """\033[1;34m
-
1:批次分發檔案(非堡壘機模式)
-
2:批次執行命令(非堡壘機模式)
-
3:批次下載檔案(非堡壘機模式)
-
4:單臺執行命令(非堡壘機模式)
-
5:批次分發檔案(堡壘機模式)
-
6:批次執行命令(堡壘機模式)
-
7:增加需要伺服器(非堡壘機模式)
-
8:刪除不需要伺服器(非堡壘機模式)
-
9:檢視當前伺服器列表(非堡壘機模式)
-
10:退出\033[0m
-
"""
-
#######定義使用者選擇函式
-
def choice():
-
import operation,blhost_operation
-
while True:
-
choice = raw_input("\033[1;32minput your choice:\033[0m").strip()
-
choice_list = ['1','2','3','4','5','6','7','8','9','10','help','exit']
-
if choice not in choice_list:
-
print "\033[1;33mtry again!\033[0m"
-
continue
-
if choice == '1':
-
operation.SendFile()###非堡機模式下檔案分發
-
login()
-
if choice == '2':
-
operation.ExecuteCmd()###非堡機模式下命令執行
-
login()
-
if choice == '3':
-
operation.DownloadFile()###非堡機模式下檔案下載
-
login()
-
if choice == '4':
-
operation.SingleServer()###單臺伺服器操作
-
login()
-
if choice == '5':
-
blhost_operation.SendFile()###堡壘機模式下檔案分發
-
login()
-
if choice == '6':
-
blhost_operation.ExecuteCmd()###堡壘機模式下命令執行
-
login()
-
if choice == '7':
-
operation.AddServerList()###增加伺服器名單
-
if choice == '8':
-
operation.DeleteServerList()###刪除伺服器名單
-
if choice == '9':
-
operation.ShowServerList()###展示伺服器名單
-
login()
-
if choice == '10' or choice == 'exit':###退出指令碼操作
-
print "\033[1;31mThank you for your use!\033[0m"
-
sys.exit(0)
-
if choice == 'help':
-
login()
-
if __name__ == '__main__':
-
login()
- choice()
maintool.py執行效果如下:
2.operation.py(定義非堡壘機模式下的相關操作),程式碼如下:
點選(此處)摺疊或開啟
-
#!/usr/bin/python
-
#coding:utf-8
-
import sys,time,threading
-
import getpass,commands
-
import paramiko,fabric
-
server_list=[] #HOSTNAME IP PWDROOT PWDWEBLOGIC PWDORACLE
-
result_dict={}
- ######讀取檔案內容,讀取完成後關閉檔案
-
f = open ('serverlist.txt')
-
for i in f.readlines():
-
server_list.append(i.split())
-
f.close()
- ######非堡壘機下檔案的傳送
-
def transfer(localpath,remotepath,hostname,username,password):
-
port = 22
-
try:
-
t = paramiko.Transport((hostname,port))
-
t.connect(username=username,password=password)
-
sftp = paramiko.SFTPClient.from_transport(t)
-
sftp.put(localpath,remotepath)
-
t.close()
-
result_dict[hostname] = hostname+"伺服器檔案傳送完成"
-
print result_dict[hostname]
-
except Exception,e:
-
print str(e)
- ######定義檔案下載函式
-
def download(remotepath,localpath,hostname,username,password):
-
port = 22
-
try:
-
t = paramiko.Transport((hostname,port))
-
t.connect(username=username,password=password)
-
sftp = paramiko.SFTPClient.from_transport(t)
-
sftp.get(remotepath,localpath)
-
t.close()
-
result_dict[hostname] = hostname+"伺服器檔案下載完成"
-
print result_dict[hostname]
-
except Exception,e:
-
print str(e)
- ######定義命令執行函式
-
def execmd(hostname,username,password,CMD):
-
paramiko.util.log_to_file('syslogin.log')###將使用者登入伺服器日誌輸出到syslogin.log
-
ssh = paramiko.SSHClient()###ssh登入伺服器
-
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())###自動新增主機名及主機金鑰到本地HostKeys物件,並將其儲存,不依賴load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不產生影響
-
ssh.connect(hostname=hostname,username=username,password=password)
-
stdin,stdout,stderr = ssh.exec_command(CMD)
-
result = stdout.read()
-
ssh.close()
-
result_dict[hostname] = hostname+"伺服器命令執行結果如下:"+"\n"+result
-
print result_dict[hostname]
- ######執行結果列印
-
def result_dict_print():
-
global result_dict
-
while True:
-
if len(result_dict) == len(server_list):
-
break
-
print "\033[1;36m%s臺伺服器完成\033[0m" %(len(result_dict))
-
result_dict = {}
- ######非保壘機模式下檔案的分發
-
def SendFile():
-
while True:
-
username = raw_input("\033[1;32m請輸入你選擇要用於傳送檔案的使用者[root/weblogic/oracle]:\033[0m").strip()
-
username_list = ['root','weblogic','oracle','\n','exit']
-
if username not in username_list:
-
print "\033[0;32minput error!Please try again!If you need exit,please input exit!\033[0m"
-
continue
-
if username == 'exit':
-
sys.exit()
-
localpath = raw_input("\033[1;32m本地檔案(絕對路徑):\033[0m").strip()
-
remotepath = raw_input("\033[1;32m伺服器目的地址(絕對路徑):\033[0m").strip()
-
if username == 'root':
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(localpath,remotepath,list[1],username,list[2],))
-
p.start()
-
for list in server_list:
-
p.join(timeout=1)
-
if username == 'weblogic' or username == '':
-
username = 'weblogic'
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(localpath,remotepath,list[1],username,list[3],))
-
p.start()
-
if username == 'oracle':
-
username = 'oracle'
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(localpath,remotepath,list[1],username,list[4],))
-
p.start()
-
result_dict_print()
-
break
- ######非堡壘機模式下檔案的下載
-
def DownloadFile():
-
while True:
-
username = raw_input("\033[1;32m請輸入你選擇要用於下載檔案的使用者[root/weblogic/oracle]:\033[0m").strip()
-
username_list = ['root','weblogic','oracle','\n','exit']
-
if username not in username_list:
-
print "\033[1;32minput error!Please try again!If you need exit,please input exit!\033[0m"
-
continue
-
if username == 'exit':
-
sys.exit()
-
remotepath = raw_input("\033[1;32m遠端檔案(絕對路徑):\033[0m").strip()
-
localpath = raw_input("\033[1;32m伺服器目的地址(目錄名,預設為/opt/zzx/python/bin):\033[0m").strip()
-
if localpath == '':
-
localpath = '/opt/zzx/python/bin'
-
localpath = localpath+"/"
-
print localpath
-
count = remotepath.count('/')
-
basename = remotepath.split('/')[count]
-
if username == 'root':
-
for list in server_list:
-
p = threading.Thread(target=download,args=(remotepath,localpath+list[1]+"_"+basename,list[1],username,list[2],))
-
p.start()
-
for list in server_list:
-
p.join(timeout=1)
-
if username == 'weblogic' or username == '':
-
username = 'weblogic'
-
for list in server_list:
-
localpath = result1+list[1]+"_"+result2
-
p = threading.Thread(target=download,args=(remotepath,localpath,list[1],username,list[3],))
-
p.start()
-
if username == 'oracle':
-
for list in server_list:
-
localpath = result1+list[1]+"_"+result2
-
p = threading.Thread(target=download,args=(remotepath,localpath,list[1],username,list[4],))
-
p.start()
-
result_dict_print()
-
break
- ######非堡壘機模式下命令的執行
-
def ExecuteCmd():
-
while True:
-
username = raw_input("\033[1;32m請輸入你選擇要用於執行命令的使用者[root/weblogic/oracle]:\033[0m").strip()
-
username_list = ['root','weblogic','oracle','\n','exit']
-
if username not in username_list:
-
print "\033[1;32minput error!Please try again!If you need exit,please input exit!\033[0m"
-
continue
-
if username == 'exit':
-
sys.exit()
-
CMD = raw_input("\033[1;37m請輸入要執行的命令(不能帶引號):\033[0m").strip()
-
if CMD == 'exit':
-
return
-
if username == 'root':
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(list[1],username,list[2],CMD,))
-
p.start()
-
if username == 'weblogic' or username == '':
-
username = 'weblogic'
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(list[1],username,list[3],CMD))
-
p.start()
-
if username == 'oracle':
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(list[1],username,list[4],CMD))
-
p.start()
-
result_dict_print()
-
break
- ######單臺伺服器操作
-
def SingleServer():
-
IP = raw_input("\033[1;32m請輸入要執行命令的伺服器IP地址:\033[0m").strip()
-
username = raw_input("\033[1;32m請輸入要執行命令的伺服器使用者名稱:\033[0m").strip()
-
password = getpass.getpass()
-
CMD = raw_input("\033[1;32m請輸入要執行的命令(不能帶引號):\033[0m").strip()
-
execmd(IP,username,password,CMD)
- ######伺服器名單新增
-
def AddServerList():
-
hostname = raw_input("\033[1;32m請輸入伺服器名稱(如localhost):\033[0m").strip()
-
if hostname == 'quit' or hostname == 'exit':
-
return
-
ip = raw_input("\033[1;32m請輸入伺服器IP:\033[0m").strip()
-
root_passwd = raw_input("\033[1;32m請輸入伺服器root使用者密碼:\033[0m").strip()
-
weblogic_passwd = raw_input("\033[1;32m請輸入伺服器weblogic使用者密碼:\033[0m").strip()
-
oracle_passwd = raw_input("\033[1;32m請輸入伺服器oracle使用者密碼:\033[0m").strip()
-
f = file('serverlist.txt','a')
-
f.write("%s %s %s %s %s\n"%(hostname,ip,root_passwd,weblogic_passwd,oracle_passwd))
-
f.close()
-
raw_input("\033[1;32m重新執行程式後生效(敲任意鍵退出)...\033[0m")
-
time.sleep(0.2)
-
sys.exit()
- ######伺服器名單刪除
-
def DeleteServerList():
-
IP = raw_input("\033[1;32m請輸入要刪除伺服器IP:\033[0m").strip()
-
if IP == 'quit' or IP == 'exit':
-
return
-
status,result = commands.getstatusoutput("sed -i '/\<%s\>/'d ./serverlist.txt" % IP)
-
raw_input("\033[1;32m重新執行程式後生效(敲任意鍵退出)...\033[0m")
-
time.sleep(0.2)
-
sys.exit()
- ######伺服器名單顯示
-
def ShowServerList():
-
i = 0
-
f = open('serverlist.txt','rb')
-
for line in f.readlines():
-
print line.strip()
-
i = i+1
-
f.close
- print "\n總共%s臺伺服器" % i
點選(此處)摺疊或開啟
-
#!/usr/bin/python
-
#coding:utf-8
-
import sys,time,threading
-
import getpass,commands,os
-
import paramiko,fabric
-
server_list=[] #HOSTNAME IP PWDROOT PWDWEBLOGIC PWDORACLE
-
result_dict={}
- ######讀取檔案內容,讀取完成後關閉檔案
-
f = open ('serverlist.txt')
-
for i in f.readlines():
-
server_list.append(i.split())
-
f.close()
- ######堡壘機下檔案的傳送
-
def transfer(bllocalpath,remotepath,blhostname,blusername,blpassword,hostname,username,password):
-
passinfo='\'s password: '
-
paramiko.util.log_to_file('blhost_upload.log')
-
-
ssh=paramiko.SSHClient()
-
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())###自動新增主機名及主機金鑰到本地HostKeys物件,並將其儲存,不依賴load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不產生影響
-
ssh.connect(hostname=blhostname,username=blusername,password=blpassword)
-
-
channel=ssh.invoke_shell()
-
channel.settimeout(100)
-
buff=''
-
resp=''
-
channel.send('scp '+bllocalpath+' '+username+'@'+hostname+':'+remotepath+'\n')
-
while not buff.endswith(passinfo):
-
try:
-
resp=channel.recv(9999)
-
except Exception,e:
-
print "Error info:receive nothing"
-
print str(e)
-
channel.close()
-
ssh.close()
-
sys.exit()
-
buff += resp
-
if not buff.find('yes/no')==-1:
-
channel.send('yes\n')
-
buff=''
-
buff=''
-
channel.send(password+'\n')
-
while not buff.endswith('# '):
-
resp=channel.recv(9999)
-
if not resp.find(passinfo)==-1:
-
print "Error info:Authentication failed."
-
print "Please confirm if your password is true!"
-
channel.close()
-
ssh.close()
-
sys.exit()
-
buff += resp
-
channel.close()
-
ssh.close()
-
result_dict[hostname] = hostname+"伺服器檔案傳送完成"
-
print result_dict[hostname]
- ######堡壘機模式下命令執行
-
def execmd(blhostname,blusername,blpassword,hostname,username,password,CMD):
-
passinfo='\'s password: '
-
paramiko.util.log_to_file('blhost_syslogin.log')
-
-
ssh=paramiko.SSHClient()
-
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-
ssh.connect(hostname=blhostname,username=blusername,password=blpassword)
-
-
channel=ssh.invoke_shell()
-
channel.settimeout(100)
-
-
buff=''
-
resp=''
-
channel.send('ssh '+username+'@'+hostname+'\n')
-
while not buff.endswith(passinfo):
-
try:
-
resp=channel.recv(9999)
-
except Exception,e:
-
print "fail to connect"
-
print "Error info: "+str(e)
-
channel.close()
-
ssh.close()
-
sys.exit()
-
buff += resp
-
if not buff.find('yes/no')==-1:
-
channel.send('yes\n')
-
buff=''
-
buff=''
-
channel.send(password+'\n')
-
while not buff.endswith('# '):
-
resp=channel.recv(9999)
-
if not resp.find(passinfo)==-1:
-
print "Error info:Authentication failed"
-
channel.close()
-
ssh.close()
-
sys.exit()
-
buff += resp
-
buff=''
-
channel.send('%s\n' % CMD)
-
try:
-
while not buff.endswith('# '):
-
resp=channel.recv(9999)
-
buff += resp
-
except Exception,e:
-
print "Error info:"+str(e)
-
-
result = buff
-
channel.close()
-
ssh.close()
-
result_dict[hostname] = hostname+"伺服器命令執行結果如下:"+"\n"+result
-
print result_dict[hostname]
- ######執行結果列印
-
def result_dict_print():
-
global result_dict
-
while True:
-
if len(result_dict) == len(server_list):
-
break
-
print "\033[1;36m%s臺伺服器完成\033[0m" %(len(result_dict))
-
result_dict={}
- ######堡壘機模式下檔案的批次分發
-
def SendFile():
-
while True:
-
blusername = raw_input("\033[1;32m請輸入你選擇要用於傳送檔案的堡壘機使用者[root/weblogic/oracle]:\033[0m").strip()
-
blusername_list = ['root','weblogic','oracle','','exit']
-
if blusername not in blusername_list:
-
print "\033[0;32minput error!Please try again!If you need exit,please input exit!\033[0m"
-
continue
-
if blusername == 'exit':
-
return
-
blhostname=raw_input("\033[1;32m請輸入你選擇要用於傳送檔案的堡壘機IP:\033[0m").strip()
-
print "\033[1;32m請輸入你選擇要用於傳送檔案的堡壘機密碼:\033[0m"
-
blpassword=getpass.getpass()
-
username=raw_input("\033[1;32m請輸入你選擇要用於接收檔案的使用者[root/weblogic/oracle]:\033[0m").strip()
-
bllocalpath=raw_input("\033[1;32m堡壘機本地檔案(絕對路徑):\033[0m").strip()
-
remotepath=raw_input("\033[1;32m伺服器目的地址(絕對路徑):\033[0m").strip()
-
if blusername == 'root':
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(bllocalpath,remotepath,blhostname,blusername,blpassword,list[1],username,list[2],))
-
p.start()
-
for list in server_list:
-
p.join(timeout=1)
-
if blusername == 'weblogic' or blusername == '':
-
blusername = 'weblogic'
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(bllocalpath,remotepath,blhostname,blusername,blpassword,list[1],username,list[3],))
-
p.start()
-
if blusername == 'oracle':
-
for list in server_list:
-
p = threading.Thread(target=transfer,args=(bllocalpath,remotepath,blhostname,blusername,blpassword,list[1],username,list[4],))
-
p.start()
-
result_dict_print()
-
break
- ######堡壘機模式下命令的批次執行
-
def ExecuteCmd():
-
while True:
-
blusername = raw_input("\033[1;32m請輸入你選擇要用於跳轉的堡壘機使用者[root/weblogic/oracle]:\033[0m").strip()
-
blusername_list = ['root','weblogic','oracle','','exit']
-
if blusername not in blusername_list:
-
print "\033[0;32minput error!Please try again!If you need exit,please input exit!\033[0m"
-
continue
-
if blusername == 'exit':
-
return
-
blhostname=raw_input("\033[1;32m請輸入你選擇要用於跳轉的堡壘機IP:\033[0m").strip()
-
print "\033[1;32m請輸入你選擇要用於跳轉的堡壘機密碼:\033[0m"
-
blpassword=getpass.getpass()
-
username=raw_input("\033[1;32m請輸入你選擇要用於執行命令的使用者[root/weblogic/oracle]:\033[0m").strip()
-
CMD = raw_input("\033[1;37m請輸入要執行的命令(不能帶引號):\033[0m").strip()
-
if CMD == 'exit':
-
return
-
if blusername == 'root':
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(blhostname,blusername,blpassword,list[1],username,list[2],CMD,))
-
p.start()
-
if username == 'weblogic' or username == '':
-
username = 'weblogic'
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(blhostname,blusername,blpassword,list[1],username,list[3],CMD,))
-
p.start()
-
if username == 'oracle':
-
for list in server_list:
-
p = threading.Thread(target=execmd,args=(blhostname,blusername,blpassword,list[1],username,list[4],CMD,))
-
p.start()
-
result_dict_print()
- break
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31541436/viewspace-2155896/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- windows下ftp定時執行批次下載檔案,windows下ftp定時執行批次下載檔案的一種方法WindowsFTP
- python實現批次執行命令列Python命令列
- CentOS使用expect批次遠端執行指令碼和命令CentOS指令碼
- python中使用subprocess批次執行linux下命令PythonLinux
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- linux批次find查詢檔案並批次替換覆蓋該檔案Linux
- python——批次移動檔案Python
- md檔案批次轉htmlHTML
- 如何批次對檔案進行重新命名?
- shardingJdbc分表執行批次update不支援的解決方式JDBC
- 使用mmv命令批次修改檔名稱
- 批次檔案重新命名的方法
- postman的批次執行:用於多條介面測試用例批次執行,輸出介面測試測試結果Postman
- python之批次移動檔案Python
- 批次做成畫像dummy檔案
- 用bat批次修改檔案建立和修改時間BAT
- 批次殺執行某條sql的sessionSQLSession
- find 批次修改檔案後輟名
- shell指令碼之批次清空檔案指令碼
- linux-批次修改檔案內容Linux
- 教你批次歸類大量桌面檔案的方法
- 教你智慧批次管理電腦檔案的方法
- python模組paramiko的上傳下載和遠端執行命令方法Python
- c語言,批次處理檔案,進行gzip壓縮C語言
- bat批處理使用ren批次重新命名檔案,比如批次去掉檔名稱的前4位BAT
- PDF檔案批次列印工具:BatchOutput PDF for MacBATMac
- win10批次檔案改名方法 win10系統下如何批次重新命名檔案Win10
- Dragonfly 基於 P2P 的檔案和映象分發系統Go
- 批次修改副檔名
- paramiko執行多個作業系統命令並返回作業系統
- Hadoop系列,執行jar檔案命令HadoopJAR
- iWork Converter for Mac(iWork檔案批次轉換工具)Mac
- 報表如何批次匯出成 excel 檔案Excel
- 檔案批次重新命名軟體:Renamer——MacwMac
- 協程必知必會-系列3-批次併發執行
- 使用js寫一個批次上傳檔案的元件JS元件
- 「SAP技術」SAP VL02N 執行批次拆分報錯,說不允許批次拆分?
- win10如何批次檔案字尾修改_win10怎麼批次修改字尾Win10