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)

最新文章

  1. Entity Framework 教程——概述
  2. mysq大数据分页
  3. aspose.cell 自定义模板 SUM无效
  4. 在webservice中传递Hashtable
  5. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】
  6. javascript第十一课,string对象
  7. 数据库中Schema、Database、User、Table的关系[转]
  8. 高级DirectDraw
  9. 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输
  10. leetcode — merge-sorted-array
  11. 如何在cmd中安装python第三方模块
  12. python之__dict__与dir(转载)
  13. 使用log4net将C#日志发送到Elasticsearch
  14. apache分割数组和集合的分法
  15. C# 监测每个方法的执行次数和占用时间(测试2)
  16. selenium 操作文本框(textarea输入)
  17. python使用paramiko自动化部署linux程序
  18. python excel操作单元格复制和读取的两种方法
  19. [19/03/27-星期三] 容器_Iterator(迭代器)之遍历容器元素(List/Set/Map)&Collections工具类
  20. c# log

热门文章

  1. 07.synchronized都问啥?
  2. Java学习笔记 :2021年12月31日 上午
  3. CF896E Welcome home, Chtholly
  4. 狂神——SpringSecurity入门例子(设置不同用户访问权限)
  5. flutter Error:Cannot run with sound null safety, because the following dependencies don't support
  6. SSM进行Query
  7. 一文详解如何在基于webpack5的react项目中使用svg
  8. 【分析笔记】Linux input 子系统原理分析
  9. 【学习笔记】C/C++ 设计模式 - 工厂模式(上)
  10. vuex 的使用详解