FTP操作记录

创建 FTP_Server.py,输入如下内容

# !/usr/bin/env python3
# -*- coding: UTF-8 -*-
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import json
import os


def get_conf():
    """
    读取配置文件,获取参数
    :return:
    """
    with open("./confg_FTP.json", "r")as fp:
        json_conf = fp.read()
        return json.loads(json_conf)


def create_path(path):
    """
    Check path exists ,if not exists make it
    :param path: path
    :return:
    """
    if not os.path.exists(path) and os.path.isabs(path):
        os.makedirs(path)


def server():
    """
    创建FTP服务
    :return:
    """
    conf_json = get_conf()

    # 实例化DummyAuthorizer来创建ftp用户
    authorizer = DummyAuthorizer()
    # 参数:用户名,密码,目录,权限
    username, password, homedir = conf_json["ftp_user"], conf_json["ftp_pwd"], conf_json["ftp_server_save_file"]

    authorizer.add_user(username, password, homedir, perm='elradfmwMT')
    # 匿名登录

    # authorizer.add_anonymous(server_save_file)

    handler = FTPHandler
    handler.authorizer = authorizer

    # 参数:IP,端口,handler
    IP = conf_json["ftp_host"]
    port = conf_json["ftp_port"]
    server = FTPServer((IP, port), handler)
    server.serve_forever()


if __name__ == '__main__':
    server()

将 FTP_Server.py 部署在Linux上,并且在同文件夹下新建 confg_FTP.json 输入

{
  "ftp_host": "192.168.136.128",
  "ftp_port": 21,
  "ftp_server_save_file": "/home/jiaohaicheng/FTPServer"

}

安装 pyftpdlib pip install pyftpdlib

Linux 预装好python环境

命令行输入 python FTP_Server.py

出现类似如下,表示成功

┌──(root㉿kali)-[/home/jiaohaicheng/FTP_Server]
└─# python FTP_Server.py
[I 2022-10-02 05:48:08] concurrency model: async
[I 2022-10-02 05:48:08] masquerade (NAT) address: None
[I 2022-10-02 05:48:08] passive ports: None
[I 2022-10-02 05:48:08] >>> starting FTP server on 192.168.136.128:2101, pid=16757 <<<

本地新建py文件,FTP客户端,输入:

# !/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: JHC
@license: None
@contact: JHC000abc@gmail.com
@file: client.py
@time: 2022/10/01/ 20:06
@desc:
"""

import ftplib
import os


def get_files_under_path(path):
    """
    获取路径下所有文件的绝对路径
    :param path: 根路径
    :return: 路径下文件绝对路径列表
    """
    try:
        if os.path.exists(path) and os.path.isabs(path):
            files_path_lis = []
            for path, dir_lis, file_lis in os.walk(path):
                if len(file_lis) > 0:
                    for file in file_lis:
                        files_path_lis.append(os.path.join(path, file))
            return files_path_lis
    except Exception as e:
        print(e, e.__traceback__.tb_lineno)


def upload(fname):
    if os.path.isfile(fname):
        print("uploading is about to start:{}".format(fname))
        with open(fname, "rb")as fp:
            try:
                file_name, file_tail = os.path.split(fname)[-1].split(".")
                up_name = input("Please enter the file name after uploading:")
                if up_name == "":
                    up_name = file_name
                else:
                    pass
                ftp.storbinary("STOR {}.{}".format(up_name, file_tail), fp)
            except Exception as e:
                print("{} {}".format(fname, e))
    # 上传文件夹下内容到指定目录
    elif os.path.isdir(fname):
        file_dir_lis = get_files_under_path(fname)
        for file in file_dir_lis:
            upload(file)
    else:
        raise ValueError("fname is not compliance")


# 文件下载
def download(server_name):
    if isinstance(server_name, str):
        print("About to start downloading:{}".format(server_name))
        try:
            file_name, file_tail = os.path.split(server_name)[-1].split(".")
            host_file = input(
                "Please enter the local saving path of the file to download:")
            if host_file == "":
                host_file = "{}.{}".format(file_name, file_tail)
            else:
                pass
            fd = open(host_file, 'wb')
            ftp.retrbinary("RETR %s" % server_name, fd.write)
        except Exception as e:
            print("{} {}".format(server_name, e))

    if isinstance(server_name, list):
        for server_file in server_name:
            download(server_file)


def main():
    op = input("what do you want?(u(上传)/d(下载)/q(退出))")
    if op == "u":
        fname = input("Please enter the file path to upload:")
        upload(fname)
        ftp.close()
        print("upload finished")
    elif op == "d":
        ftp.dir(ftp.pwd())
        server_name = input(
            "Please enter the file name and directory to download:")
        download(server_name)
        ftp.close()
        print("download finished")
    elif op == "q":
        print("quit now!")
        ftp.quit()


if __name__ == '__main__':
    server_address = "192.168.136.1"
    print(server_address)
    # 创建FTP实例,并显示欢迎界面
    ftp = ftplib.FTP(host=server_address)
    ftp.login('JHC', '123456')
    print(ftp.getwelcome())
    # 登录,输入服务器里添加过的用户名和口令
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值