paramiko模塊簡介
paramiko是基于SSHv2協議開發的,可用于連接遠程SSH服務器,通過SSH連接執行遠程命令或者檔案傳輸,paramiko支持Python(2.7,3.4+版本),paramiko利用Python C擴展來現簡單的加密,它本身是一個圍繞SSH網路概念的純Python介面,
paramiko分為以下幾個部分
SSH協議核心類
- Channel
- Client
- Message
- Packetizer
- Transport
秘鑰認證類
SSH agents
Host keys / known_hosts files
Key handling
Parent key class
- DSA (DSS)
- RSA
- ECDSA
- Ed25519
GSS-API authentication
GSS-API key exchange
其它功能類
- Configuration
- Keywords currently supported
- Expansion tokens
- config module API documentation
- ProxyCommand support
- Server implementation
- SFTP
雜類
- Buffered pipes
- Buffered files
- Cross-platform pipe implementations
- Exceptions
下面對各類進行簡單介紹
SSH協議核心類
channel類
class paramiko.channel.Channel(chanid)
channel類的描述:
channel是一個SSH傳輸的安全隧道,一個通道類似于一個socket,由于SSH2有一種視窗式的流控制,如果停止從channel中讀取資料,并且其緩沖區已滿,服務器將無法向channel發送更多的資料,直到從channel中讀取其中一些資料,(注意:這不會影響同一傳輸上的其他channel,單個傳輸上的所有channel都是獨立的流控制,)同樣,如果服務器不讀取channel發送的資料,則除非設定超時,否則發送呼叫會一直處于阻塞,
channel類中的常用方法:
__init__(chanid):建構式,channel是由Transport創建的,所以我們不用管,
close():
功能:關閉channel,斷開SSH連接,
引數:無,
回傳值:無,
exec_command(self, command):
功能:執行遠程命令,注意命令執行完成后channel將關閉,不能被復用,
引數:
command(str):要執行的命令,
回傳值:元組(stdin, stdout, stderr),
exit_status_ready():
功能:當服務端主動斷開連接時,接收服務端的退出狀態碼,如果因為程式假死,或者服務器宕機等特殊原因造成exit_status_ready()無法接收到退出狀態碼,該方法將無法通過獲取狀態碼的形式來判斷服務器的狀態,
引數:無
回傳值:如果接收到服務器退出狀態碼回傳True,否則回傳False,
fileno():
功能:在使用Python的select模塊時會用到fileon()回傳的檔案描述符FD,如果有很多channel都使用此方法將導致channel讀取的效率變慢,
引數:無
回傳值:回傳一個作業系統級檔案描述符(int)FD,該描述符不用于讀取或寫入,
get_id():
功能:回傳channel的ID,通常是一個很小的數字,
引數:無
回傳值:channel的ID,
get_name():
功能:獲取channel的名字,可以使用set_name設定channel的名字,
引數:無
回傳值:channel的名字,
get_pty(term="vt100",width=80,height=24,width_pixels=0,height_pixels=0):
功能:向服務器請求獲取一個偽終端,通常在創建channel后,立即呼叫get_pty()請求一個偽終端,在使用invoke_shell想要創建一個互動式shell環境時需要提前呼叫get_pty(),如果呼叫的是exec_command執行命令,不需要使用get_pty(),
引數:
term(str):要模擬的終端型別,如:'vt100',
width(int):終端寬度,以字符為單位,
height(int):終端高度,以字符為單位,
width_pixels(int):終端寬度,以像素為單位,
height_pixels(int):終端高度,以像素為單位,
回傳值:無
resize_pty(self, width=80, height=24, width_pixels=0, height_pixels=0):
功能:執行get_pty()后,可以通過resize_pty()重新設定偽終端視窗大小,
引數:同get_pty(),
回傳值:無
invoke_shell(self):
功能:前面使用get_pty()獲取一個偽終端后,需要使用invoke_shell()激活這個偽終端,激活成功后在偽終端中就可以向操作本機一樣操作遠程主機即所謂的互動式shell,當退出偽終端后,channel將被關閉,無法被復用,
引數:無
回傳值:無
recv(nbytes):
功能:從channel中接收nbytes的資料,并以位元組的形式回傳,
引數:
nbytes(int):接收的最大位元組數,
回傳值:以位元組的形式回傳接收到的資料,
recv_exit_status():
功能:接收服務器行程回傳退出狀態碼,對于檢索執行命令的結果非常有用,如果命令尚未完成,則此方法將等待完成,或者直到通道關閉,如果服務器沒有提供退出狀態,則回傳-1,
引數:無
回傳值:如果接收到狀態碼回傳狀態碼,否則回傳-1,
recv_ready():
功能:如果channel中有可讀資料回傳True,否則回傳False,但回傳False并不意味著通道已關閉,或者沒有可讀取的資料,有可能需要等待更多的資料到達后在進行讀取,
引數:無
回傳值:如果channel中有可讀資料回傳True,否則回傳False,
recv_stderr(nbytes):
功能:從channel中的stderr流接收nbytes位元組的資料,此方法只在不呼叫get_pty的情況下使用exec_command或invoke_shell時channel中stderr流上才擁有資料,
引數:
nbytes(int):接收最大的位元組數,
回傳值: 從channel中的stderr流接收到的資料(位元組),
recv_stderr_ready():
功能:判斷channel中是否有可讀的stderr流,此方法只在不呼叫get_pty的情況下使用exec_command或invoke_shell時channel中stderr流上才擁有資料,
引數:無
回傳值: 如果channel中有stderr流回傳True,否則回傳False,
request_forward_agent( handler):
功能:在channel上請求轉發SSH代理, 僅對來自OpenSSH的ssh-agent有效!
引數:
handler:handler是用于傳入SSH Agen連接的必需可呼叫處理程式 ,
回傳值:沒太懂,貌似只要執行了就回傳True,
get_transport():
功能:獲取與channel關聯的Transport物件,
引數:無
回傳值:Transport物件
getpeername():
功能:獲取遠程服務器的地址,
引數:無
回傳值:遠程服務器的地址
gettimeout():
功能:呼叫“ setblocking”或“ settimeout”設定超時鍵后,可以使用此方法獲取超時時間單位秒,如果沒有設定超時時間回傳None,
引數:無
回傳值:如果設定超時時間回傳超時時間單位秒,否則回傳None,
def request_x11(screen_number=0,
auth_protocol=None,
auth_cookie=None,
single_connection=False,
handler=None):
功能:在channel上請求x11會話, 如果服務器允許,則在Shell會話中運行x11應用程式時,可以從服務器向客戶端發出進一步的x11請求,
引數:
screen_number(int):螢屏號取值范圍0-10,
auth_protocol(str):X11身份驗證使用的協議,如果未指定默認使用“MIT-MAGIC-COOKIE-1”,
auth_cookie(str):x11身份驗證cookie的十六進制字串;如果沒有給定,生成一個安全的隨機128位值,
single_connection(bool):如果為True,則僅轉發一個x11連接,為False可以轉發任意數量的x11連接,
handler=None:handler是X11連接的可選可呼叫處理程式,
回傳值:身份驗證的cookie,
send( s):
功能:發送資料給服務端,s是要發送的資料,但由于發送緩沖大小的原因資料可能無法被一次性發完,需要開發人員檢測資料是否被全部發送,如果資料沒有發送完,需要再次發送后續資料,直到資料全部發送,
引數:
s(str):是要發送的資料,
回傳值:發送的位元組數,
send_exit_status(status):
功能:向客戶端發送退出狀態碼,僅當作為服務端時才有效,
引數:
status(int):退出狀態碼,
回傳值:無
send_ready():
功能:如果channel不需要阻塞可以立即向發送緩沖區中寫入資料回傳True,否則回傳False,注意,如果channel已關閉,任何嘗試向channel發送緩沖區寫入資料都會被立即回傳,因為無法寫入所以被立即回傳,這種情況send_ready也會回傳True,
引數:無
回傳值:如果channel不需要阻塞可以立即向發送緩沖區中寫入資料回傳True,否則回傳False,
send_stderr(s):
功能:向客戶端發送stderr流,僅當作為服務端時才有效,需要開發人員檢測資料是否被全部發送,如果資料沒有發送完,需要再次發送后續資料,直到資料全部發送,
引數:
s(str):要發送的資料,
回傳值:發送的位元組數,
sendall(s):
功能:將資料全部發送出去,與send的區別是,sendall會自動將所有資料全部發送,不需要人為干預,
引數:
s(str):要發送資料,
回傳值:無
sendall_stderr(s):
功能:向客戶端發送stderr流,僅當作為服務端時才有效,與send_stderr區別是sendall_stderr會自動將所有資料全部發送,不需要人為干預,
回傳值:無
set_combine_stderr(combine):
功能:是否將channel中stderr流和stdout流進行合并,默認combine=False,如果為false表示不合并,在呼叫exec_command后只能通過recv_stderr來獲取channel中的stderr流,而不能使用recv,如果為True,表示將stderr流和stdout流進行合并,則無法通過recv_stderr來獲取stderr流,因為stderr已經合并到stdout流中,可以使用recv來獲取,
引數:
combine(bool):True|False,
回傳值:設定的combine的值,
set_environment_variable(name, value):
功能:設定環境變數的值,注意:如果服務端在組態檔中設定AcceptEnv拒絕客戶端設定環境變數,該方法將不會提示設定失敗,
引數:
name(str):環境變數,
value(str):環境變數的值,
回傳值:無
set_name(name):
功能:給channel設定一個名字,
引數:
name(str):channel的名字,
回傳值:無
setblocking(blocking):
功能:設定channel的阻塞模式,如果blocking為0表示非阻塞模式,否則為阻塞模式,在非阻塞模式下如果recv無法立即接收到資料,或者send無法立即發送資料將會引發錯誤例外,在阻塞模式下send或recv會一直等待執行完成,EOF條件被視為recv的“立即資料”,因此,如果channel在讀取方向上關閉,則它將永遠不會阻塞,
引數:
blocking(int):如果是0表示阻塞非阻塞模式,非0是阻塞模式blocking表示的是阻塞時間單位是秒,如果blocking是1表示一直阻塞,直到執行完成,
回傳值:無
settimeout(timeout):
功能:設定超時時間,與setblocking功能類似,不同之處在于timeout可以是None,而setblocking中的blocking引數只能是int型別,而blocking=1就相當于timeout=None,所以兩者功能上基本類似,
引數:
timeout(float):超時時間單位秒,如果timeout為None阻塞模式,一直等到recv接收完成,或send發送完成,
回傳值:無
shutdown(how):
功能:關閉連接的發送端或者接收端,也可以全部關閉,
引數:
how(int):如果how=0,關閉接收端,如果how=1,關閉發送端,如果how=2,關閉發送端和接收端,
回傳值:無
shutdown_read()
功能:關閉連接的接收端,相當于shutdown(0),
引數:無
回傳值:無
shutdown_write():
功能:關閉連接的發送端,相當于shutdown(1),
引數:無
回傳值:無
update_environment(environment):
功能:更新遠程服務器的環境變數,注意:如果服務端在組態檔中設定AcceptEnv拒絕客戶端設定環境變數,該方法將不會提示設定失敗,
引數:
environment(dict):是一個{'環境變數名':'環境變數的值',...},
回傳值:無
SSHClient類
class paramiko.client.SSHClient:
描述:
SSHClient是與SSH服務器回話的高級封裝,其內部實作了身份驗證,執行命令等大多數基礎功能,
close():
功能:關閉SSHClient物件及其底層的Transport,使用完SSHClient物件后,最好呼叫close()關閉物件釋放資源,盡量不依靠python的垃圾回識訓制來關閉SSHClient物件,
引數:無
回傳值:無
connect(hostname, port=22, username=None, password=None, pkey=None,
key_filename=None, timeout=None, allow_agent=True, look_for_keys=True,
compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True,
gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True,
passphrase=None, disabled_algorithms=None)
功能:連接SSH服務器,
引數:
hostname(str):SSH服務器主機地址,
port(int):SSH服務器的埠號,
username(str):登錄SSH服務器的用戶名,
password(str):登錄SSH服務器用戶名的密碼,
pkey(PKey):用于身份驗證的私鑰,
key_filename(str):用于嘗試身份驗證的私鑰或證書的檔案路徑,
time(float):建立TCP連接的超時時間單位是秒,
allow_agent(bool):如果為False,將禁止連接SSH agent,如果為True通過SSH agent獲取私鑰,
look_for_keys(bool):如果為False將禁止在~/.ssh中搜索可用的私鑰,
compress(bool):如果為True將啟用壓縮,
sock(socket):socket物件,
gss_auth(bool):如果為True可以使用GSS-API進行認證,
gss_kex(bool):執行GSS-API密鑰交換和用戶身份驗證,
gss_deleg_creds(bool):是否委托GSS-API客戶端憑據,
gss_host(str):kerberos資料庫中的目標名稱,默認是hostname的值,
gss_trus_dns(bool):是否信任DNS安全規范化所連接主機的名稱(默認為True),
banner_timeout(float):SSH連接成功后banner資訊出現的超時時間單位為秒,
auth_timeout(float):身份認證的超時時間,單位為秒,
disabled_algroitms(dict):直接傳遞給Transport的可選dict及其同名的關鍵字引數,
注意:
Changed in version 1.15: Added the banner_timeout, gss_auth, gss_kex, gss_deleg_creds and gss_host arguments.
Changed in version 2.3: Added the gss_trust_dns argument.
Changed in version 2.4: Added the passphrase argument.
Changed in version 2.6: Added the disabled_algorithms argument.
身份認證的優先級順序(由高到底):
- pkey和key_filename優先級相同,
- 通過SSH agent獲取私鑰(allow_agent=True),
- 本地~/.ssh中發現的“id_rsa”、“id_dsa”或“id_ecdsa”密鑰,
- 通過用戶名密碼的方式進行驗證,
exec_command(
command,
bufsize=-1,
timeout=None,
get_pty=False,
environment=None,
):
功能:執行遠程命令
引數:
command(str):要執行的命令,多條命令用分號隔開,
bufsize(int):0 表示不緩沖,如果為 1 表示進行行緩沖,大于 1 為緩沖區大小,
timeout(float):命令執行的超時時間,單位秒,
get_pty(bool):如果為True相當于Channel.get_pty,向服務器請求一個偽終端,
environment(dict):在執行命令時附加環境變數,
回傳值:回傳一個元組 (stdin, stdout, and stderr)
get_host_keys():
功能:獲取本機秘鑰,
引數:無
回傳值:本地秘鑰HostKey物件,
get_transport():
功能:獲取一個關于當前SSH連接的Transport物件,該物件可用于創建channel,
引數:無
回傳值:Transport物件,
invoke_shell(
term="vt100",
width=80,
height=24,
width_pixels=0,
height_pixels=0,
environment=None,
):
功能:創建一個新的channel,向SSH服務器請求一個偽終端,建立互動式shell環境,
引數:
term(str):終端型別,
width(int):終端寬度(即以字符為計算單位),
height(int):終端高度(即以字符為計算單位),
witth_pixels(int):終端寬度(即以像素為計算單位),
height_pixels(int):終端高度(即以像素為計算單位),
environment(dict):環境變數,
回傳值:回傳一個建立好互動環境的channel物件,
load_host_keys(filename):
功能:從本地檔案中讀取秘鑰后,通過呼叫load_system_host_keys對其秘鑰進行檢查,檢查完成后呼叫save_host_keys()將秘鑰保存回源檔案當中,秘鑰保存在秘鑰保存在self._entries中,當連接一臺未知的主機時,預設策略AutoAddPolicy會將load_host_keys讀取到的秘鑰添加到自己的秘鑰集合中用于驗證未知的服務器,
引數:
filename(str):秘鑰檔案路徑,
回傳值:無
load_system_host_keys(filename=None):
功能:從本地加載秘鑰,如果filename=None,將從本地如~/.ssh下獲取相關秘鑰檔案(不適用于Windows系統),該方法以只讀的方式讀取秘鑰,秘鑰讀取后不會進行回寫,秘鑰保存在self._entries中,
引數:
filename(str):秘鑰檔案路徑,
回傳值:無
open_sftp():
功能:在SSH服務器打開一個SFTP回話,
引數:無
回傳值:SFTPClient物件,
save_host_keys(filename):
功能:將主機秘鑰存回源檔案,僅當使用load_host_keys()方法時,該方法才有效,
引數:
filename(str):秘鑰檔案路徑,
回傳值:無
set_log_channel(name):
功能:設定channel在日志中的名字,默認是paramiko.transport,
引數:
name(str):channel在日志中的名字,可以是任意名字,
回傳值:無
set_missing_host_key_policy(policy):
功能:設定一個秘鑰策略,當連接一臺沒有沒有該主機秘鑰的主機時,使用的秘鑰策略,
引數:
policy(MissingHostKeyPolicy):秘鑰策略,MissingHostKeyPolicy有三種秘鑰策略:RejectPolicy,AutoAddPolicy,WarningPolicy,
class paramiko.client.RejectPolicy:
功能:秘鑰策略,拒絕連接未知秘鑰的主機,已知的主機秘鑰是指由load_system_host_keys 和load_host_keys從檔案中讀取到的秘鑰,該秘鑰保存在在self._entries中,如果self._entries中沒有主機對應的秘鑰條目則視為未知的主機,
class paramiko.client.WarningPolicy:
功能:秘鑰策略,允許連接未知秘鑰的主機,通過用戶提供的秘鑰對主機進行連接,但會發出警告,如下:

class paramiko.client.AutoAddPolicy:
功能:秘鑰策略,允許連接未知秘鑰的主機,并自動將主機和對應的秘鑰添加到本地的HostKeys中,
回傳值:無
參考檔案:http://docs.paramiko.org/en/stable/
======================================================================================
未完待續
======================================================================================
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147255.html
標籤:Python
