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()

执行成功如图

相关推荐
真实的菜7 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
cup117 小时前
[开源] Meta Assistant / 告别命令行,我为一堆 Python 脚本做了一个 Windows 任务栏的“家”
windows·python·工具·nuitka·脚本运行
晨曦中的暮雨8 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小小编程路8 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
qeen878 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
CRMEB系统商城8 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
Samooyou9 小时前
RAG项目案例--02在线检索&过滤流水线
人工智能·python·ai·全文检索·检索
动能小子ohhh9 小时前
DocForge平台的设计与开发--文件上传接口的实现
开发语言·人工智能·python·langchain·ocr·fastapi
满天星83035779 小时前
【Qt】信号和槽(二) (自定义信号和槽)
开发语言·数据库·qt
ab_dg_dp9 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python