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


猜你喜欢
- 最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在
- 前言JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,
- 本例已经实现的数据库password,数据库的表以及表结构如下:表中已经插入的信息:实现思路无非是用户完成账户密码输入并点击登录
- 本文实例讲述了python常见数制转换用法。分享给大家供大家参考。具体分析如下:1.进位制度Python中二进制是以0b开头的:例如: 0b
- 本文实例为大家分享了python发送邮件的具体代码,供大家参考,具体内容如下#!/usr/bin/env python # -*- codi
- 一. 概述首先需要先介绍一下无监督学习,所谓无监督学习,就是训练样本中的标记信息是位置的,目标是通过对无标记训练样本的学习来揭示数据的内在性
- 一、项目展示这是一款简单实用的小时钟工具分为工作和休息两种状态用户可以设置相应的时间所有的时钟记录都会被保存下来二、首页首页由计时器、任务输
- 1. 什么是存储过程?存储过程是SQL server所提供的Tran
- 最近闲来无事, 于是就简单学习了下Go语言的基本的用法。由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言文件下载
- 前言:柱状图是一种使用矩形柱来表示数据分布的图表,可以横向排列,也可以纵向排列,它的高度或长度和他们所代表的值成正比关系。Matplotli
- 本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。代码: contours.pyOpenCV 提供了 findContour
- 好不容易有个周末,不能闲着,趁着这个时间安装sql server2016正式版,下载那个安装包都用了一个星期安装包可以从这里下载:http:
- 前言:在开发中经常会与时间打交道,如:获取事件戳,时间戳的格式化等,这里简要记录一下python操作时间的方法。python中常见的处理时间
- 前言在做图像处理的时候,有时候需要得到整个数据集的均值方差数值,以下代码可以解决你的烦恼:(做这个之前一定保证所有的图片都是统一尺寸,不然算
- 本例使用登录页面演示,session的状态保持功能。说明:因为http是无状态的,客户端请求一次页面后,就结束了,当再次访问时,服务器端并不
- PyTorch加载模型model.load_state_dict()问题希望将训练好的模型加载到新的网络上。如上面题目所描述的,PyTorc
- 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张
- 本文实例讲述了Python HTML解析模块HTMLParser用法。分享给大家供大家参考,具体如下:简介先简略介绍一下。实际上,HTMLP
- 第一: MySQL的安装下载MySQL软件,修改安装路径之后安装数据库MySQL5.7.18第一步:数据库MySQL
- #!/usr/bin/python## get subprocess module import subprocess ## ca