目標:有A和B兩台機器,希望在機器A上操作B上的腳本
解決方法:使用paramiko實現操作遠程機器
1.安裝paramiko
安裝第三方包【pip3 install paramiko】
如果pip訪問國外站點總超時,可以使用國內鏡像,使用-i指定, --trusted-host pypi.douban.com信任鏡像源
pip3 install paramiko -i http://pypi.douban.com/ --trusted-host pypi.douban.com
pipy國內鏡像目前有:
http://pypi.hustunique.com/ 華中理工大學
http://pypi.sdutlinux.org/ 山東理工大學
http://pypi.mirrors.ustc.edu.cn/ 中國科學技術大學
2.paramiko用法
參考文檔:
第一步:通過賬號密碼連接
def connect(host,username,password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(host,username=username,password=password,allow_agent=True) return ssh except: return None
host為要連接的機器IP,username和password為登錄機器的賬號密碼
第二步:在遠程機執行命令(shell命令)
def exec_commands(conn,cmd): stdin,stdout,stderr = conn.exec_command(cmd) results=stdout.read()+stderr.read() print(results) return results
stdin:標准輸入
stdout:標准正確輸出
stderr:標准錯誤輸出
通過stdout.read()獲得對應輸出內容
第三步:和遠程機器間傳遞文件
def ftpssh(frompath,topath,method="get"): t = paramiko.Transport(遠程機器IP) t.connect(username= 遠程機器登錄用戶名, password = 遠程機器登錄密碼) sftp = paramiko.SFTPClient.from_transport(t) if method == "get":#將遠程文件copy到本地 sftp.get(frompath, topath) elif method == "put":#將本地文件copy到遠程機器上 sftp.put(frompath, topath) t.close()
method=get,將遠程機對應文件下載到本地的路徑下
method=put,將本地文件上傳到遠程機對應路徑下
其他說明:
1.通過paramiko操作遠程機器的python3文件,python3腳本里有讀寫文件的操作
明明是python3結果有編碼問題,所以改了遠程機器腳本,讀寫文件時強指定編碼格式為utf-8
with open(“文件","w",encoding='utf-8') as f:
2.我通過第二步執行命令,讀取不到控制台輸出的結果,所以通過將輸出結果重定向到本地文件,然后通過遠程機器間傳遞文件來實現把文件放到本地
這樣就直接讀取本地文件了
比如:我執行Appium測試腳本,會在控制台輸出一些操作結果,我想獲得這些結果
cmd="source ~/.bash_profile;/usr/local/bin/python3 ./test.py >> ./log.txt 2>&1" exec_commands(cmd) ftpssh(WebmanageConfig.uitestpath + "/testsuit/temptestcaseslist.txt", "./temptestcaseslist.txt")
3.在執行遠程機器的腳本時,發現有些環境變量沒有讀取到,所有我又在腳本中加載了遠程機器的環境變量文件
source ~/.bash_profile
4.每條遠程命令執行都是單獨處理的,處理完后都會回到初始目錄。
所以有cd目錄的操作,最好把多條語句放到同一條命令里,不同命令使用分號隔開