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

执行成功如图

相关推荐
sunywz17 小时前
【JVM】(4)JVM对象创建与内存分配机制深度剖析
开发语言·jvm·python
亲爱的非洲野猪17 小时前
从ReentrantLock到AQS:深入解析Java并发锁的实现哲学
java·开发语言
星火开发设计17 小时前
C++ set 全面解析与实战指南
开发语言·c++·学习·青少年编程·编程·set·知识
wheelmouse778817 小时前
如何设置VSCode打开文件Tab页签换行
java·python
0思必得017 小时前
[Web自动化] Selenium基础介绍
前端·python·selenium·自动化·web自动化
沛沛老爹17 小时前
Web开发者进阶AI:Agent Skills-深度迭代处理架构——从递归函数到智能决策引擎
java·开发语言·人工智能·科技·架构·企业开发·发展趋势
Good_Starry17 小时前
Java——正则表达式
java·开发语言·正则表达式
二哈喇子!17 小时前
前端HTML、CSS、JS、VUE 汇总
开发语言·前端
欧洵.17 小时前
Java.基于UDP协议的核心内容
java·开发语言·udp