python 搭建自启动FTP服务器,编译后exe后个人随时可用,非常方便

import win32api
import win32con


class AutoRun:
"""
itemname:要添加的项值名称 ,
path:要添加的exe路径绝对路径
"""

def __init__(self, itemname="xx软件名称", path="d:\\xx软件.exe"):
# 注册表项名路径
RegKeyName = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'
try:
key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, RegKeyName, 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, itemname, 0, win32con.REG_SZ, path)
win32api.RegCloseKey(key)

except Exception as e:
print(e)


if __name__ == '__main__':
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.servers import FTPServer
from pyftpdlib.handlers import FTPHandler

import socket
import os
import json
import sys

try:
hostname = socket.gethostname()
hostnameip = socket.gethostbyname(hostname)

# 从外部文件读取路径/端口/权限设置
ftppath = os.getcwd() + "\\ftpconfig.ini"
if os.path.exists(ftppath):
fjson = open(ftppath, "r")
js = json.load(fjson)

ftproot = str(js["根目录"])
try:
if not os.path.exists(ftproot):
os.makedirs(ftproot)
except Exception as err:
print(err)

ftpport = js["端口"]

ftpusers = js["用户集合"]

# 实例化虚拟用户
authorizer = DummyAuthorizer()

# 添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限)
authorizer.add_user('hostname', 'hostname', ftproot, perm='elradfmwMT')
for ir in ftpusers:
username = str(ir["用户名"])
pwd = str(ir["密码"])
permx = str(ir["权限"])
if permx.upper() == "A": # 所有权限
permx = "elradfmwMT"
if permx.upper() == "W": # 只读
permx = "adfmwMT"
if permx.upper() == "R": # 只写
permx = "elr"
authorizer.add_user(username, pwd, ftproot, perm=permx)

# 添加匿名用户 只需要路径
try:
ftproot += "/anonymous"
if ftproot.find(":") > -1:
ftproot = ftproot.replace("/", "\\")
if not os.path.exists(ftproot):
os.makedirs(ftproot)
authorizer.add_anonymous(ftproot)
except Exception as err:
print(err)

# 下次开机自启动
AutoRun("自制FTP服务器", sys.argv[0])

# 初始化ftp句柄
handler = FTPHandler
handler.authorizer = authorizer
# handler.decode()

# 监听ip 和 端口
server = FTPServer((hostnameip, int(ftpport)), handler)

# 开始服务
server.serve_forever()

except Exception as errinfo:
print(errinfo)

{
"说明": "端口:尽量使用大的;根目录:是绝对路径需要使用\\,相对路径只用/就行",
"端口": 2021,
"根目录": "E:\\FTP-ARCHER-ROOT",
"用户集合": [
{
"用户名": "mkx",
"密码": "00",
"权限": "a"
},
{
"用户名": "mkx1",
"密码": "00",
"权限": "w"
},
{
"用户名": "mkx2",
"密码": "00",
"权限": "r"
}
]
}
 

特别注意:

1.pyftpdlib内部使用utf8,而windows使用gbk,可以将pyftpdlib进行修改:
filesystems.py 将所有的utf8 换成 gbk
handlers.py 将所有的utf8 替换成 gbk
重新执行cmd即可: python -m pyftpdlib -p 21 

2.由于端口出现跟其他程序共用情况,只要保证ftpw服务器程序管理员身份运行即可(win10常见)

 

客户端访问:

import ftplib
fp = ftplib.FTP()
fp.encoding = "gbk"
fp.connect("192.168.x.xx", 2021)
fp.login("username","pw")
x = fp.nlst()#所有文件
y = fp.dir()#文件夹
print(x)

 

posted @ 2021-12-23 09:16  默*为  阅读(389)  评论(0编辑  收藏  举报