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()