• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

雇的辣客

雇的辣客
  • 博客园
  • 联系
  • 管理

公告

View Post

Python 实现的 SFTP 服务要求windows和linux可以互相通信,并传输文件

要求windows和linux可以互相通信,并传输文件

 

如何用 Python 实现一个 SFTP 服务

随着云计算和网络服务的蓬勃发展,SFTP(SSH File Transfer Protocol)作为一种安全的文件传输方式,广泛应用于企业和个人文件的安全传输。而 Python 作为一种简单易上手的编程语言,可以方便地实现 SFTP 服务。本文将详细介绍如何用 Python 创建一个 SFTP 服务,帮助刚入行的小白开发者掌握这一技能。

整体流程

在开始之前,我们首先给出整体开发流程的表格:

步骤编号步骤描述代码/说明
1 安装必要的库 pip install paramiko
2 创建 SFTP 服务器 paramiko 库的使用
3 设置目录和权限 配置文件及设置用户权限
4 启动 SFTP 服务 启动服务并进行状态监控
5 测试和验证 使用 SFTP 客户端测试连接和文件传输

接下来,我们将逐步详细阐述每个步骤。

步骤详解

1. 安装必要的库

在开始编写代码之前,首先需要安装 paramiko 库。这个库提供了 SSH 和 SFTP 的功能。

pip install paramiko
  • 1.
 

以上命令会安装 paramiko 库,这是创建 SFTP 服务所需的基本库。

2. 创建 SFTP 服务器

接下来,我们需要创建一个 SFTP 服务器。下面的代码演示了如何使用 paramiko 创建一个 SFTP 服务器。

import paramiko
import os

# 创建一个 SSH 服务器
class SFTPServer(paramiko.ServerInterface):
    def __init__(self):
        self.event = threading.Event()
        self.event.set()

    def check_auth_password(self, username, password):
        if username == 'test' and password == 'password':
            return paramiko.AUTH_SUCCESSFUL
        return paramiko.AUTH_FAILED

# 启动 SSH 服务器
def start_sftp_server(port=22):
    server = paramiko.Transport(('0.0.0.0', port))
    server.add_server_key(paramiko.RSAKey(filename='test_rsa.key'))
    server.start_server(server= SFTPServer())

    channel = server.accept(20)
    if channel is None:
        print('没有连接请求')
        return

    print('连接建立')
    sftp = paramiko.SFTPServer(channel, 'server_root_path')
    sftp.serve_forever()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
 

以上代码包括了创建 SFTP 服务器的基本操作以及用户认证方法。

3. 设置目录和权限

在这一步,我们需要确保服务器有一个根目录并设置合适的权限,以便用户可以安全地上传和下载文件。

import os

# 创建根目录
ROOT_DIR = 'server_root_path'

if not os.path.exists(ROOT_DIR):
    os.mkdir(ROOT_DIR)

# 设置权限
os.chmod(ROOT_DIR, 0o755)  # 755: rwxr-xr-x
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
 

上述代码创建了一个服务器根目录并为其设置了基本的文件权限。

4. 启动 SFTP 服务

结合前面的代码,我们现在来整合启动 SFTP 服务的所有部分。

import threading
import paramiko

HOST_KEY = paramiko.RSAKey.generate(2048)

if not os.path.exists('test_rsa.key'):
    HOST_KEY.write_private_key_file('test_rsa.key')

# 创建 SFTP 服务器
def run_server():
    start_sftp_server()

threading.Thread(target=run_server).start()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
 

此代码生成了一个 RSA 密钥并启动了 SFTP 服务器。

5. 测试和验证

启动服务后,可以使用任何 SFTP 客户端(如 FileZilla)进行连接测试,用户名和密码均为 ‘test’ 和 ‘password’。

sftp test@localhost
  • 1.
 

在 SFTP 客户端使用上述命令连接到服务器,输入密码后就可以进行文件传输。

状态监控

服务器启动后,可以通过输出信息查看当前状态。在代码中,可以适当加注释来增强可读性和可维护性。

print('SFTP 服务已启动')
  • 1.
 

示例序列图

以下是 SFTP 服务的工作流序列图,用于展示客户端与服务器之间的交互过程。

