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

执行成功如图

相关推荐
Zhansiqi6 小时前
day42部分题目
python
小王不爱笑1326 小时前
IO 模型
开发语言·python
kishu_iOS&AI6 小时前
Conda 简要说明与常用指令
python·安全·conda
小陈工7 小时前
FastAPI性能优化实战:从每秒100请求到1000的踩坑记录
python·性能优化·django·flask·numpy·pandas·fastapi
知我Deja_Vu7 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
njidf7 小时前
用Python制作一个文字冒险游戏
jvm·数据库·python
AI+程序员在路上7 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824967 小时前
基于C++的区块链实现
开发语言·c++·算法
呆呆小孩7 小时前
Anaconda 被误删抢救手册:从绝望到重生
python·conda
liliangcsdn7 小时前
LLM复杂数值的提取计算场景示例
人工智能·python