基于Ubuntu搭建FTP文件服务器

 

安装并启动 FTP 服务

安装 VSFTPD

使用 apt-get 安装 [vsftpd]:

sudo apt-get install vsftpd -y

vsftpd 是在 Linux 上被广泛使用的 FTP 服务器,根据其官网介绍,它可能是 UNIX-like 系统下最安全和快速的 FTP 服务器软件。

启动 VSFTPD

安装完成后 VSFTPD 会自动启动,通过 netstat 命令可以看到系统已经[监听了 21 端口]:

sudo netstat -nltp | grep 21

如果没有启动,可以手动开启 VSFTPD 服务:

sudo systemctl start vsftpd.service

FTP 协议默认使用 21 端口作为服务端口

配置用户访问目录

新建用户主目录

sudo mkdir /home/uftp

执行完后,在这里 /home/uftp [?] 就能看到新建的文件夹 uftp 了。

创建登录欢迎文件 [?]:

sudo touch /home/uftp/welcome.txt

方便用户登录后可以看到欢迎信息,并且确定用户确实登录到了主目录上。

用户的主目录是用户通过 FTP 登录后看到的根目录

新建用户 uftp 并设置密码

创建一个用户 uftp [?]:

sudo useradd -d /home/uftp -s /bin/bash uftp

为用户 uftp 设置密码 [?]:

sudo passwd uftp

删除掉 pam.d 中 vsftpd,因为该配置文件会导致使用用户名登录 ftp 失败:

sudo rm /etc/pam.d/vsftpd

为了方便后面的实验步骤,不建议使用其它的用户名

请记住设置的密码以用于后续步骤

限制该用户仅能通过 FTP 访问

限制用户 uftp 只能通过 FTP 访问服务器,而不能直接登录服务器:

sudo usermod -s /sbin/nologin uftp

修改 vsftpd 配置

sudo chmod a+w /etc/vsftpd.conf

修改 /etc/vsftpd.conf 文件中的配置(直接将如下配置添加到配置文件最下方):

# 限制用户对主目录以外目录访问
chroot_local_user=YES

# 指定一个 userlist 存放允许访问 ftp 的用户列表
userlist_deny=NO
userlist_enable=YES

# 记录允许访问 ftp 用户列表
userlist_file=/etc/vsftpd.user_list

# 不配置可能导致莫名的530问题
seccomp_sandbox=NO

# 允许文件上传
write_enable=YES

# 使用utf8编码
utf8_filesystem=YES

新建文件 /etc/vsftpd.user_list,用于存放允许访问 ftp 的用户:

sudo touch /etc/vsftpd.user_list
sudo chmod a+w /etc/vsftpd.user_list

修改 /etc/vsftpd.user_list ,加入刚刚创建的用户:

示例代码:/etc/vsftpd.user_list

uftp

设置访问权限

设置主目录访问权限(只读):

sudo chmod a-w /home/uftp

新建公共目录,并设置权限(读写):

sudo mkdir /home/uftp/public && sudo chmod 777 -R /home/uftp/public

重启vsftpd 服务:

sudo systemctl restart vsftpd.service

访问 FTP 服务

FTP 服务已安装并配置完成,下面我们来使用该 FTP 服务

访问 FTP 服务

根据您个人的工作环境,选择一种方式来访问已经搭建的 FTP 服务

通过 FTP 客户端工具访问

FTP 客户端工具众多,下面推荐两个常用的:

  • FileZilla – 跨平台的 FTP 客户端,支持 Windows 和 Mac
  • WinSCP – Windows 下的 FTP 和 SFTP 连接客户端

 

Advertisements

远程访问家里电脑文件的方法

    远程访问家中电脑需要面临2个问题,1.电脑远程唤醒 2. 内网穿透。网络上有很多解决方案。远程唤醒(WoL)需要相应的路由器支持;内网穿透可以利用frp等,但是需要利用到公网vps。我的方案相对简单,稳定,文件传输速度较慢,但可以接受。

需要用到:
  1. 小米智能插座
  2. 支持通电启动的主板
  3. Teamviewer
配置:
  1. 首先将家里台式机的bios设置成通电启动系统。以我的电脑为例:在bios的power项中,将 ac back设置成always on。即通电立即启动。(默认是always off)
  2. 在台式机中安装Teamviewer,注意安装时在高级选项中选择安装VPN组件。
