个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

日常工作和娱乐中,我们所需的各种资源都离不开网络以及各种服务,我们通过网络获取部署在其他服务器上的各种服务资源,这些服务包括文件服务、邮件服务、媒体服务等等。

一般情况下,我们使用计算机上网的一个重要目的就是为了获取资料,而文件传输则是获取资料的方式。因此,我们首先来了解下linux中文件传输相关的知识。

一、文件传输协议FTP

1.1 FTP产生背景

“无规矩不成方圆”,这说明了规则的重要性。同样,当今的互联网由成千上万台机器组成,这些机器包括个人计算机、工作站、服务器、巨型机等各种形形色色的设备,并且这些设备中使用的操作系统还不一样,有的可能是用的windows,而有的则是Linux或其他系统。

要在这么纷繁复杂的设备之间传输文件,那就必须要有一定的规则,大家都按规则办事,传输的文件才能相互识别,达到正确传递信息的目的。在这种背景下,为了解决文件传输的问题,文件传输协议应运而生。

1.2 FTP相关概念

文件传输协议(File Transfer Protocol,FTP),是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,其中20端口是数据端口用于进行数据传输,21端口为命令端口,用于接收客户端发出的相关FTP命令和参数。

本系列文章第三篇提到的所有工具都可以实现在Windows中远程到Linux主机并上传下载文件,并且在Linux主机之间也可以通过scp命令上传文件,那为什么还需要FTP呢?个人认为应该是因为FTP一般搭建与内网之中,有具有容易搭建、方便管理的特点,并且一些FTP客户端工具还具有文件多点下载以及断点续传等功能,这些是scp做不到的。

FTP是C/S架构,也就是基于客户端/服务器的模式,FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。

FTP协议的传输拓扑结构如下:

file

FTP协议工作模式有两种:主动模式和被动模式,其中被动模式是默认的工作模式

  • 主动模式:FTP 服务器主动向客户端发起连接请求。

  • 被动模式:FTP 服务器等待客户端发起连接请求。

由于FTP一般部署在企业内网,如果开启并配置了防火墙,有时候需要将FTP的工作模式设置为主动模式,才可以传输数据。

二、Linux下基于FTP协议工具

2.1 vsftpd服务安装

vsftpd(very secure ftp daemon)非常安全的FTP守护进程,是一款运行在Linux系统上的免费开源的FTP服务端程序。其主要特点是:安全性高、传输速度快、支持虚拟用户验证。

默认情况Centos7中是没有安装vsftpd的,因此需要手动通过yum仓库安装,根据前文的讲解可以用光盘资源自带的yum源,也可以直接配置外网源。本例采用默认的外网yum源进行安装。

