1. 程式人生 > >python遠端控制Linux

python遠端控制Linux

遠端控制Linux

自動安裝產品到Linux
自動化用例的一些步驟 #log裡面讀取資訊
運維
環境監控
資料的自動獲取,分析
方案
Paramiko #主流的庫
Pexpect #相對早一點
執行下面的命令

pip install paramiko --default-timeout=60           #國外的源,時間設定的長一點
pip install paramiko -i https://pypi.douban.com/simple/--trusted-host pypi.douban.com       #國內豆瓣的源
  • 保證 ssh 服務開啟
    用putty 連結看看 #遠端連線工具

常見的linux命令

  • ls:列出當前目錄下所有的目錄(相當於dos下的dir) #windows下面的dir

  • pwd:當前目錄

  • cat:檢視內容(cat 1.txt)(內容較少)

  • more:檢視內容(內容較多)

  • clear:清屏

  • mkdir xxx:建立目錄

  • cd xxx:進入目錄

  • cd -:返回到上一次所處的目錄

  • cd ~:命令切換到當前使用者的家目錄

  • cd ~username:切換到其他使用者的家目錄

  • echo “XX” > YY:將內容XX存到檔案YY中

  • date +%Y%m%d_%H%M%S;free:獲取記憶體資訊

  • date:檢視系統時間

  • date “+%Y-%m-%d %H:%M:%S”:檢視系統時間,格式:2017-08-24 16:29:12

  • date -s “20170901 8:30:00”: 設定系統時間

  • clock --show:檢視硬體時間(bios時間)

  • clock --hctosys:更改系統時間為硬體時間(hc代表硬體時間,sys代表系統時間)

  • clock --systohc:更改硬體時間為系統時間(hc代表硬體時間,sys代表系統時間)

  • reboot:重啟

  • poweroff:關閉系統

  • uname
    -a:完整地檢視當前系統的核心名稱、主機名、核心發行版本、節點名、系統時間、硬體名稱、硬體平臺、處理器型別以及作業系統名稱等資訊

  • cat /etc/redhat-release:檢視當前系統版本的詳細資訊

  • free -h :記憶體使用情況

  • who:用於檢視當前登入主機的使用者終端資訊

  • tail -n 20:檢視檔案的最後20行

  • tail -f 檔名:檢視實時日誌

  • locale:檢視系統字符集

  • echo “dasdsadasdasds” > file1 #把內容寫入到file1裡面*

程式碼

import paramiko
#建立SSHClient 例項物件
ssh = paramiko.SSHClient()        #通過SSHClient類實力一個物件,只要支援遠端的ssh協議

#呼叫方法,表示沒有儲存遠端機器的公鑰,允許訪問
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())      #通過對方的一個金鑰的儲存,把金鑰檔案,防止釣魚機

#連線遠端機器  地址、埠、使用者名稱密碼
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")       #ci.ytesting.com域名,埠22,stt使用者名稱,songqin123密碼
#具體操作
#建立目錄
cmd = 'mkdir jcy2'     #建立目錄
ssh.exec_command(cmd)       #呼叫這個命令才會執行

#如果命令跨行
cmd = '''echo '1234
5678
90abc' > myfile
'''
ssh.exec_command(cmd)

#獲取命令的執行結果
cmd = 'cat myfile'      #看他的檔案,cmd是變數
stdin, stdout, stderr = ssh.exec_command(cmd)       # ssh.exec_command(cmd) 返回的是檔案物件,stdin遠端的標準輸入,stdout遠端標準輸出,一般是正確的。stderr一般是錯誤的輸出。賦值給3個變數

output = stdout.read()+ stderr.read()   #把正確的錯誤的read一下,加起來。檔案2進位制讀出來是2進位制型別。只加後面兩個
print(output.decode('utf8'))            #用UTF-8解碼,decode
ssh.close()

注意點
exec_command 每次執行會新開啟一個channel執行 #類似於新開啟一個終端,都是在使用者登陸的根目錄下執行的
新的環境,不在上次執行的環境裡面
所以,我們不能多次呼叫,達到多次呼叫的目的

比如:

ssh.exec_command(pwd)
ssh.exec_command("mkdir a123")
ssh.exec_command("mkdir b123")
stdin, stdout, stderr = ssh.exec_command("pwd")
print (stdout.read())   #此時不是在b123的目錄下面,還是在使用者登入的根目錄下面/home/stt

如果一定要上下命令關聯,可以多個命令同時執行 比如 cd a123;pwd
程式碼如下:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")

cmd = "pwd;mkdir jcy4;cd jcy4;pwd;mkdir jcy44"
stdin, stdout, stderr = ssh.exec_command(cmd)

print(stdout.read().decode())
ssh.close()

#結果:b'/home/stt\n/home/stt/jcy4\n'

獲取資料進行分析

例如 記憶體使用

程式碼如下:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "stt0707")


stdin, stdout, stderr = ssh.exec_command("date +%Y%m%d_%H%M%S;free")      #free當前系統的記憶體使用率   data可以看到當前的時間,合起來就可以看到某個時間點的記憶體資訊,如在一個迴圈裡,每個幾秒鐘執行一次,還可以用別的工具把它回執圖表

print(stdout.read())
ssh.close()

傳輸檔案到遠端伺服器

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")

sftp = ssh.open_sftp()      #開啟檔案傳輸的通道
sftp().put("ftp1.py","/home/stt/ftp3.py")       #前面的是本地檔案,後面的是路徑和新起的名字
sftp.close()

從遠端機器拷貝檔案到本機 #拉去日誌分析

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("ci.ytesting.com",22,"stt", "Songqin123")

sftp = ssh.open_sftp()      #開啟檔案傳輸的通道
sftp().get("/home/stt/myfile","d:/myfile1.txt")       #前面的是本地檔案,後面的是路徑和新起的名字
sftp.close()
ssh.close()