0X01 SSH的創建 python
我想,第一步先實現簡單的ssh通訊再說,相似其餘那種高端的C&C將逐步研究ssh
對於ssh,python有個module叫paramiko,對沒錯看起來像日語單詞spa
The introductions of some modules are as follow:代理
一、SSHClient類
SHClient類是SSH服務會話的高級表示,封裝了傳輸、通道以及SFTPClient的校驗、創建方法,一般用於執行命令。
1)connect方法
connect(self,hostname,port=22,username=None,password=None,pkey=None,key_filename=None,timeout=None,allow_agent=True,look_for_keys=True,compress=False)
參數說明:
hostname:鏈接目標的主機地址
port:鏈接目錄的端口,默認爲22
username:用戶名
password:密碼
pkey:私鑰方式用戶驗證
key_filename:私鑰文件名
timeout:鏈接超時時間
allow_agent:是否容許使用ssh代理
look_for_keys:是否容許搜索私鑰文件
compress:打開時是否壓縮
2)exec_command方法
exec_command(self,command,bufsize=-1)
參數說明:
command:執行的的指令
bufsize:文件緩衝區大小,-1不限制
3)load_system_host_keys方法
load_system_host_keys(self,filename=None)
參數說明:
filename:指定遠程主機的公鑰文件,默認爲.ssh目錄下的known_hosts文件
4)set_missing_host_key_policy方法
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
參數說明:
AutoAddPolicy:自動添加主機名及密鑰到本地並保存,不依賴load_system_host_keys()配置,即若是known_hosts裏沒有遠程主機的公鑰時,默認鏈接會提示yes/no,自動yes
RejectPolicy:自動拒絕未知主機名和密鑰,依賴load_system_host_keys()
WarnningPlicy:功能與AutoAddPolicy相同,可是未知主機會提示yes/no
二、SFTPClient類
根據SSH傳輸協議的sftp會話,實現遠程文件上傳、下載等操做。
1)from_transport方法
classmethod from_transport(cls,t)
參數說明:
t:一個已經過驗證的傳輸對象
示例:
>>> import paramiko
>>> a = paramiko.Transport((「127.0.0.1″,2222))
>>> a.connect(username=」root」, password=’123456′)
>>> sftp = paramiko.SFTPClient.from_transport(a)
2)put方法
put(self,localpath,remotepath,callback=None,confirm=True)
參數說明:
localpath:上傳源文件的本地路徑
remotepath:目標路徑
callback:獲取接收與總傳輸字節數
confirm:上傳完畢後是否調用stat()方法,以便確認文件大小
示例:
>>> localpath=’ftp-test.log’
>>> remotepath=’/data/ftp-test.log’
>>> sftp.put(localpath,remotepath)
3)get方法
get(self, remotepath, localpath, callback=None)
參數說明:
remotepath:須要下載的遠程文件
localpath:本地存儲路徑
callback:同put方法
4)其餘方法
mkdir:用於建立目錄
remove:刪除目錄
rename:重命名
stat:獲取文件信息
listdir:獲取目錄列表
瞭解完模塊,咱們先嚐試實現一下鏈接ssh:
import paramiko
import datetime
import os
hostname = "47.10.84."
port=22
username = "root"
password = ""
ssh = paramiko.SSHClient() #建立一個ssh鏈接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #目的是接受不在本地已知主機文件下的主機。missing host key很明顯能夠看出是指在丟失主機密鑰的狀況下作出什麼動做,
即自動添加相應的策略
ssh.connect(hostname=hostname,port=22,username=username,password=password)
stdin,stdout,stderr = ssh.exec_command('ls') #傳送指令
res,err = stdout.read(),stderr.read()
result = res if res else err
print(result)
ssh.close()
很不幸的是,這種方式只能分次傳送指令,下面我介紹一下另外一種方式code