paramiko 模塊
paramiko 是一個用 Python 語言編寫的、遵循 SSH2 協(xié)議、支持以加密和認(rèn)證方式進行連接遠程服務(wù)器的模塊。改模塊可以對遠程服務(wù)器進行一些命令或文件操作。
安裝
使用 pip3 安裝 paramiko 模塊
pip3 install paramiko
常用函數(shù)
SSHclient 類
SSH 客戶端
1.connect:遠程連接服務(wù)器
# hostname:主機IP地址# port:ssh服務(wù)的端口號,默認(rèn)為22# username和password:用戶名和密碼# timeout 連接的超時時間connect(hostname, port=22, username=None, password=None, timeout=None,…)
2.exec_command:遠程執(zhí)行命令
# command:需要執(zhí)行的命令# timeout:連接超時設(shè)置exec_command(command, timeout=None,…)
3.invoke_shell:生成交互的Shell
# term:終端的類型# width,height:生成終端的寬度和高度# width_pixels,height_pixels:像素為單位的終端寬度和高度# environment:命令的環(huán)境invoke_shell(term=’vt100′, width=80, height=24, width_pixels=0, height_pixels=0, environment=None)
4.open_sftp:打開 sftp
open_sftp()
Channel類
SSH2 的抽象通道
1.get_pty:打開一個終端
# 從服務(wù)器請求一個終端,在創(chuàng)建連接通道之后立刻使用這個命令,要求服務(wù)器為 invoke_shell() 提供調(diào)用 shell 的終端語義get_pty(*args, **kwds)
2.send(s)/sendall(s):發(fā)送命令
# s:發(fā)送的命令,send(s)sendall(s)
3.settimeout(timeout):設(shè)置超時時間
settimeout(timeout)
4.shutdown(how):關(guān)閉連接
# how:0(停止接收),1(停止發(fā)送)或2(停止接收和發(fā)送)shutdown(how)
SFTP Client類
用 SFTP 的方式打開 SSH 連接,并遠程執(zhí)行文件操作,可用于上傳和下載文件。
1.chmod:為文件賦予執(zhí)行權(quán)限
# path:文件路徑# mode:執(zhí)行權(quán)限chmod(path, mode)
2.close:關(guān)閉連接通道
close()
3.file/open:打開文件
# filename:文件名# mode:文件的讀寫模式# bufsize:所需要的緩存大小file(filename, mode=’r’, bufsize=-1)open(filename, mode=’r’, bufsize=-1)
4.get:下載文件
# remotepath:遠程文件路徑# localpath:本地文件路徑# callback:文件下載完成后執(zhí)行的函數(shù)get(remotepath, localpath, callback=None)
5.getcwd:當(dāng)前遠程文件路徑
getcwd()
6.listdir:文件列表
# path:文件夾路徑listdir(path=’.’)
7.mkdir:創(chuàng)建文件夾
# path:文件夾路徑# mode:文件夾權(quán)限mkdir(path, mode=511)
8.posix_rename/rename:重命名文件
# oldpath:需要重命名的文件# newpath:新的文件路徑posix_rename(oldpath, newpath)rename(oldpath, newpath)
9.put:上傳文件
# localpath:本地文件路徑# remotepath:遠程文件路徑# callback:上傳完成后調(diào)用的函數(shù)# confirm:是否對文件確認(rèn)大小put(localpath, remotepath, callback=None, confirm=True)
10.remove/rmdir:刪除文件
# path:文件路徑remove(path)rmdir(path)
實例
連接遠程服務(wù)器
paramiko 模塊連接遠程服務(wù)器可以使用遠程服務(wù)器的用戶名、密碼登錄
import paramiko# 創(chuàng)建一個SSHClient對象ssh = paramiko.SSHClient()# 將信任的主機加到 host_allow 列表ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接服務(wù)器ssh.connect(“服務(wù)器IP地址”, “服務(wù)器端口號”, “用戶名”, “密碼”)
使用命令
在登錄遠程服務(wù)器后,利用 paramiko 模塊可以使用 shell 命令操作遠程服務(wù)器,比如:df 命令、pwd 命令、cat 命令等等…
# 打印磁盤情況# 執(zhí)行df命令,結(jié)果放到 dfout 中,如果有錯誤將放到 dferr 中dfout, dferr = ssh.exec_command(‘df’)print(dfout.read().decode(‘utf-8’))# 使用cd、cat命令查看文件內(nèi)容# paramiko.txt文件為/root/data/paramiko.txtcatin, catout,caterr = ssh.exec_command(‘cd data;cat paramiko.txt’)print(catin.read().decode(‘utf-8’))
在 exec_command 函數(shù)中,exec_command 執(zhí)行的是單個會話,執(zhí)行完成后會回到登錄的缺省目錄,多個命令需要 命令1;命令2;命令3 的寫法
sftp 上傳和下載文件
import paramikotransport = paramiko.Transport((“服務(wù)器IP地址”,服務(wù)器端口號))transport.connect(username = “用戶名”, password = “密碼”)sftp = paramiko.SFTPClient.from_transport(transport)# 從遠程服務(wù)器下載文件# 遠程服務(wù)器文件路徑為/data/paramiko.txtsftp.get(‘/data/paramiko.txt’, ‘paramiko.txt’, print(“下載完成!”))# 從本地上傳文件到遠程服務(wù)器sftp.put(‘upload_paramiko.txt’, ‘/data/upload_paramiko.txt’, print(“上傳完成!”))
服務(wù)器文件修改內(nèi)容
sftp 對象可以在線修改遠程服務(wù)器上文件的內(nèi)容
import paramiko# 登錄遠程服務(wù)器client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(“服務(wù)器IP地址”,,”服務(wù)器端口號”,”用戶名”, “密碼”, timeout=5)sftp = client.open_sftp()# 遠程服務(wù)器文件地址為/data/paramiko.txtremoteFile = sftp.open(“/data/paramiko.txt”, ‘a’)remoteFile.write(“”);remoteFile.write(“這里是追加的內(nèi)容!”);remoteFile.close()sftp.close()
查詢文件
使用 sftp 對象獲取遠程服務(wù)器上的文件列表
import paramikoclient = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(“服務(wù)器IP地址”,,”服務(wù)器端口號”,”用戶名”, “密碼”, timeout=5)sftp = client.open_sftp()for fileName in sftp.listdir(“/root/data”): if fileName.endswith(“.txt”): print(fileName)sftp.close()
在 Linux 模擬終端
import paramikoimport selectimport sysimport ttyimport termios# 創(chuàng)建一個安全的通道trans = paramiko.Transport((‘IP地址’, 22))# 啟動一個客戶端trans.start_client()# 如果使用用戶名和密碼登錄trans.auth_password(username=’用戶名’, password=’密碼’)# 打開一個通道channel = trans.open_session()# 獲取一個終端channel.get_pty()# 激活終端channel.invoke_shell()# 獲取Linux操作終端的屬性oldtty = termios.tcgetattr(sys.stdin)try: # 將Linux操作終端的屬性設(shè)置為 SSH 服務(wù)器的終端屬性,并使用 TAB 鍵 tty.setraw(sys.stdin) channel.settimeout(0) while True: read_list, write_list, err_list = select.select([channel, sys.stdin,], [], []) # 輸入命令,sys.stdin會發(fā)生變化 if sys.stdin in read_list: # 獲取輸入的內(nèi)容 input_cmd = sys.stdin.read(1) # 將命令發(fā)送給服務(wù)器 channel.sendall(input_cmd) # SSH服務(wù)器返回結(jié)果 if channel in read_list: result = channel.recv(1024) # 斷開連接后退出 if len(result) == 0: print(“連接斷開了!”) break sys.stdout.write(result.decode()) sys.stdout.flush()finally: # 還原Linux終端屬性 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)channel.close()trans.close()
結(jié)語
以上是 paramiko 模塊的基本操作,學(xué)會以上內(nèi)容后在多個遠程服務(wù)器的情況下,可以快速、便捷的操作服務(wù)器內(nèi)容