paramiko(ssh登陸)
paramiko是基於python實現的ssh2遠程安全連接,支持認證及密鑰方式。可以實現遠程命令執行,文件傳輸、中間ssh代理等功能。
安裝:
pip install paramiko或 easy_install paramiko
paramiko依賴第三方的Crypto,Ecdsa和pyhton-devel
核心組件:
SSHclient類
方法:
connect():遠程ssh連接並作校驗
參數:
hostname 連接的目標主機
port=SSH_PORT 指定端口
username=None 驗證的用戶名
password=None 驗證的用戶密碼
pkey=None 私鑰方式用於身份驗證
key_filename=None 一個文件名或文件名列表,指定私鑰文件
timeout=None 可選的tcp連接超時時間
allow_agent=True 是否允許連接到ssh代理,默認爲True 允許
look_for_keys=True 是否在~/.ssh中搜索私鑰文件,默認爲True 允許
compress=False 是否打開壓縮
sock=None
gss_auth=False
gss_kex=False
gss_deleg_creds=True
gss_host=None
banner_timeout=None
exec_command():用於遠程執行命令,該命令的輸入與輸出流爲標準輸入、標出輸出、標準錯誤輸出
參數:
command 執行的命令
bufsize=-1 文件緩衝區大小
timeout=None 設置超時時間
get_pty=False
load_system_host_key():裝載系統公鑰,默認爲~/.ssh/known_hosts
參數:
filename=None 指定本地公鑰文件
set_missing_host_key_policy():設置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,目前支持三種,也就是參數只有三個。
參數:
AutoAddPolicy 自動添加主機名及主機密鑰到本地的known_hosts,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認
WarningPolicy 用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy類似,但是會提示是新連接
RejectPolicy 自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此爲默認選項
用法:
set_missing_host_key_policy(paramiko.AutoAddPolicy())
SFTPClient類
SFTPCLient作爲一個sftp的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程文件操作,如上傳、下載。
方法:
from_transport(cls,t) 創建一個已連通的SFTP客戶端通道
put(localpath, remotepath, callback=None, confirm=True) 將本地文件上傳到服務器 參數confirm:是否調用stat()方法檢查文件狀態,返回ls -l的結果
get(remotepath, localpath, callback=None) 從服務器下載文件到本地
mkdir() 在服務器上創建目錄
remove() 在服務器上刪除目錄
rename() 在服務器上重命名目錄
stat() 查看服務器文件狀態
listdir() 列出服務器目錄下的文件
import paramiko
import time
def QYT_SSHClient_MultiCMD(ip, username, password,):
ssh = paramiko.SSHClient() # 創建SSH Client
ssh.load_system_host_keys() # 加載系統SSH密鑰
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 添加新的SSH密鑰
print('1-' * 30)
ssh.connect(ip, port=22, username=username,
password=password, timeout=5, compress=True,allow_agent=False,look_for_keys=False)
print('2-'*30)
chan = ssh.invoke_shell() # 激活交互式shell
time.sleep(1)
x = chan.recv(2048).decode() # 接收回顯信息
print (x)
chan.send('display version'.encode()) # encode爲二進制
chan.send(b'\n')
time.sleep(2) # 由於有些回顯可能過長,所以可以考慮等待更長一些時間
x = chan.recv(40960).decode() # 讀取回顯,,有些回顯可能過長
print(x) # 打印回顯
chan.close() # 退出交互式shell
ssh.close() # 退出ssh會話
if __name__ == '__main__':
QYT_SSHClient_MultiCMD('192.168.1.1', 'root', '123qwe',)