Python如何实现SSH远程连接与文件传输
作者:冰点契约丶
这篇文章主要介绍了Python如何实现SSH远程连接与文件传输问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Python SSH远程连接与文件传输
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 查看参数传递帮助 :param help_info: """ super(Args, self).__init__(description=help_info) def __call__(self, *args, **kwargs): """ :param args: :param kwargs: :return: 返回参数对象,可通过 args.xxx 获取参数 """ 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:远程ip地址 :param username:用户名 :param password:密码 :param port:端口号,默认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: """ 执行命令,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会话,用于将本地文件上传到远程设备 :param local_file_path: 本地文件绝对路径 :param remote_file_path: 远程文件路径:命名方式: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会话,用于将远程设备文件拉取到本地 :param remote_file_path: 远程设备绝对路径 :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执行命令结果
调用paramiko模块
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作。
安装
使用pip可以直接安装
pip3 install paramiko #python3
代码
import os import sys import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 把要连接的机器添加到known_hosts文件中 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 输入参数并进行判断 if len(sys.argv) == 4: ip = sys.argv[1] uname = sys.argv[2] passwd = sys.argv[3] else: #若用户没有输入命令行参数,则提示用户 print("Invalid amount of arguments.") print("example:python3 ssh.py <ip> <uname> <passwd>") sys.exit() # 连接服务器 # 用户名密码 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())
关于linux中stdin, stdout, stderr三个参数的说明
在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,stdin, stdout 和 stderr
三个数据流默认是表现在用户终端上的
执行一个shell命令行时通常会自动打开三个标准文件:
- 标准输入文件(stdin),通常对应终端的键盘;
- 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
证书登录
import os import sys import time import paramiko # 创建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: #若用户没有输入命令行参数,则提示用户 print("Invalid amount of arguments.") print("example:python3 ssh.py <ip> <uname> <passwd>") sys.exit() # 连接服务器 # 私钥证书登录 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())
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。