一、SSHClient入門
SSHClient是一個Python第三方庫,可以用來通過SSH協議連接遠程服務器,實現遠程操作。在使用SSHClient之前,需要先安裝paramiko庫,使用pip install paramiko進行安裝。
通過SSHClient對象可以完成各種遠程功能,例如執行命令,上傳文件,下載文件等等。連接遠程服務器的方法如下所示,其中hostname為服務器地址,username為你的用戶名,password為你的密碼。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='myserver.com', username='myusername', password='mypassword')
其中set_missing_host_key_policy方法是為了自動添加新的主機密鑰(policy)。如果不添加這行代碼, 當新的主機出現時, python會拋出警告信息, 需要用戶手動添加該主機的密鑰。
二、遠程命令執行
一個典型的遠程服務器管理任務就是執行遠程命令。在SSHClient中,可以使用execute方法來實現。例如,要在遠程服務器中執行ls命令,可以通過以下命令來完成:
stdin, stdout, stderr = client.exec_command('ls') print(stdout.read())
其中exec_command的參數為要執行的命令。stdout.read()是讀取命令執行結果的方法。類似地, 命令執行的結果也可以寫入文件,例如:
stdin, stdout, stderr = client.exec_command('ls > dirlist.txt')
以上命令會把ls命令的結果寫入到遠程服務器上的dirlist.txt文件中。
三、文件上傳和下載
SSHClient也可以用於上傳和下載文件。
上傳文件:
sftp = client.open_sftp() sftp.put(localFilePath, remoteFilePath)
其中,localFilePath為本地文件路徑,remoteFilePath為遠程文件路徑。例如,上傳本地/home/user/Desktop/localfile.txt到遠程服務器上的/home/user/server/remote.txt,可以使用以下語句:
sftp.put('/home/user/Desktop/localfile.txt', '/home/user/server/remote.txt')
下載文件:
sftp = client.open_sftp() sftp.get(remoteFilePath, localFilePath)
其中remoteFilePath表示遠程主機上的文件路徑,localFilePath表示本地要下載到的文件路徑。
四、連接池的使用
在高並發的情況下,單獨使用SSHClient可能會存在一些問題。為了解決這個問題,可以定義一個連接池來管理連接。
使用連接池可以有效的降低創建和銷毀連接的成本。Python的paramiko庫提供了對連接池的支持,操作方法與Python內置的線程池非常相似。下面是一個簡單的例子:
from paramiko import SSHClient, AutoAddPolicy from paramiko.pool import ConnectionPool pool = ConnectionPool(10, 30, SSHClient, AutoAddPolicy(), username='myusername', password='mypassword', hostname='myserver.com') conn = pool.acquire() stdin, stdout, stderr = conn.exec_command('ls') pool.release(conn)
其中ConnectionPool()的第一個參數是連接池中連接的最小數量,第二個參數是連接池中連接的最大數量。
五、異常處理和調試
SSHClient連接遠程服務器時可能會出現各種錯誤,例如連接拒絕,認證失敗等等。正確的錯誤處理方式會讓你更快地找到問題所在。在SSHClient中,錯誤往往以SSHException的形式拋出,因此,我們可以使用try和except語句來捕獲並顯示錯誤。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(hostname='myserver.com', username='myusername', password='mypassword') except paramiko.AuthenticationException as e: print("認證失敗") except paramiko.SSHException as e: print("SSH連接錯誤:", str(e)) except Exception as e: print("連接錯誤:", str(e)) else: stdin, stdout, stderr = client.exec_command('ls') print(stdout.read()) finally: client.close()
此外,在進行SSHClient編程時,可以考慮開啟調試模式,以方便排查問題。啟用調試模式方法如下:
import paramiko paramiko.util.log_to_file('paramiko.log') client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='myserver.com', username='myusername', password='mypassword')
以上代碼會把paramiko的日誌打印到paramiko.log文件中,方便調試時查看。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/199584.html