SFTP ServerClientSFTP ServerClient连接到服务器认证请求提交用户名和密码认证成功上传文件文件上传成功下载文件文件下载成功

结论

通过以上步骤,我们成功地创建了一个用 Python 实现的 SFTP 服务。这

 

1、要求windows和linux可以互相通信,并传输文件
2、要求window和windows可以互相通信,并传输文件

环境
1、本地:win10企业版x64 ,python:3.8.7

2、linux服务端:ubuntu20.04 x64

3、windows服务端:win10专业版 x64

windows连接linux系统失败问题
windows连接linux系统失败,出现以下错误


排查流程
1、查看linux上是否ssh服务,打开终端,输入ssh,看是否有该命令功能:


2、如果没有的话进行安装,如果有进行下一步:

命令:sudo apt-get install openssh-server openssh-client
1
3、判断ssh配置文件里的端口是否为22:

命令:cat /etc/ssh/ssh_config
1
4、如果不是可以修改,如果是,查看端口22是否开通:

命令:netstat -ntl
1

5、若开通后连接还是提示:TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败;

6、可能是防火墙导致无法通信,查看防火墙是否关闭:

命令:sudo ufw status
1
7、可以看到防火墙是开始状态,关闭防火墙;

命令:sudo ufw disable
1
8、再进行连接即可连接成功。
设置重启系统防火墙服务不启动
1)查询服务自启动的列表

systemctl list-unit-files
1

2)关闭自启动服务

systemctl disable ufw.service
1

3)再次查看服务自启动列表如下


4)、重启系统验证,发现系统重启后防火墙还是关闭状态。

windows连接windows系统失败问题
为了保证代码的一致性,所以windows上也采用paramiko的方式进行连接。
windows连接Windows系统失败,出现以下错误:


排查流程
确保ssh先能通信成功。
1、安装ssh(本地和服务端都要安装)

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
1

2、安装后,通过命令(管理员权限)或服务中,都启动失败,提示“拒绝访问”;

3、最后进入到OpenSSH官网下载了一个新版本(下载的是V8.6.0.0p1-Beta最新的版本),然后重复上面的安装步骤,则服务可以启动;

如何设置为开机自启动
1)管理员权限启动终端,输入以下命令:

命令:sc config sshd start=auto
1

2)将ssh目录加入到环境变量中,重启终端,直接输入ssh就可以运行该服务。

4、使用ssh连接,提示:

ssh: connect to host [server_ip] port 22: Connection timed out


5、怀疑防火墙导致的,便尝试关闭试试
1)查看防火墙状态

netsh advfirewall show allprofiles
1
2)如若防火墙状态开启,则关闭windows上防火墙

netsh advfirewall set allprofiles state off
1
3)重新启动系统后,Windows防火墙将不再处于活动状态;
如果要再次启用防火墙,请使用以下命令:

netsh advfirewall set allprofiles state on
1
4)或者不关闭防火墙将sshd添加入站规则,并开放22号端口

命令:netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
1
6、关闭防火墙后,再次使用ssh连接提示以下错误

Connection reset by [server_ip] port 22


7、查看详细日志:ssh -vvv [用户名]@[server_ip]查看错误码:

send - WSASend() ERROR:10053, io:000001A133F02E60


8、查了很多资料说让改MTU(网络上传送的最大数据包,单位是字节),使用ping -f -l [字节] ip地址也没有问题。
此时心态已经快崩溃了。。。
偶尔在GitHub上看到一篇和我问题相似文章;
在github上查到一个用户出现相同的问题,
9、尝试着将ssh的位置改一下;
将C:\Users\用户名(比如Administrator)\openssh\OpenSSH-Win64改为C:\Users\openssh\OpenSSH-Win64,然后将其加入到环境变量里,重新执行第一步操作安装启动sshd服务,再次相连发现成功了。。
(估计是这个ssh版本有问题)

10、使用ssh连接时,SSH2_MSG_SERVICE_ACCEPT received成功后出现10054的错误:

debug3: recv - from CB ERROR:10054, io:000001C51411FD40

基本上是用户名写错了,可以在终端输入命令“net user”,可以查看自己系统的用户名。

以上就是目前遇到的问题,整理一下,以防自己忘记。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/cornerrose/article/details/122738094

 

posted on 2025-02-15 11:32  雇的辣客  阅读(286)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3