网络编程
位置:首页>> 网络编程>> Python编程>> Python如何实现SSH远程连接与文件传输

Python如何实现SSH远程连接与文件传输

作者:冰点契约丶  发布时间:2023-06-12 12:34:02 

标签: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())

来源:https://blog.csdn.net/qq_52751442/article/details/121908302

0
投稿

猜你喜欢

  • Css Reset是什么? 有些同行叫 "css复位",有些可能叫 "默认css".....相信看完
  • 这两天做基于 Flash9(ActionScript 3.0)的 JavaScript PHPRPC 3.0 客户端时遇到了一些 JavaS
  • 前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管
  • 以下函数采用FSO对象,文件位置在FSO.ASP。FSO对象的文件编码属性只有三种,系统默认,Unicode,ASCII,并没有我们要的ut
  • javascript中要判断一个变量是否为array通常是比较困难的,因为var a = [];alert(t
  • 一直以来,ACCESS数据库中的申报数据在分公司与总公司之间传递,用EXCEL或DBASE、TXT甚至ACCESS等格式,我总觉得不太理想。
  • 前段时间在开发雨哲树网程序的时候,遇到需要转换地址中的参数,需要用到简单可逆运算的加密功能。在网上找了很多都不理想。因为我需要的这个可逆运算
  • Microsoft office Access Database Engine 错误 '80040e14' Insert I
  • 如果你是个赛车手,并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是什么感觉呢?MySQL数据库为开发人员所做的就好像是按按
  • 这里主要是讲在asp下两次由access数据库升级到sql server数据库后的经验及注意事项,其它语言也可以参考一下。欢迎讨论补充。1.
  • 在使用javascript编程时浏览器中经常会遇到的两个麻烦,下面提供两个函数解决方式做参考,并提供一个demo让你更直观地了解我所说的这两
  • 1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。 2、 开始->程序->Oracle - OraHome81-
  • 最近 UCDChina 以“注意界面上的文字”为主题写了一系列的文章,使我在界面文字上的使用受益匪浅。之后,我对按钮上的内容的表现也做了一些
  • 生成HTML方法主要步骤只有两个:一、获取要生成的html文件的内容二、将获取的html文件内容保存为html文件我在这里主要说明的只是第一
  • 发现很多朋友对 CSS 的优先权不甚了解,规则很简单。需要说明的一点,如果你的样式管理需要深层判断 CSS 的优先权,更应反思自己的 CSS
  •  问:我想问一下我在重新装完系统以后装SQL Server2000时提示:以前某个程序安装已在计算机上创建挂起的文件操作,运行安装
  • 在我的前一篇教程《九宫格基本布局》中,我介绍了用相对定位加绝对定位的方法来制作九宫格的基本布局。这是一种比较符合人们惯性思维的方法,好像制作
  • 有使用过VS2005开发工具的朋友或者其他语句如js中都有Try catch 语句块,那么在mysql中是否能有SQLserver的@@er
  • 摘要: 本文由简到繁地介绍了以jQuery作为蓝本的js框架开发步聚, 希望借助本文大家对jQuery这样的框架内部有一个大致的认识。推荐:
  • 操作实现函数: 代码如下:Function AddWater(n) Set Photo = 
手机版 网络编程 asp之家 www.aspxhome.com