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/
======================================================================================
未完待續
======================================================================================