[root[@origin](https://my.oschina.net/zorigin) ~]# rpm -q vsftpd
package vsftpd is not installed
[root[@origin](https://my.oschina.net/zorigin) ~]# yum install vsftpd
Loaded plugins: fastestmirror, langpacks
...省略部分内容
Installed size: 353 k
Is this ok [y/d/N]: y
Downloading packages:
vsftpd-3.0.2-25.el7.x86_64.rpm                             | 171 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : vsftpd-3.0.2-25.el7.x86_64                                   1/1 Verifying  : vsftpd-3.0.2-25.el7.x86_64                                   1/1 
Installed:vsftpd.x86_64 0:3.0.2-25.el7                                                 
Complete!
[root[@origin](https://my.oschina.net/zorigin) ~]# rpm -q vsftpd     
vsftpd-3.0.2-25.el7.x86_64
[root[@origin](https://my.oschina.net/zorigin) ~]# 

通过rpm命令查看是否已经安装过vsftpd,如果没有安装则通过yum install命令安装即可,安装过程中需要按提示输入y继续下载并安装。

> 注意:从现在开始,凡是涉及到服务的配置,就要考虑防火墙和SELinux的因素,很多教程和书籍上都是直接关闭防火墙和selinux,虽然这样在学习阶段可以避免干扰,但是这样非常不安全。另外凡是配置了服务,都要加入开机启动中,让其每次重启自动生效。

安装vsftpd服务后,会在/etc下自动生成配置文件

[root@ftpserver ~]# ll /etc/vsftpd/
total 20
-rw-------. 1 root root  125 Oct 31  2018 ftpusers
-rw-------. 1 root root  361 Oct 31  2018 user_list
-rw-------. 1 root root 5116 Oct 31  2018 vsftpd.conf
-rwxr--r--. 1 root root  338 Oct 31  2018 vsftpd_conf_migrate.sh

各个文件的解释

文件名作用
vsftpd.conf主配置文件
ftpusers黑名单
vsftpd_conf_migrate.sh迁移脚本
user_list用户列表,与userlist_enbale和userlist_deny选项密切相关

查看主配置文件vsftpd.conf内容可以看到各项配置信息,需要根据实际情况来进行配置,其中主要的参数和作用如下:

参数作用
listen=[YES|NO]是否以独立运行的方式监听服务
listen_address=IP地址设置要监听的IP地址
listen_port=21设置FTP服务的监听端口
download_enable=[YES|NO]是否允许下载文件
userlist_enable=[YES|NO]设置用户列表为“允许”操作
userlist_deny=[YES|NO]设置用户列表为“禁止”操作
max_clients=0最大客户端连接数,0为不限制
max_per_ip=0同一IP地址的最大连接数,0为不限制
anonymous_enable=[YES|NO]是否允许匿名用户访问
anon_upload_enable=[YES|NO]是否允许匿名用户上传文件
anon_umask=022匿名用户上传文件的umask值
anon_root=/var/ftp匿名用户的 FTP 根目录
anon_mkdir_write_enable=[YES|NO]是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO]是否开放匿名用户的其他写入权限(包括重命名、删 除等操作权限)
anon_max_rate=0匿名用户的最大传输速率(字节/秒),0 为不限制
local_enable=[YES|NO]是否允许本地用户登录FTP
local_umask=022本地用户上传文件的umask值
local_root=/var/ftp本地用户的 FTP 根目录
chroot_local_user=[YES|NO]是否将用户权限禁锢在FTP目录,以确保安全
local_max_rate=0本地用户最大传输速率(字节/秒),0为不限制

不用完全记住这些参数,需要时再来查看即可。

2.2 ftp客户端安装

ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。默认也是没有安装的,需要手动安装。

[root@origin ~]# rpm -q ftp
package ftp is not installed
[root@origin ~]# yum install ftp
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...省略部分内容
Total download size: 61 k
Installed size: 96 k
Is this ok [y/d/N]: y
Downloading packages:
ftp-0.17-67.el7.x86_64.rpm                                 |  61 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : ftp-0.17-67.el7.x86_64                                       1/1 Verifying  : ftp-0.17-67.el7.x86_64                                       1/1 
Installed:ftp.x86_64 0:0.17-67.el7                                                     
Complete!
[root@origin ~]# rpm -q ftp     
ftp-0.17-67.el7.x86_64
[root@origin ~]# 

通过yum install命令即可安装成功,ftp客户端工具安装成功后,接下来就是及操作下文件传输的功能。

2.3 vsftpd三种认证模式

vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上:匿名开放模式、本地用户模式、虚拟用户模式。实际生产环境中虚拟用户模式用的较多。

  • 匿名开放模式:任何人都可以无需密码验证而直接登录到FTP服务器,是一种最不安全的认证模式。

  • 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式。如果被黑客破解了账户信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。

  • 虚拟用户模式:需要为FTP服务单独 建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使 黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。是三种模式中最安全的一种认证模式

2.4 匿名开放模式

匿名开放模式是最不安全的一种认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。针对匿名用户放开这些权限会带来潜在危险,生产环境不建议这样做,因此一般不会用匿名模式,尽管如此,但本节还是实际演示一下。

按之前的方法克隆准备2台虚拟机:一台主机名为:ftpserver ,用于安装vsftpd服务;另外一台主机名为:ftp,用于安装ftp客户端。

vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下 载文件的权限,以及让匿名用户创建、删除、更名文件的权限。

针对匿名模式的配置主要有如下几个参数:

参数作用
anonymous_enable=YES允许匿名访问模式
anon_umask=022匿名用户上传文件的umask值
anon_upload_enable=YES允许匿名用户上传文件
anon_mkdir_write_enable=YES允许匿名用户创建目录
anon_other_write_enable=YES允许匿名用户修改目录名称或删除目录

配置匿名模式主要步骤如下:

2.4.1 服务器配置vsftp服务,开启匿名模式

只需要按照上表查找主配置文件中对应的参数,如果是注射掉的就把注射去掉,如果是没有的就新加即可。

但是考虑到该配置文件里边的注释信息是在是太多了,影响配置,干脆我们把与配置无关的注射直接去掉。

[root@ftpserver ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@origin ~]# grep -v "#" /etc/vsftpd/vsftpd.conf.bak >/etc/vsftpd/vsftpd.conf
[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]# 

上边示例中,我们先把主配置文件备份,然后通过grep命令匹配出非注释的参数,然后再重定向将其写入到主配置文件。这样配置文件看起来内容就简洁多了。

然后我们将上表的参数配置到主配置文件即可:

[root@origin ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

实际上第一行已经默认开启了,等于是添加第二到第五行即可。保存并退出,这样就完成了vsftpd服务的配置。

配置完成后重启服务,并添加到开机启动。配置并开启vsftp服务后,就可以在客户端执行ftp命令连接到远程的FTP服务器了。

[root@ftpserver ~]# systemctl restart vsftpd
[root@ftpserver ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
[root@ftpserver ~]# 
[root@ftpserver ~]# ll /var/ftp/pub/
total 0
[root@ftpserver ~]# echo "ftp server content">/var/ftp/pub/ftpserver.txt
[root@ftpserver ~]# ll /var/ftp/pub/
total 4
-rw-r--r--. 1 root root 19 Jan 13 23:09 ftpserver.txt
[root@ftpserver ~]# 

在/var/ftp/pub目录下准备文件,供ftp客户端下载。因为客户端连接到FTP服务器后,默认访问的是服务器的/var/ftp目录(该目录下还有一个pub目录)。

2.4.2 客户机使用ftp服务下载文件

在vsftpd服务程序的匿名开放认证模式下,其账户统一为 anonymous,密码为空

[root@ftp ~]# ftp 192.168.78.101
ftp: connect: No route to host
ftp>

发现报错了,此时我们首先应该想到的就是ftpserver服务器的防火墙,因此我们关闭防火墙来验证一下

[root@ftpserver ~]# firewall-cmd --state
running
[root@ftpserver ~]# systemctl stop firewalld.service 
[root@ftpserver ~]# firewall-cmd --state
not running
[root@ftpserver ~]# 

在ftpserver服务器关闭防火墙后,在尝试连接就可以正常连接并下载服务器上的ftpserver.txt文件了。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,78,101,132,61).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              19 Jan 13 15:09 ftpserver.txt
226 Directory send OK.
ftp> get ftpserver.txt
local: ftpserver.txt remote: ftpserver.txt
227 Entering Passive Mode (192,168,78,101,115,121).
150 Opening BINARY mode data connection for ftpserver.txt (19 bytes).
226 Transfer complete.
19 bytes received in 7e-05 secs (271.43 Kbytes/sec)
ftp> 

这样就把ftpserver服务器上的ftpserver.txt文件下载到了当前用户的家目录下

[root@ftp ~]# ll
-rw-r--r--. 1 root root   19 Jan 13 23:20 ftpserver.txt
...省略部分无关的文件
[root@ftp ~]# cat ftpserver.txt 
ftp server content
[root@ftp ~]# 

到此我们就可以使用ftp下载服务器上的文件了。但是有个问题必须的说明一下,前边遇到ftp连接问题时,我们直接关闭了服务器上的防火墙。但这是非常不安全的,生产环境中一般都是要求开启防火墙。

那么防火墙是如何阻止了ftp客户端连接呢?其实就是因为firewall防火墙默认禁止了ftp传输的端口号,因此可以清除防火墙的默认策略

[root@ftpserver ~]# systemctl start firewalld.service 
[root@ftpserver ~]# firewall-cmd --state              
running
[root@ftpserver ~]# iptables -F
[root@ftpserver ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@ftpserver ~]# 

清除防火墙默认策略并保存,这样即使服务器不关闭防火墙也可以正常使用功能ftp功能下载文件了。

2.4.3 通过ftp客户端在服务器上创建目录

接下来我们切换到pub目录,并尝试创建一个目录test

ftp> cd pub
250 Directory successfully changed.
ftp> mkdir test
550 Create directory operation failed.
ftp> 

好神奇,居然报错了。大家不用担心,学习阶段要的就是这种效果,遇到的错误越多,越能快速积累经验,并建立一套分析问题和解决问题的逻辑思维套路。

分析一下,我们第一步时已经在主配置文件中添加了运行匿名用户创建目录和写入文件的权限,但为何还是会报错呢?既然排除了是用户权限的问题,那么是不是/var/ftp这个目录的权限问题呢?

[root@ftpserver ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 root root 26 Jan 13 23:09 /var/ftp/pub
[root@ftpserver ~]# chown -Rf ftp /var/ftp/pub
[root@ftpserver ~]# ll -d /var/ftp/pub        
drwxr-xr-x. 2 ftp root 26 Jan 13 23:09 /var/ftp/pub
[root@ftpserver ~]# ll -d /var/ftp/
drwxr-xr-x. 3 root root 16 Jan 13 22:59 /var/ftp/

通过查看,果然发现/var/ftp目录只有root用户才有写入的权限,因此我们直接把pub目录所有者改为ftp用户,让ftp用户拥有写入的权限,我们再次来试下看能否创建文件夹

ftp> mkdir test
550 Create directory operation failed.
ftp> 

奇怪,依然报错。前面排除了用户权限、目录权限之外,我们应该想到很有可能是SELinux造成的,因此我们关闭SELinux再来验证一下

[root@ftpserver ~]# setenforce 0
[root@ftpserver ~]# 

关闭SeLinux后后,再去创建目录,发现创建成功

ftp> mkdir test
257 "/pub/test" created
ftp> 

因此,说明不仅要让pub目录的属主拥有写入权限,并且同时还要关闭SELinux才能创建目录。

但是实际生产环境中不建议关闭SELinux,所以我们要弄清楚究竟SELinux哪个配置影响了

[root@ftpserver ~]# setenforce 1
[root@origin ~]# getenforce 
Enforcing
[root@origin ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@origin ~]# 

我们查看下SELinux状态为开启,查看与ftp域相关的策略,其中有一条ftpd_full_access --> off其实就是这条规则导致了操作失败。

修改该策略,并使用-P参数使其永久生效。

[root@origin ~]# setsebool -P ftpd_full_access=on

再次登录创建目录,发现成功了

ftp> mkdir test2
257 "/pub/test2" created
ftp> 

因此遇到问题,从用户权限、目录权限、网络防火墙、SELinux服务几个方面去逐个排查。

2.5 本地用户模式

本地模式比匿名模式更加安全,现在继续在前面的虚拟机中做实验,开始之前先关闭上一实验中开启的匿名模式。

[root@ftpserver ~]# vim /etc/vsftpd/vsftpd.conf
[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]# 

将anonymous_enable=YES改为NO,即关闭了本地模式,此时就不能在使用匿名模式登陆了。

另外前面新加的与匿名配置参数可以保留,也可以直接删除,只要总开关anonymous_enable关闭了就禁用了匿名登录。

现在开始演示本地用户模式操作ftp。

其实从前面的配置文件可以看出,vsfftpd服务默认既开启了匿名模式也开启了本地用户模式(local_enable=YES)。以下几个参数是本地用户模式相关的配置

参数作用
local_enable=YES允许本地用户模式
write_enable=YES设置可写权限
local_umask=022本地用户模式创建文件的 umask 值
userlist_enable=YES启用“禁止用户名单”,名单文件为 ftpusers 和 user_list
userlist_deny=YES开启用户作用名单文件功能

2.5.1 配置本地用户模式

其实vsftpd默认已经开启了本地用户模式,因此没什么可以配置的,查看下配置文件:

[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]# 

参考上表,与本地用户配置相关的主要参数为:local_enable=YES,write_enable=YES,local_umask=022。如果你的配置文件默认没配置这几个项则手动配置一下即可。

注意,如果修改了配置需要从新启动下vsftpd服务

[root@ftpserver ~]# systemctl restart vsftpd
[root@ftpserver ~]# systemctl enable vsftpd
[root@ftpserver ~]# 

另外再创建一个普通用户ftptest并设置密码,用于客户端登录

[root@ftpserver home]# useradd ftptest
[root@ftpserver home]# passwd ftptest
Changing password for user ftptest.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@ftpserver home]# 

这样ftp服务器就准备好了。

> 特别说明:根据前文的经验,需要按前文方法设置防火墙和SELinux策略客户端才能使用,由于我们是沿用之前的配置,之前已经配置好了,所以这里不用配置。默认情况下防火墙将限制登录、SELinux则限制创建目录等操作。

2.5.2 ftp客户端操作服务器

现在就可以直接采用ftpserver服务器上的普通账户ftptest进行文件操作了。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): ftptest
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir test
257 "/home/ftptest/test" created
ftp> rename test test1
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,78,101,106,178).
150 Here comes the directory listing.
drwxr-xr-x    2 1001     1001            6 Jan 14 09:01 test1
226 Directory send OK.
ftp> rmdir test1
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
[root@ftp ~]# 

案例中成功通过ftp服务器中的ftptest用户对目录进行创建、重命名、删除等操作。并且ftp客户端创建的目录,在ftpserver服务器对应的用户目录下也可以查到新建的目录。

因此可以看到,本地用户模式相对匿名模式,配置更简单一些。但是大家想过为啥ftptest用户登录后就可以对目录进行创建、删除等操作吗?那是因为本地用户模式登录FTP服务器后,默认访问的是该用户的家目录,即/home/ftptest目录,它的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。

2.5.3 本地用户登录模式之填坑

如果你是按照我的文章步骤操作,一定会很顺畅,但是如果一开始并不是新建ftptest用户来登录,而是直接使用root用户来进行远程登录,那就有个坑需要注意一下。

在客户端用root登录试试看

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): root
530 Permission denied.
Login failed.
ftp> 

哦豁,目前的系统root是拥有最高权限的,居然被拒了,而前边创建的普通用户ftptest用户居然可以正常使用ftp功能!我就遇到过,哈哈哈哈,百思不得解。

如果是初次接触真可能怀疑是自己哪个步骤操作错了,其实这里有一个规则:

vsftpd服务程序配置目录存放着两个“用户名单”的文件:ftpusers、user_list。原因就在这2个文件,只要这2个文件中存在的用户,就不允许登录FTP服务器上。

来看看这2个文件内容:

[root@ftpserver ~]# cat /etc/vsftpd/user_list 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftpserver ~]# cat /etc/vsftpd/ftpusers 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftpserver ~]# 

果然里边存在root用户,这正是vsftpd服务为了保证服务器安全默认就禁止了root和大部分系统用户登录ftp。这样做的好处是避免黑客通过FTP服务器对root密码进行暴力破解。

而为啥之前创建的ftptest用户可以登录ftp呢,那是因为创建的用户并没有被默认写入这2个文件。如果确保在生产环境中直接使用root用户对安全性没有影响,则直接在这2个文件中把root删除即可,否则请使用这2个文件中不存在的普通用户来登录ftp服务器。

删除这2个文件中的root用户,然后重启vsftpd服务,再次使用root登录ftp即可成功操作。

2.6 虚拟用户模式

再来看一种更加安全的认证模式即虚拟用户模式,因为更加安全所以配置起来稍微要麻烦一些。

我们仍然在之前的机器上继续操作,步骤步骤如下:

2.6.1 创建用户数据库文件

在ftpserver服务器中的vsftpd配置目录下创建包含用户信息的文件vuser.list(文件名字任意取)

[root@ftpserver ~]# cd /etc/vsftpd/
[root@ftpserver vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@ftpserver vsftpd]# vim vuser.list
vuser1
123456
vuser2
123456

vuser.list文件中包含vuser1和vuser2两个用户,密码均为123456。文件中奇数行表示账号名,偶数行表示密码。

接下来要将vuser.list文件转换为vsftpd服务程序能直接加载的格式,转换格式使用db_load命令,该命令用哈希算法将原始的明文信息文件转换为数据库文件。

在使用db_load命令前,查看该命令是否安装

[root@ftpserver vsftpd]# db_load
usage: db_load [-nTV] [-c name=value] [-f file][-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file
[root@ftpserver vsftpd]# 

出现该命令的用法,说明默认已经安装了。

如果未安装需要手动安装,该命令包含在db4包中,使用命令yum -y install db4安装即可。

既然安装了db_load命令,那就使用它来转换用户文件格式

[root@ftpserver vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@ftpserver vsftpd]# file vuser.db 
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@ftpserver vsftpd]# ll vuser.db 
-rw-r--r--. 1 root root 12288 Jan 14 21:16 vuser.db
[root@ftpserver vsftpd]# chmod 600 vuser.db 
-rw-------. 1 root root 12288 Jan 14 21:16 vuser.db
[root@ftpserver vsftpd]# rm -rf vuser.list 
[root@ftpserver vsftpd]# 

通过db_load命令就把明文的vuser.list文件转换为了vuser.db格式的文件,并通过chmod命令降低该文件的权限,从而避免其他人查看到该数据库文件的内容,最后直接把明文的vuser.list文件删除。

2.6.2 创建PAM文件

PAM(Pluggable Authentication Module)是一种认证机制,它将服务与认证方式分开,使得系统管理员可以轻易的调整服务程序的认证方式,而不必对应用程序进行任何修改。它涉及的内容挺多的,此处仅仅先了解概念即可。

在ftpserver服务器上新建一个PAM文件vsftpd.vu(文件名可以任意)用于虚拟用户认证,文件内的db参数为上一步使用功能db_load命令生成的数据库文件的路径,但不用写后缀名

[root@ftpserver vsftpd]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser

2.6.3 创建本地用户

既然是虚拟用户认证,为啥还需要建立本地用户呢?可以简单理解为虚拟指定一个ftp文件存储的根目录,当虚拟用户登录ftp服务器后默认访问的就是这个目录。

由于Linux中一切文件都有所有者和所属组,假设前文创建的虚拟用户vuser1创建了一个文件,但是系统中却没有vuser1这个用户,就会导致文件的权限出现错误。因此需要创建一个本地用户来映射虚拟用户,让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。

由于ftp目录中的文件可能经常变化,因此我们新建一个本地用户virtual并指定其家目录为/var/ftpdir目录。同时我们禁用此本地用户登录FTP服务器,从而避免黑客利用该本地用户登录系统。禁止与虚拟用户关联的本地用户并不会影响虚拟用户的登录。

[root@ftpserver vsftpd]# useradd -d /var/ftpdir -s /sbin/nologin virtual
[root@ftpserver vsftpd]# ll -d /var/ftpdir/
drwx------. 3 virtual virtual 74 Jan 14 21:46 /var/ftpdir/
[root@ftpserver vsftpd]# chmod -Rf 755 /var/ftpdir/
[root@ftpserver vsftpd]# ll -d /var/ftpdir/        
drwxr-xr-x. 3 virtual virtual 74 Jan 14 21:46 /var/ftpdir/
[root@ftpserver vsftpd]# 

修改目录权限,让其他人可读。

2.6.4 vsftpd主配置文件配置

配置vsftpd主配置文件,指定之前创建的PAM认证文件以及与虚拟用户关联的本地用户。

[root@ftpserver vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES

实际就是在原有基础上添加:guest_enable=YES、guest_username=virtual、allow_writeable_chroot=YES,并修改pam_service_name=vsftpd.vu为之前创建的pam认证文件。另外注意,必须开启本地模式(local_enable=YES)。

虚拟用户认证相关参数及作用如下:

参数作用
anonymous_enable=NO禁止匿名开放模式
local_enable=YES允许本地用户模式
guest_enable=YES开启虚拟用户模式
guest_username=virtual指定虚拟用户账户
pam_service_name=vsftpd.vu指定PAM文件,存放于/etc/pam.d/目录下,默认是vsftpd文件
allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求

2.6.5 虚拟用户权限设置

假设我们要区别对待vuser1和vuser2,只允许vuser1查看文件,而允许vuser2上传、创建、修改、查看、删除文件。这种需求在企业真实环境中是常见的,我们可以通过vsftpd服务器程序来实现。

[root@ftpserver vsftpd]# mkdir /etc/vsftpd/vusers_dir
[root@ftpserver vsftpd]# cd vusers_dir/
[root@ftpserver vusers_dir]# touch vuser1
[root@ftpserver vusers_dir]# vim vuser2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

只需要在vsftpd配置目录下新建vusers_dir目录(名字可以任意取),在目录中分别对应这2个用户创建文件并写入权限即可。

同时修改vsftpd主配置文件,过添加 user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。

[root@ftpserver vsftpd]# vim /etc/vsftpd/vsftpd.conf
...省略原有内容
user_config_dir=/etc/vsftpd/vusers_dir

配置完成之后重启vsftpd服务。

2.6.6 验证不同虚拟用户设置的权限是否生效

此时我们就可以使用虚拟用户vuser1和vuser2登录ftp进行测试了

> 由于我们按照之前的基础上进行演示,之前已经配置好了防火墙和SELinux相关策略,因此这里无需配置(实际操作时要根据实际情况进行,防火墙和SELinux会对ftp客户端的操作造成影响)。

使用vuser1登录测试验证是否有创建目录权限

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir test
550 Permission denied.
ftp> exit
221 Goodbye.
[root@ftp ~]#

正如之前设置一样,vuser1只有查看权限,没有创建目录的权限。

再来看看vuser2

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir vuser2
257 "/vuser2" created
ftp> rmdir vuser2
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
[root@ftp ~]# 

正如需求一致,vuser2具备创建和删除目录的权限。这样就可以根据实际需要灵活配置不同用户的权限。

2.6.7 其他注意事项及常见错误

(1)配置了虚拟用户登录后,本地用户登录就会失效

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): root
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> exit
221 Goodbye.
[root@ftp ~]# 

(2)2.6.4节中的vsftpd主配置文件中必须要开启本地登录模式

如果不开,将报错,提示本地模式和匿名模式必须开启一个,显然虚拟用户模式就是为了提高安全,因此我们不开匿名模式而开启本地模式。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
500 OOPS: vsftpd: both local and anonymous access disabled!
ftp> exit
[root@ftp ~]# 

(3)2.6.4节中的主配置文件参数allow_writeable_chroot=YES必须开启

如果不开将报错

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser1
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> exit
[root@ftp ~]# 

(3)防火墙影响ftp登录不了

默认情况防火墙策略阻止了ftp端口,ftp客户端登录将得到如下错误

[root@ftp ~]# ftp 192.168.78.101
ftp: connect: No route to host
ftp> exit

此时需要在ftp服务器上执行:iptables -F

(4)SELinux阻止文件创建

本来vuser2是有创建文件权限的,但是由于受到默认SELinux策略影响,将不能创建文件

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir vuser2
550 Create directory operation failed.
ftp> exit
221 Goodbye.
[root@ftp ~]# 

此时需要在ftp服务器执行:setsebool -P ftpd_full_access=off命令即可。

三、简单文件传输协议TFTP

3.1 TFTP概述

TFTP(Trivial File Transfer Protocol)简单文件传输协议,是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。可以认为它是FTP协议的简化版本。

3.2.1 TFTP缺点

TFTP的命令功能不如FTP服务强大,不能遍历目录,在安全性方比FTP差。传输文件采用 UDP 协议,端口号为 69,文件传输过程不如FTP协议可靠。

3.2.2 TFTP优点

TFTP不需要客户端的权限认证, 减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。

3.2 TFTP操作案例

3.2.1 TFTP安装并启动

我们还是继续使用之前的两台虚拟机,在主机ftpserver上安装tftpsever服务,在主机ftp上安装tftp服务。

(1)tftp服务器安装

[root@ftpserver ~]# rpm -q tftp-server
package tftp-server is not installed
[root@ftpserver ~]# yum install tftp-server
...省略中间内容
Installed:tftp-server.x86_64 0:5.2-22.el7                                           
Complete!
[root@ftpserver ~] 

在RHEL7系统中,TFTP服务是使用 xinetd 服务程序来管理的,在安装TFTP软件包后,还需要在 xinetd服务程序中将其开启。

配置之前先看tftp服务器是否安装xinetd服务

[root@ftpserver ~]# systemctl restart xinetd
Failed to issue method call: Unit xinetd.service failed to load: No such file or directory.

出现这个结果表示为安装xinetd,需要手动进行安装。

[root@ftpserver ~]# yum install xinetd

在tftp服务器中,修改/etc/xinetd.d/tftp配置文件,将disable=yes改为no

[root@ftpserver ~]# vim /etc/xinetd.d/tftp 
service tftp
{socket_type             = dgramprotocol                = udpwait                    = yesuser                    = rootserver                  = /usr/sbin/in.tftpdserver_args             = -s /var/lib/tftpbootdisable                 = noper_source              = 11cps                     = 100 2flags                   = IPv4
}
[root@ftpserver ~]#

修改后重启xinetd服务并添加到开机启动。

[root@ftpserver ~]# systemctl restart xinetd
[root@ftpserver ~]# systemctl enable xinetd

考虑到有些系统的防火墙默认没有允许 UDP 协议的 69 端口,因此 需要手动将该端口号加入到防火墙的允许策略中。

[root@ftpserver ~]# firewall-cmd --permanent --add-port=69/udp
success
[root@ftpserver ~]# firewall-cmd --reload
success
[root@ftpserver ~]#

TFTP 的根目录为/var/lib/tftpboot。

在tftp服务器上,创建文件tftptest.txt以供tftp下载

[root@ftpserver ~]# echo "test tftp">/var/lib/tftpboot/tftptest.txt
[root@ftpserver ~]# ll /var/lib/tftpboot/                          
total 4
-rw-r--r--. 1 root root 10 Jan 14 23:05 tftptest.txt
[root@ftpserver ~]# 

(2)fttp客户端安装

[root@ftp ~]# rpm -q tftp
package tftp is not installed
[root@ftp ~]# yum install tftp
...省略中间内容
Installed:tftp.x86_64 0:5.2-22.el7                                                 
Complete!
[root@ftp ~]#

3.2.2 使用TFTP

在tftp客户端连接到tftpserver并下载文件

[root@ftp ~]# tftp 192.168.78.101
tftp> get tftptest.txt
tftp> quit
[root@ftp ~]#  ll tftptest.txt 
-rw-r--r--. 1 root root 10 Jan 14 23:09 tftptest.txt
[root@ftp ~]#  cat tftptest.txt
test tftp
[root@ftp ~]# 

可以看到已经成功把文件下载到本地了。

3.2.3 TFTP相关的命令

列举几个tftp相关的命令和参数

命令作用
?帮助信息
put上传文件
get下载文件
verbose显示详细的处理信息
status显示当前的状态信息
binary使用二进制进行传输
ascii使用 ASCII 码进行传输
timeout设置重传的超时时间
quit退出

当然TFTP还有很多其他用户,以后有机会在深入讨论。

下一篇文章将讲解Linux下文件共享的方法。

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. spring cloud是什么?为什么说spring cloud就要提到它的核心组件?

    我在spring boot & spring cloud关系?里曾说到下次讲spring cloud的核心组件。那为什么说到spring cloud就要提到spring cloud的核心组件呢?spring cloud都提供了分布式系统一整套解决方案。相信大家刚接触微服务,刚接触spring cloud的时候,经常会看到这句话吧。那这句…...

    2024/5/1 21:10:44
  2. spring入门:关键点整理(3)-- aop

    1:aop:面向切面编程aop术语:Joinpoint 连接点:原对象的方法Pointcut 切入点:代理中已增强的方法Advice 通知增强:增强的代码Target 目标对象:被代理的对象,原对象Waving 织入:通知应用到切入点的过程proxy 代理:织入目标对象后,形成代理对象aspect 切面:切入点+通知…...

    2024/4/17 9:56:41
  3. 1.Elasticsearch安装手册[Elasticsearch系列]

    Elasticsearch单机安装手册 下载安装 wget -c https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz tar -zxf elasticsearch-7.6.1-linux-x86_64.tar.gz配置 修改配置文件 # 修改配置文件 cd elasticsearch-7.6.1 vi config/elasti…...

    2024/4/14 15:54:23
  4. Hisi网络接口修改成RMII

    Hisi网络接口修改成RMII:https://notes.z-dd.net/2020/03/07/Hisi%E7%BD%91%E7%BB%9CPHY%E5%8F%8A%E6%8E%A5%E5%8F%A3%E4%BF%AE%E6%94%B9%E6%88%90RMII/...

    2024/4/21 1:42:09
  5. .NetWebApi返回类封装

    定义返回类ReturnMsg: public class ReturnMsg {/// <summary>/// 成功构造函数/// </summary>/// <param name="ReBody">实体类或者实体类集合都可以</param>public ReturnMsg(object ReBody){Status = ReStatus.Success.ToString();Body …...

    2024/4/19 17:52:34
  6. vxe-table 如何格式化单元格内容,全局可复用的格式化方法

    vxe-table 如何格式化单元格内容,全局可复用的格式化方法 一般情况下通过表格渲染列表后,经常需要对单元格的内容进行格式化,比如格式化数值、字典转换…等,在 vxe-table 支持的格式化有 n 种,不同场景可以选择最优的方式 方法1: 直接对源数据进行转换,该方式的性能最优…...

    2024/4/26 22:30:29
  7. .NET Core是.NET的跨平台版本,用于构建网站,服务和控制台应用程序。.NET Framework

    .NET Core是.NET的跨平台版本,用于构建网站,服务和控制台应用程序。.NET Frameworkhttps://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral...

    2024/4/14 15:54:20
  8. 单片机中级项目13丨矩阵按键数码管移位显示

    单片机中级项目13丨矩阵按键数码管移位显示 /******************************************************************************* * 实 验 名 : 动态显示数码管实验 * 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4键盘使用P1 * 实验效果 : 按矩阵键盘分别显示在数码管…...

    2024/4/14 15:54:20
  9. Azure IoT 中级(5)- 在 DPS/IoT Hub中使用X509证书的准备工作(1)了解证书链

    准备工作(1)了解证书链本文介绍如下内容:1. 了解证书链2. 使用OPENSSL和 微软提供的示例工具生成自签名证书并应用在IoT Hub/DPS中;视频讲解:您可以在B站观看视频讲解:https://www.bilibili.com/video/av92976806/或在本站观看:https://www.51azure.cloud/post/2020/3/3/…...

    2024/4/14 15:54:18
  10. 为什么我们需要机器学习

    人类文明的进步是一步步把人从他们需要做的重复性的工作中解放出来,去做他们更想做的事情。这就需要各行各业实现自动化,智能化(可以认为时自动化的高级阶段)。不知道你有没有人和你说过,当你在电脑上做同样的事情超过两次时,你就需要写一个程序去做它。这就是用程序的方…...

    2024/4/21 7:31:47
  11. 高德开放平台天气查询API

    更多内容,请查看博客原文:高德开放平台天气查询API https://finolo.gy/2020/01/高德开放平台天气查询API/ 高德开放平台下的天气查询接口文档 https://lbs.amap.com/api/webservice/guide/api/weatherinfo 注册开发者账号,获取Key https://restapi.amap.com/v3/weather/weat…...

    2024/4/25 12:43:23
  12. 阿里云ECS Windows 2012 IIS配置web站点访问和多个站点设置

    1,打开IIS管理器2,点击网站右键添加网站设置,可以参考默认网站设置,网站名称右键选择高级设置多个站点以此类推,端口都可以设置80端口但是绑定的域名必须不同域名解析后访问链接超时或者通过公网ip无法访问web; 检查域名解析是否正确检查iis是否绑定域名检查云服务器有没有…...

    2024/5/1 21:37:45
  13. html5新增常用标签和属性

    HTML5 新增常用元素 HTML5的声明为: 它不用再像之前的版本一样在声明中引用DTD。DTD(document type definition)定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。在HTML中,DTD规定了标记语言的规则,使浏览器能正确地呈现内容。而HTML5不基于SGML,所以…...

    2024/5/1 23:57:25
  14. idea启动tomcat日志乱码

    乱码样式:解决方案:如下图设置tomcat1. 代码:-Dfile.encoding=UTF-82. 进入设置界面:set--->editor--->file encoding(全部设置为UTF-8)*(最重要)3. 进入idea的安装文件中,bin文件下,修改idea.exe.vmoptions和idea64.exe.vmoptions分别加入如下两句代码:-Dfile…...

    2024/4/14 15:54:13
  15. 使用vue版本地dataV组件库

    dataV 这个库主要是用来写监控大屏得,提供了很多好看得图表供选择,也有vue版本和react版本。 官方文档 正常按照官方文档下载库,然后导入组件,传入文档中要求的配置项就可以成功得渲染出来,下次简单写一点我的使用过程<div class="full-screen"><dv-bo…...

    2024/4/14 15:54:12
  16. 三数之和

    Q1:给定一个包含 n 个整数的数组 nums和目标数target,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = target ?请你找出所有满足条件且不重复的三元组。分析:将三数问题转化为两数问题,使用双指针left,right定位,从第一个位置i开始遍历,寻找i之后的满足的nu…...

    2024/4/21 7:58:36
  17. Hisi编译与烧写

    Hisi编译与烧写:https://notes.z-dd.net/2020/03/07/Hisi%E7%BC%96%E8%AF%91%E4%B8%8E%E7%83%A7%E5%86%99/...

    2024/4/14 15:54:11
  18. MAC 重置电脑卡在 远程管理 "Nuvolo Tchonlogise Inc"处理方法

    当你重装你的mac时候如果你的MAC一直卡在让你输入 远程管理 "Nuvolo Tchonlogise Inc" 账号,你却忘了你的账号,安装不了时候,你可以不联网先安装系统,这样你就可以继续的安装你mac具体步骤就是 你在重装你的mac选择网络时候,选择 "其他网络选择" 然…...

    2024/4/14 15:54:10
  19. linux C语言头文件

    /C语言标准头文件: #include <assert.h> // assert断言 #include <stdio.h> // 定义输入/输出函数 #include <stdlib.h> // 定义杂项函数及内存分配函数,atoi,free,abs,rand #include <string.h> // 字符串处理 #include <errno.h> // 定…...

    2024/4/14 15:54:08
  20. @Scheduled(cron = "* * * * * *") cron表达式详解

    1.cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}2.cron表达式各占位符解释: {秒数}{分钟} ==> 允许值范围: 0~59 ,不允许为空值,若值不合法,调度器将抛出SchedulerException异常 “*” 代表每隔1秒钟触发; “,” 代表在指定的秒数触发,比…...

    2024/4/14 15:54:07

最新文章

  1. 条款3:绝对不要以多态(polymorphically)方式处理数组

    继承&#xff08;inheritance&#xff09;的最重要性质之一就是&#xff1a;你可以通过“指向 base class objects"的pointers 或references&#xff0c;来操作derived class objects。 如此的pointers和references,我们说其行为是多态的(polymorphically&#xff09;——…...

    2024/5/2 1:09:47
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 前端开发攻略---Vue通过自定义指令实现元素平滑上升的动画效果(可以自定义动画时间、动画效果、动画速度等等)。

    1、演示 2、介绍 这个指令不是原生自带的&#xff0c;需要手动去书写&#xff0c;但是这辈子只需要编写这一次就好了&#xff0c;后边可以反复利用。 3、关键API IntersectionObserver IntersectionObserver 是一个用于监测元素是否进入或离开视口&#xff08;viewport&#x…...

    2024/5/1 10:20:41
  4. #QT项目实战(天气预报)

    1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 3.记录&#xff1a; &#xff08;1&#xff09;调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…...

    2024/5/1 13:42:00
  5. 长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审

    长安链智能合约标准协议 在智能合约编写过程中&#xff0c;不同的产品及开发人员对业务理解和编程习惯不同&#xff0c;即使同一业务所编写的合约在具体实现上也可能有很大差异&#xff0c;在运维或业务对接中面临较大的学习和理解成本&#xff0c;现有公链合约协议规范又不能完…...

    2024/4/28 0:34:29
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57