docker部署vsftp

本文介绍如何在CentOS7上使用Docker部署VSFTP服务,并通过Python进行文件上传操作。主要内容包括配置Docker运行参数、设置防火墙、创建用户目录及通过Python脚本上传文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宿主机为centos7系统,docker部署vsftp

#部署服务,账号密码都为test
docker run -d -v /home/ftp:/home/vsftpd -p 20:20 -p 21:21 -p  21100-21110:21100-21110 -e FTP_USER=test -e FTP_PASS=test -e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
#开启firewall-cmd防火墙对应的端口
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=21100/tcp
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=21100/tcp
firewall-cmd --permanent --add-port=21101/tcp
firewall-cmd --permanent --add-port=21102/tcp
firewall-cmd --permanent --add-port=21103/tcp
firewall-cmd --permanent --add-port=21104/tcp
firewall-cmd --permanent --add-port=21105/tcp
firewall-cmd --permanent --add-port=21106/tcp
firewall-cmd --permanent --add-port=21107/tcp
firewall-cmd --permanent --add-port=21108/tcp
firewall-cmd --permanent --add-port=21109/tcp
firewall-cmd --permanent --add-port=21110/tcp
firewall-cmd --reload
#新建用户文件夹
docker exec -i -t vsftpd bash
mkdir /home/vsftpd/test
vi /home/vsftpd/test/1.txt
#访问服务
*   [ftp://test:test@192.168.60.128:21](ftp://test:test@192.168.11.124/)
访问vsftp服务.png

---------------------------------------------------------------练习python-------------------------------------------
附加:python测试
python上传文件
特别注意不能把全路径加上,否则会导致权限不足

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import tempfile

from contextlib import contextmanager
from ftplib import FTP


class FtpConfig(object):
    """ftp配置信息
    """
    __ftp_config = None

    ACTIVE_MODE = 1  # 主动模式
    PASSIVE_MODE = 0  # 被动模式

    def __init__(self, host, username, password, port, ftp_root):
        self.host = host
        self.username = username
        self.password = password
        self.port = port
        self.ftp_root = ftp_root

    @classmethod
    def get_ftp_object(cls):
        """查询ftp配置信息

        :return ftp配置对象
        :rtype FtpConfig()
        """
        if cls.__ftp_config:
            return cls.__ftp_config
        # ftp服务器相关配置
        # TODO: 配置文件应该单独维护在配置文件中,方便修改,演示用,就不另外拆分了
        host = "192.168.1.86"
        username = "ftp"
        password = "ftp"
        root = "/home/ftp/ftp"
        port = 21
        cls.__ftp_config = cls(host, username, password, port, root)
        return cls.__ftp_config


@contextmanager
def ftp_connect(host, username, password, port):
    """获取ftp连接

    :param host ftp主机
    :type host str

    :param username ftp用户名
    :type username str

    :param password ftp密码
    :type password str

    :param port ftp端口
    :type port int
    """
    ftp_conn = FTP()
    ftp_conn.set_debuglevel(2)
    ftp_conn.connect(host, port)
    ftp_conn.login(username, password)
    yield ftp_conn
    ftp_conn.quit()


def upload_file(local_path, remote_name):
    """上传文件到ftp服务器

    :param local_path: 本地文件路径
    :type local_path str

    :param remote_name: 目标服务文件名
    :type remote_name str
    """
    buf_size = 1024 * 1  # 每次读取的文件大小
    ftp_obj = FtpConfig.get_ftp_object()
    with ftp_connect(ftp_obj.host, ftp_obj.username, ftp_obj.password, ftp_obj.port) as ftp_conn:
        old_pasv = ftp_conn.passiveserver
        # 修改模式
        if old_pasv == ftp_obj.ACTIVE_MODE:
            ftp_conn.set_pasv(ftp_obj.PASSIVE_MODE)
        try:
            # 上传文件
            with open(local_path, 'rb') as fp:
                # 特别注意不能把全路径加上,否则会导致权限不足
                ftp_conn.storbinary('STOR ' + remote_name, fp, buf_size)
        finally:
            # 修改回原来的模式
            if old_pasv != ftp_conn.passiveserver:
                ftp_conn.set_pasv(old_pasv)


@contextmanager
def make_temp_file(suffix="_test", prefix="test_", clean=True):
    """创建临时文件

    :param suffix 临时文件后缀
    :type suffix str

    :param prefix 临时文件前缀
    :type suffix str

    :param clean 是否清除临时文件
    :type clean bool
        True 在with语句之后删除文件
    """
    curr_path = os.path.dirname(os.path.abspath(__file__))
    temp_file = tempfile.mktemp(suffix=suffix, prefix=prefix, dir=curr_path)
    try:
        yield temp_file
    finally:
        if clean and os.path.isfile(temp_file):
            os.remove(temp_file)


def test():
    """测试上传文件
    """
    with make_temp_file() as temp_file:
        file_name = os.path.basename(temp_file)
        with open(temp_file, "a") as f:
            f.write(file_name)
        upload_file(temp_file, file_name)


if __name__ == '__main__':
    test()

参考地址:http://www.hangge.com/blog/cache/detail_2449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少陽君

谢谢老板的拿铁

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值