如何使用Python連接?SSH?服務(wù)器并執(zhí)行命令
實(shí)際開(kāi)發(fā)中,有時(shí)候經(jīng)常需要查看日志,有時(shí)候使用ssh工具打開(kāi)就為了看一下錯(cuò)誤日志又比較麻煩,所以今天帶來(lái)一個(gè)簡(jiǎn)單的基于python的小工具.
首先需要先安裝一個(gè)庫(kù) paramiko
使用命令直接安裝
pip install paramiko
paramiko庫(kù)是一個(gè)開(kāi)源的、基于SSH2協(xié)議的庫(kù),可以實(shí)現(xiàn)SSH連接以及數(shù)據(jù)的傳輸。
paramiko是用純Python實(shí)現(xiàn)的SSH2客戶端,支持身份驗(yàn)證、SFTP客戶端以及遠(yuǎn)程執(zhí)行命令等功能。paramiko庫(kù)提供了豐富的類(lèi)和方法,幫助用戶快速實(shí)現(xiàn)SSH通信功能。
在實(shí)際應(yīng)用中,paramiko庫(kù)常用于構(gòu)建自動(dòng)化運(yùn)維系統(tǒng)、遠(yuǎn)程部署、多機(jī)協(xié)作等場(chǎng)景.
定義MySshClient 類(lèi)
class MySshClient: def __init__(self, ssh_client): self.ssh_client = ssh_client def exec_command(self, cmd): try: stdin, stdout, stderr = self.ssh_client.exec_command(cmd) return stdin, stdout, stderr except Exception as e: print(f"Error executing command {cmd}: {e}") def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.ssh_client.close() 在此代碼中,我們定義了一個(gè) MySshClient 類(lèi),用于連接 SSH 服務(wù)器并執(zhí)行命令。您可以使用該類(lèi)創(chuàng)建一個(gè)實(shí)例,并通過(guò) connect() 方法連接到 SSH 服務(wù)器。 def connect(host, port, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) try: ssh.load_system_host_keys() ssh.connect(host, port, username, password,timeout=3) except paramiko.AuthenticationException: raise Exception(f"在主機(jī) {host}連接失敗,請(qǐng)檢查你的參數(shù)") except paramiko.SSHException as e: raise Exception(f"在 {host}連接出錯(cuò): {e}") except paramiko.BadHostKeyException as e: raise Exception(f" {host} 無(wú)法驗(yàn)證通過(guò): {e}") except Exception as e: raise Exception(f" 連接到{host}:{port}: {e}超時(shí)") return ssh
這個(gè)是給函數(shù)加上異常處理,方便代碼的調(diào)試
執(zhí)行命令
在連接到 SSH 服務(wù)器后,您可以使用 exec_command() 方法執(zhí)行命令。該方法返回一個(gè)元組,包含服務(wù)器的輸出、錯(cuò)誤和輸入。您可以將此元組提供給 with 關(guān)鍵字,以便在需要時(shí)進(jìn)行處理。
2.連接到主機(jī)
在連接到 SSH 服務(wù)器之前,您需要指定主機(jī)名、端口、用戶名和密碼。例如:
host = input("Host: 請(qǐng)輸入主機(jī)名") port = int(input("Port: 默認(rèn)為22")or 22) username = input("Username: 請(qǐng)輸入用戶名") password = getpass.getpass("Password: 請(qǐng)輸入密碼")
port = int(input(“Port: 默認(rèn)為22”)or 22) 這段代碼的意思是
默認(rèn)端口22,如果你的ssh端口不是22,可以自行修改
密碼的話,如果不想被別人看見(jiàn),使用getpass函數(shù)進(jìn)行加密
創(chuàng)建并連接到 MySshClient 實(shí)例
ssh = connect(host, port, username, password)
連接成功后,執(zhí)行命令并處理輸出
連接成功后,您可以使用 exec_command() 方法執(zhí)行命令,并使用 with 關(guān)鍵字處理服務(wù)器的輸出:
with MySshClient(ssh) as client: stdin, stdout, stderr = client.exec_command("ls -l") with stdout: print(stdout.read().decode()) with stderr: print(stderr.read().decode())
這將在連接到 SSH 服務(wù)器后,執(zhí)行 “ls -l” 命令,并輸出結(jié)果。請(qǐng)注意,此示例僅顯示輸出,如果有錯(cuò)誤,錯(cuò)誤信息將顯示在控制臺(tái)。
完整代碼如下:
import paramiko import os import getpass class MySshClient: def __init__(self, ssh_client): self.ssh_client = ssh_client def exec_command(self, cmd): try: stdin, stdout, stderr = self.ssh_client.exec_command(cmd) return stdin, stdout, stderr except Exception as e: print(f"Error executing command {cmd}: {e}") def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.ssh_client.close() def connect(host, port, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) try: ssh.load_system_host_keys() ssh.connect(host, port, username, password,timeout=3) except paramiko.AuthenticationException: raise Exception(f"在主機(jī) {host}連接失敗,請(qǐng)檢查你的參數(shù)") except paramiko.SSHException as e: raise Exception(f"Error connecting to {host}: {e}") except paramiko.BadHostKeyException as e: raise Exception(f"Host key for {host} could not be verified: {e}") except Exception as e: raise Exception(f" 連接到{host}:{port}: {e}超時(shí)") return ssh if __name__ == '__main__': host = input("Host: 請(qǐng)輸入主機(jī)名") port = int(input("Port: 默認(rèn)為22")or 22) username = input("Username: 請(qǐng)輸入用戶名") password = getpass.getpass("Password: 請(qǐng)輸入密碼") print('連接中...........') ssh = connect(host, port, username, password,) with MySshClient(ssh) as client: stdin, stdout, stderr = client.exec_command("ls -l") with stdout: print(stdout.read().decode()) with stderr: print(stderr.read().decode())
當(dāng)然你也可以使用sftp進(jìn)行傳輸
# 上傳 current_path = os.getcwd() #獲取當(dāng)前路徑 print(current_path) filename = '\\main.py' # 文件名 file = current_path + f'{filename}' # 當(dāng)前文件的路徑 sftp = client.open_sftp() # 使用sftp連接 sftp.put(file, '/root/main.py') # 上傳文件 sftp.get('/root/server.sh', current_path+'/code.sh') #下載文件
到此這篇關(guān)于使用 Python 連接 SSH 服務(wù)器并執(zhí)行命令的文章就介紹到這了,更多相關(guān)Python 連接 SSH 服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python如何實(shí)現(xiàn)SSH遠(yuǎn)程連接與文件傳輸
- python paramiko連接ssh實(shí)現(xiàn)命令
- Python基于ssh遠(yuǎn)程連接Mysql數(shù)據(jù)庫(kù)操作
- Python用SSH連接到網(wǎng)絡(luò)設(shè)備
- Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例
- python下paramiko模塊實(shí)現(xiàn)ssh連接登錄Linux服務(wù)器
- Python實(shí)現(xiàn)建立SSH連接的方法
- Python自動(dòng)連接ssh的方法
- Python自動(dòng)連接SSH的實(shí)現(xiàn)步驟
相關(guān)文章
Python文件操作中進(jìn)行字符串替換的方法(保存到新文件/當(dāng)前文件)
這篇文章主要介紹了Python文件操作中進(jìn)行字符串替換的方法(保存到新文件/當(dāng)前文件) ,本文給大家介紹兩種方法,每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06在Python中預(yù)先初始化列表內(nèi)容和長(zhǎng)度的實(shí)現(xiàn)
今天小編就為大家分享一篇在Python中預(yù)先初始化列表內(nèi)容和長(zhǎng)度的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python 3實(shí)戰(zhàn)爬蟲(chóng)之爬取京東圖書(shū)的圖片詳解
最近在學(xué)習(xí)python3,下面這篇文章主要給大家介紹了關(guān)于Python3實(shí)戰(zhàn)爬蟲(chóng)之爬取京東圖書(shū)圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-10-10解讀調(diào)用jupyter?notebook文件內(nèi)的函數(shù)一種簡(jiǎn)單方法
這篇文章主要介紹了解讀調(diào)用jupyter?notebook文件內(nèi)的函數(shù)一種簡(jiǎn)單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python實(shí)現(xiàn)ElGamal加密算法的示例代碼
ElGamal加密算法是一個(gè)基于迪菲-赫爾曼密鑰交換的非對(duì)稱加密算法。這篇文章通過(guò)示例代碼給大家介紹Python實(shí)現(xiàn)ElGamal加密算法的相關(guān)知識(shí),感興趣的朋友一起看看吧2020-06-06分享5個(gè)python提速技巧,速度瞬間提上來(lái)了
這篇文章主要給大家分享的是5個(gè)python提速技巧,工作或者學(xué)習(xí)的過(guò)程中難免會(huì)遇到卡頓問(wèn)題,下面的提速技巧具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01