python测试SFTP连通性

代码

bash 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import paramiko
import socket
import os

# ======== 配置参数(根据你的环境修改) ========
HOST = "0.0.0.0"      # 填写SFTP服务器地址
PORT = 22                      # SFTP端口(默认22)
USERNAME = "user"          # 填写用户名
PASSWORD = "12346"          # 填写密码(如果用私钥登录,留空)
PRIVATE_KEY_PATH = None        # 私钥路径,如 "/home/user/.ssh/id_rsa",不用则设为 None
TIMEOUT = 60                  # 超时时间(秒)
REMOTE_DIR = "/incoming"       # 填写测试切换的远程目录(可选)
UPLOAD_FILE = None             # 本地文件路径,用于上传测试(可选)
DOWNLOAD_FILE = None           # 远程文件名或本地保存路径(可选)
# ============================================

def test_sftp():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 测试环境自动接受主机密钥

    try:
        # 加载私钥(如果指定)
        pkey = None
        if PRIVATE_KEY_PATH:
            pkey = paramiko.RSAKey.from_private_key_file(PRIVATE_KEY_PATH)

        print(f"[INFO] Connecting to {HOST}:{PORT} ...")
        client.connect(
            hostname=HOST,
            port=PORT,
            username=USERNAME,
            password=PASSWORD,
            pkey=pkey,
            timeout=TIMEOUT,
            banner_timeout=TIMEOUT,
            auth_timeout=TIMEOUT,
        )
        print("[OK] SSH connected")

        # 打开 SFTP
        sftp = client.open_sftp()
        print("[OK] SFTP channel opened")

        # 切换目录(可选)
        if REMOTE_DIR:
            sftp.chdir(REMOTE_DIR)
            print(f"[OK] Changed directory to {REMOTE_DIR}")

        # 当前目录 & 列表
        pwd = sftp.getcwd()
        print(f"[OK] Current directory: {pwd}")
        print("[OK] Directory listing:")
        for name in sftp.listdir():
            print("   ", name)

        # 上传测试(可选)
        if UPLOAD_FILE:
            basename = os.path.basename(UPLOAD_FILE)
            sftp.put(UPLOAD_FILE, basename)
            print(f"[OK] Uploaded: {basename}")

        # 下载测试(可选)
        if DOWNLOAD_FILE:
            remote_name = os.path.basename(DOWNLOAD_FILE)
            local_target = DOWNLOAD_FILE
            if os.path.isdir(DOWNLOAD_FILE):
                local_target = os.path.join(DOWNLOAD_FILE, remote_name)
            sftp.get(remote_name, local_target)
            print(f"[OK] Downloaded: {remote_name} -> {local_target}")

        sftp.close()
        client.close()
        print("[OK] SFTP test completed successfully")

    except (paramiko.SSHException, socket.error) as e:
        print(f"[ERROR] SFTP error: {e}")
    except Exception as e:
        print(f"[ERROR] Unexpected error: {e}")
    finally:
        try:
            client.close()
        except Exception:
            pass

if __name__ == "__main__":
    test_sftp()

执行成功如图

相关推荐
去码头整点薯条ing20 分钟前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
脱胎换骨-军哥21 分钟前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom41 分钟前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo1 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
赶紧写完去睡觉1 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀1 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Herbert_hwt1 小时前
建立Java程序开发
java·开发语言
你驴我2 小时前
WhatsApp 多账号下消息已读回执的实时聚合与推送实践
后端·python
愚公移码2 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
十月的皮皮2 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库