代码
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()
执行成功如图