使用:
  1. 在手机上打开小米智能插座,电源启动后台式机开机。
  2. 在Teamviewer上等待家中台式机上线。
  3. 台式及上线后,在本地TeamViewer中可以选择远程控制,文件传输或VPN连接远程计算机。
小结: 

    这个方案利用小米智能插座和通电启动解决远程唤醒的问题;使用Teamviewer解决内网穿透和文件传输的问题。可以满足我日常使用的需求,简单稳定少折腾而且免费。

 

win10下安装splash

安装DOCKER

Docker for windows 仅支持win10专业版,并且电脑需支持虚拟化技术。
任务管理器

其他版本的需安装Docker Toolbox
国内可以使用阿里云镜像来下载
下载完成之后直接点击安装。

启动Docker

双击Docker QuickStart启动Docker Toolbox终端。
启动后出现错误,卡在了Finalize这一步……
错误信息

打开安装目录下start.sh文件,将84行的clear注释掉(clear->#clear)。再次启动Docker QuickStart。
启动正常

安装Splash

执行命令:

$ docker pull scrapinghub/splash

启动Splash

$ sudo docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

验证

在浏览器输入:192.168.100:8050
显示splash页面
splash页面

在Scrapy使用splash爬取动态页面

在windwos中启动Docker Quickstart Terminal后运行splash:

docker run -p 8050:8050 -p 8051:8051 scrapinghub/splash

表示:Splash现在在端口8050(http)和5023(telnet)上的192.168.99.100处可用。

启动后在浏览器中输入192.168.99.100:8050 验证是否启动成功。


在scrapy项目文件settings.py中添加:

SPLASH_URL = 'http://192.168.99.100:8050/'

# 开启Splash的两个下载中间件并调整HttpCompressionMiddleware的次序
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 设置去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

# 用来支持cache_args(可选)
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

在爬虫文件pider.py中添加

def start_requests(self):
        script = '''
            function main(splash)
                splash:set_viewport_size(1028, 10000)
                splash:go(splash.args.url)
                local scroll_to = splash:jsfunc("window.scrollTo")
                scroll_to(0, 2000)
                splash:wait(5)

                return {png=splash:png()}
                
            end
          '''

        for url in self.start_urls:
            #yield SplashRequest(url, args={'images': 0, 'timeout': 10})
            yield SplashRequest(url, callback=self.parse, meta = {'dont_redirect': True,
                                                                  'splash':{'args': {'lua_source':script,
                                                                                     'images':0, 
                                                                                     'timeout': 20
                                                                                    },
                                                                            'endpoint':'execute',
                                                                            }
                                                                 }
                               )

安装scrapy

环境 winpython3.6

pip install scrapy

发现在安装依赖twisted时出错,需要vc++14.0. 网上搜索发现需要下载安装visual studio等,太麻烦了。于是乎google到了Twisted-18.7.0-cp36-cp36m-win_amd64.whl。

pip install Twisted-18.7.0-cp36-cp36m-win_amd64

完成后继续

pip install scrapy

安装成功后,验证:

In[1]:import scrapy
In[2]:scrapy.version_info
Out[2]: (1, 5, 1)

 

将scrapy爬到的内容存入sqlite数据库

这个方法需要手动创建数据库文件并将表建立好,否则程序运行会出错。

settings.py

# sqlite 配置
SQLITE_DB_NAME = 'Data.db'                      #数据库名称
SQLITE_TABLE_NAME = 'table'                     #表名称
ITEM_PIPELINES={
     'dirName.pipelines.Sqlite3Pipeline': 400,
    }

pipelines.py

import sqlite3

class Sqlite3Pipeline(object):

    def __init__(self, sqlite_file, sqlite_table):
        self.sqlite_file = sqlite_file
        self.sqlite_table = sqlite_table
        
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            sqlite_file = crawler.settings.get('SQLITE_DB_NAME'), # 从 settings.py 提取
            sqlite_table = crawler.settings.get('SQLITE_TABLE_NAME', 'items')
        )

    def open_spider(self, spider):
        self.conn = sqlite3.connect(self.sqlite_file)
        self.cur = self.conn.cursor()

    def close_spider(self, spider):
        self.conn.close()

    def process_item(self, item, spider):

        values = (
        item['A'],
        item['B'],
        item['C'],
        item['D'],
        item['E']
        )
        
        sql = 'INSERT INTO proxy VALUES (?,?,?,?,?)'    #注意插入的数据个数
        self.cur.execute(sql, values)
        self.conn.commit()
        
        return item