Python Paramiko上传文件到win ser2022服务器和反向

在服务器上运行的powershell文件用于打开防火墙规则和打开ssh连接

检查是否存在允许TCP 22端口的防火墙规则

$firewallRuleName = "OpenSSH-Server-In-TCP"

rule = Get-NetFirewallRule -Name firewallRuleName -ErrorAction SilentlyContinue

if (null -eq rule) {

Write-Output "未找到允许SSH连接的防火墙规则,正在创建..."

创建一个新的入站规则来允许TCP 22端口的流量

New-NetFirewallRule -Name $firewallRuleName `

-DisplayName 'OpenSSH Server (sshd)' `

-Enabled True `

-Direction Inbound `

-Protocol TCP `

-Action Allow `

-LocalPort 22

Write-Output "防火墙规则创建成功。"

} else {

Write-Output "已存在允许SSH连接的防火墙规则。"

}

检查是否已安装 OpenSSH 服务器

$openSshCapability = Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'

if (null -eq openSshCapability -or $openSshCapability.State -ne 'Installed') {

Write-Output "OpenSSH 服务器未安装或状态不正确,正在尝试安装..."

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

} else {

Write-Output "OpenSSH 服务器已安装"

}

确保OpenSSH服务正在运行

$service = Get-Service -Name sshd

if ($service.Status -ne 'Running') {

if ($service.Status -eq 'Stopped') {

Write-Output "sshd服务未运行,正在启动..."

Start-Service sshd

Set-Service -Name sshd -StartupType 'Automatic'

} else {

Write-Warning "sshd服务状态异常:(service.Status)"

}

} else {

Write-Output "sshd服务正在运行。"

}

输出当前sshd服务状态

Write-Output "当前sshd服务状态:"

Get-Service sshd

Write-Output "配置完成。你现在应该可以通过SSH远程连接。"

对应的python文件

复制代码
# -*- coding: utf-8 -*-
import paramiko
import os
import subprocess

# ========================
# 配置 SSH 连接信息
# ========================
hostname = ""  # 远程服务器 IP 地址
port = 22
username = ""  # 远程用户名
password = ""  # 登录密码

# ========================
# 本地和远程文件路径
# ========================
remote_base_dir = r"C:\temp\remote_executable_folder"  # 远程目录
remote_exe_name = "hide_test_executable.exe"  # 远程 .exe 文件名
local_download_path = r"F:\downloaded_hide_test_executable.exe"  # 下载到本地的路径

# 创建 SSH 客户端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    # 建立连接
    ssh.connect(hostname=hostname, port=port, username=username, password=password)
    print("[+] SSH 连接已成功建立")

    # 构建远程 exe 路径
    remote_exe_path = os.path.join(remote_base_dir, remote_exe_name)

    # 使用 SFTP 下载文件
    sftp = ssh.open_sftp()

    try:
        sftp.get(remote_exe_path, local_download_path)
        print(f"[+] 文件已从远程服务器下载至: {local_download_path}")
    except Exception as e:
        raise Exception(f"下载文件时出错: {e}")

    # 关闭 SFTP
    sftp.close()

    # ========================
    # 在本地运行下载的 exe 文件
    # ========================
    print("[+] 正在准备在本地运行下载的程序...")

    try:
        result = subprocess.run(local_download_path, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        print("[+] 标准输出:")
        print(result.stdout.decode('gbk', errors='ignore'))
        if result.stderr:
            print("[-] 错误输出:")
            print(result.stderr.decode('gbk', errors='ignore'))
        print("[+] 程序执行结束,退出状态码: 0")
    except subprocess.CalledProcessError as e:
        print(f"[-] 程序执行失败,退出状态码: {e.returncode}")
        print("[-] 错误输出:")
        print(e.stderr.decode('gbk', errors='ignore'))

except FileNotFoundError as fnf_error:
    print(f"[!] 文件错误: {fnf_error}")
except paramiko.AuthenticationException:
    print("[-] 认证失败,请检查用户名或密码")
except paramiko.SSHException as e:
    print(f"[-] SSH 连接异常: {e}")
except Exception as e:
    print(f"[-] 发生了一个未预料的错误: {e}")
finally:
    try:
        ssh.close()
        print("[*] SSH 连接已关闭")
    except:
        pass
相关推荐
Fcy64826 分钟前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满28 分钟前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠1 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥1 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9031 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技2 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀2 小时前
Linux环境变量
linux·运维·服务器
zzzsde2 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
qq_297574673 小时前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
聆风吟º4 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann