linux安装vsftpd和配置

安装vsftpd

1、yum安装

查看是否安装

rpm -qa | grep vsftpd

卸载vsftpd

yum remove vsftpd

yum安装

# 安装
yum install vsftpd

2、启动

# 开启
service vsftpd start
# 关闭
service vsftpd stop
# 重启
service vsftpd restart

# 开机启动
chkconfig vsftpd on

3、创建用户

# 创建用户 useradd -d 目录 用户名
useradd -d /usr/noobmantest noobmantest

# 设置用户密码
passwd noobmantest

修改用户信息

# 更改用户主目录  usermod -d 目录 用户名
usermod -d /user/newFold noobmantest

# 限定用户ftpuser不能telnet,只能ftp
usermod -s /sbin/nologin ftpuser  
 
#当然如果想恢复为正常用户,可以执行以下命令:
usermod -s /sbin/bash ftpuser

4、修改配置文件

修改/etc/vsftpd/vsftpd.conf如下:
 
anonymous_enable=NO   //不允许匿名用户访问,默认是允许。
 
chroot_local_user=NO
 
chroot_list_enable=YES
// 打开此注释
chroot_list_file=/etc/vsftpd/chroot_list
 
// 加入限制目录地址  (可不加)
local_root = /opt/FTP

创建禁止调整用户目录

touch chroot_list
配置说明
anonymous_enable=YES    #设置是否允许匿名用户登录 
local_enable=YES        #设置是否允许本地用户登录 
local_root=/home        #设置本地用户的根目录 
write_enable=YES        #是否允许用户有写权限 
local_umask=022        #设置本地用户创建文件时的umask值 
anon_upload_enable=YES    #设置是否允许匿名用户上传文件 
anon_other_write_enable=YES    #设置匿名用户是否有修改的权限 
anon_world_readable_only=YES    #当为YES时,文件的其他人必须有读的权限才允许匿名用户下载,单单所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载 
download_enbale=YES    #是否允许下载 
chown_upload=YES        #设置匿名用户上传文件后修改文件的所有者 
chown_username=ftpuser    #与上面选项连用,表示修改后的所有者为ftpuser 
ascii_upload_enable=YES    #设置是否允许使用ASCII模式上传文件 
ascii_download_enable=YES    #设置是否允许用ASCII模式下载文件 

python访问ftp服务器拷贝文件到本地

# -*- coding: UTF8 -*-

import time
from ftplib import FTP
import os

# 日志保存地方
log_path = r'D:/file'
log_file = 'log.txt'
# 本地保存目录
remote_path = 'c'
local_path = ''
"""用于FTP连接"""
ftp_server = ''  # ftp站点对应的IP地址
username = ''  # 用户名
password = ''  # 密码


if not os.path.exists(log_path):
    os.makedirs(log_path)

# 连接
def ftp_connect():
    ftp = FTP()
    ftp.set_debuglevel(0)  # 较高的级别方便排查问题
    ftp.connect(ftp_server, 21)
    ftp.login(username, password)
    # ftp.encoding = 'utf-8'
    return ftp

# 下载文件
def download_file(ftp, local_path, local_file, remote_path, remote_file):
    if not os.path.exists(local_path):
        os.makedirs(local_path)
    fp = open(local_path + "/" + local_file, 'wb')
    ftp.cwd(remote_path)
    ftp.set_debuglevel(0)  # 较高的级别方便排查问题
    # ftp.retrbinary('RETR ' + remote_file, fp.write, 1024)
    # ftp.retrbinary("RETR filename.txt",file_handel,bufsize)  #下载FTP文件
    ftp.retrbinary('RETR {0}'.format(remote_file), fp.write, 1024)


# 判断本地是否已经存在
def is_local_exist(ftp, remote_path, local_path, file_name):
    # 判断是否存在
    if not os.path.exists(local_path):
        os.makedirs(local_path)
    files = os.listdir(local_path)
    if file_name in files:
        cur_path = local_path + "/" + file_name
        if os.path.isdir(cur_path):
            # print(cur_path + "  it's a directory")
            return False
        elif os.path.isfile(cur_path):
            # print(cur_path + "  it's a normal file")
            # 如果文件大小也一样则认为是同一个文件,否则不是
            if os.stat(cur_path).st_size == ftp.size(remote_path + "/" + file_name):
                return True
            else:
                return False
        else:
            log("错误访问")
            return False
    else:
        return False

# 递归下载
def download_dir(ftp, remote_path, local_path):
    ftp.cwd(remote_path)
    nlst_test = ftp.nlst()

    dirs = []
    ftp.dir(".", dirs.append)

    transcodeUTF8(dirs=nlst_test)
    transcodeUTF8(dirs=dirs)

    for i in range(len(dirs)):
        try:
            # 区分文件和文件夹
            if("drwxr-xr-x" in dirs[i]):
                log("扫描目录:" + remote_path + "/" + nlst_test[i])
                # print("扫描目录:" + nlst_test[i])
                download_dir(ftp, remote_path=remote_path + "/" +
                            nlst_test[i], local_path=local_path+'/' + nlst_test[i])
            else:
                # 如果本地不存在则下载
                if not is_local_exist(ftp=ftp, remote_path=remote_path, local_path=local_path, file_name=nlst_test[i]):
                    log("文件:" + remote_path + "/" +
                        nlst_test[i] + '下载到' + local_path)
                    # print("文件:" + nlst_test[i] + '下载到' + local_path)
                    download_file(ftp=ftp, local_path=local_path,
                                local_file=nlst_test[i], remote_path=remote_path, remote_file=nlst_test[i])
        except Exception as e:
            log(str(e))
            log('文件下载失败,文件名:')
            log(dirs[i])
            continue

# 日志工具
def log(log_content):
    print(log_content)
    with open(log_path + "/" + log_file, 'a') as f:
        f.write(
            '\n' + time.strftime("%Y/%m/%d %H:%M:%S") + str(log_content))

# latin1转uft8,解决读文件名问题
def transcodeUTF8(dirs):
    for i in range(len(dirs)):
        try:
            dirs[i] = dirs[i].encode('latin1').decode('utf-8')
        except Exception as e:
            # print(e)
            log(str(e))
            log('文件名转码出错')
            # log(dirs[i])


if __name__ == '__main__':
    log("程序启动!")
    ftp = ftp_connect()
    download_dir(ftp=ftp, remote_path=remote_path,
                 local_path=local_path)
    ftp.close

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值