Python如何實現(xiàn)SSH遠(yuǎn)程連接與文件傳輸
Python SSH遠(yuǎn)程連接與文件傳輸
from paramiko import (SSHClient, SFTPClient, AutoAddPolicy) import argparse class Args(argparse.ArgumentParser): def __init__(self, help_info: str = "remote host login args"): """ 使用 python xx.py -h 查看參數(shù)傳遞幫助 :param help_info: """ super(Args, self).__init__(description=help_info) def __call__(self, *args, **kwargs): """ :param args: :param kwargs: :return: 返回參數(shù)對象,可通過 args.xxx 獲取參數(shù) """ self.add_argument("--ip", help="remote host ip address") self.add_argument("--username", help="SSH login username", default="") self.add_argument("--password", help="SSH login password", default="") self.add_argument("--port", help="remote host port", default=22) return self.parse_args() class SSH(object): def __init__(self, ip_address: str, username: str, password: str, port: int = 22): """ :param ip_address:遠(yuǎn)程ip地址 :param username:用戶名 :param password:密碼 :param port:端口號,默認(rèn)22 """ self.ip = ip_address self.username = username self.password = password self.port = port self.__client = SSHClient() def connect(self) -> None: """ 打開連接 :return:None """ self.__client.set_missing_host_key_policy(AutoAddPolicy()) self.__client.connect(self.ip, self.port, self.username, self.password) def execute(self, command: str) -> None: """ 執(zhí)行命令,stderr未啟用 :param command: windows命令 :return: None """ std_in, stdout, stderr = self.__client.exec_command(command=command) print(stdout.read().decode("utf-8")) def upload_file(self, local_file_path: str, remote_file_path: str) -> None: """ 打開sftp會話,用于將本地文件上傳到遠(yuǎn)程設(shè)備 :param local_file_path: 本地文件絕對路徑 :param remote_file_path: 遠(yuǎn)程文件路徑:命名方式:path+filename :return: """ sftp: SFTPClient = self.__client.open_sftp() try: sftp.put(localpath=local_file_path, remotepath=remote_file_path) print(f"file:{local_file_path} upload success!") except Exception as e: print(f"upload file file,please check whether the file path is correct!\nerror massage:{e} ") def download_file(self, remote_file_path: str, local_save_path) -> None: """ 打開sftp會話,用于將遠(yuǎn)程設(shè)備文件拉取到本地 :param remote_file_path: 遠(yuǎn)程設(shè)備絕對路徑 :param local_save_path: 本地文件保存路徑 命名方式:file +filename 注意需要指定文件名,否則報錯 :return: """ sftp: SFTPClient = self.__client.open_sftp() try: sftp.get(remotepath=remote_file_path, localpath=local_save_path) print(f"file:{remote_file_path} download success!") except Exception as e: print(f"upload file file,please check whether the file path is correct!\nerror massage:{e} ") def get_shell(self) -> None: """ 獲取shell :return: """ while True: command = input(f"{self.ip}@{self.username}$:") if command.__eq__("quit"): break self.execute(command=command) def __del__(self): print("Disconnected!") self.__client.close()
Python建立ssh連接并返回shell執(zhí)行命令結(jié)果
調(diào)用paramiko模塊
paramiko是一個用于做遠(yuǎn)程控制的模塊,使用該模塊可以對遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作。
安裝
使用pip可以直接安裝
pip3 install paramiko #python3
代碼
import os import sys import paramiko # 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() # 把要連接的機器添加到known_hosts文件中 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 輸入?yún)?shù)并進(jìn)行判斷 if len(sys.argv) == 4: ip = sys.argv[1] uname = sys.argv[2] passwd = sys.argv[3] else: #若用戶沒有輸入命令行參數(shù),則提示用戶 print("Invalid amount of arguments.") print("example:python3 ssh.py <ip> <uname> <passwd>") sys.exit() # 連接服務(wù)器 # 用戶名密碼 ssh.connect(hostname=ip, port=22, username=uname, password=passwd) #ssh.connect(hostname='xxx.xxx.xx.xx', port=22, username='xxx', password='xxx') cmd = 'cd /;ls -l;ifconfig' # cmd = 'ls -l;ifconfig' #多個命令用;隔開 stdin, stdout, stderr = ssh.exec_command(cmd) result = stdout.read() if not result: result = stderr.read() ssh.close() print(result.decode())
關(guān)于linux中stdin, stdout, stderr三個參數(shù)的說明
在Linux下,當(dāng)一個用戶進(jìn)程被創(chuàng)建的時候,系統(tǒng)會自動為該進(jìn)程創(chuàng)建三個數(shù)據(jù)流,stdin, stdout 和 stderr
三個數(shù)據(jù)流默認(rèn)是表現(xiàn)在用戶終端上的
執(zhí)行一個shell命令行時通常會自動打開三個標(biāo)準(zhǔn)文件:
- 標(biāo)準(zhǔn)輸入文件(stdin),通常對應(yīng)終端的鍵盤;
- 標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)錯誤輸出文件(stderr),這兩個文件都對應(yīng)終端的屏幕。
進(jìn)程將從標(biāo)準(zhǔn)輸入文件中得到輸入數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯誤信息送到標(biāo)準(zhǔn)錯誤文件中。
證書登錄
import os import sys import time import paramiko # 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() pkey = paramiko.RSAKey.from_private_key_file('/**/**') #私鑰證書路徑 # 把要連接的機器添加到known_hosts文件中 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if len(sys.argv) == 3: ip = sys.argv[1] uname = sys.argv[2] #passwd = sys.argv[3] else: #若用戶沒有輸入命令行參數(shù),則提示用戶 print("Invalid amount of arguments.") print("example:python3 ssh.py <ip> <uname> <passwd>") sys.exit() # 連接服務(wù)器 # 私鑰證書登錄 ssh.connect(hostname=ip, port=22, username=uname, pkey=pkey) cmd = 'cd /;ls -l;ifconfig' # cmd = 'ls -l;ifconfig' #多個命令用;隔開 stdin, stdout, stderr = ssh.exec_command(cmd) time.sleep(5)#增加更多時間來處理命令 result = stdout.read() if not result: result = stderr.read() ssh.close() print(result.decode())
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python編程中簡潔優(yōu)雅的推導(dǎo)式示例詳解
這篇文章主要為大家介紹了python編程中簡潔優(yōu)雅的推導(dǎo)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python實現(xiàn)的微信公眾號群發(fā)圖片與文本消息功能實例詳解
這篇文章主要介紹了Python實現(xiàn)的微信公眾號群發(fā)圖片與文本消息功能,結(jié)合實例形式詳細(xì)分析了Python調(diào)用微信接口實現(xiàn)微信公眾號群發(fā)圖片與文本消息的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下2017-06-06詳解如何使用Pandas刪除DataFrame中的非數(shù)字類型數(shù)據(jù)
在數(shù)據(jù)處理和分析過程中,經(jīng)常會遇到需要清洗數(shù)據(jù)的情況,本文將詳細(xì)介紹如何使用Pandas刪除DataFrame中的非數(shù)字類型數(shù)據(jù),感興趣的小伙伴可以了解下2024-03-03使用python快速實現(xiàn)不同機器間文件夾共享方式
今天小編就為大家分享一篇使用python快速實現(xiàn)不同機器間文件夾共享方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12