LinuxProbe 0x14 虚拟网站主机功能(基于端口)、Vsftpd服务传输文件、TFTP简单文件传输协议

  • 虚拟网站主机功能

基于端口号

基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用Apache配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。

因此我们不仅要考虑httpd服务程序的配置因素,还需要考虑到SELinux服务对新开设端口的监控。一般来说,使用80、443、8080等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux服务的限制。

 

第1步:分别在/home/wwwroot中创建用于保存不同网站数据的三个目录,并向其中分别写入网站的首页文件。

第2步:在httpd服务配置文件的第46行至48行分别添加用于监听6111、6222和6333端口的参数。

第3步:在httpd服务的配置文件中大约134行处开始,分别追加写入三个基于端口号的虚拟主机网站参数,然后保存并退出,并重启httpd服务。

第4步: 正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合,并用restorecon命令让新配置的SELinux安全上下文立即生效。

第5步:SELinux允许的与HTTP协议相关的端口号中默认没有包含6111、6222和6333,因此需要将这三个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。

# dnf install httpd
# mkdir -p /home/wwwroot/6111
# mkdir -p /home/wwwroot/6222
# mkdir -p /home/wwwroot/6333
# echo "port:6111" > /home/wwwroot/6111/index.html
# echo "port:6222" > /home/wwwroot/6222/index.html
# echo "port:6333" > /home/wwwroot/6333/index.html


# vim /etc/httpd/conf/httpd.conf
37 # Listen: Allows you to bind Apache to specific IP addresses and/or
38 # ports, instead of the default. See also the
39 # directive.
40 #
41 # Change this to Listen on specific IP addresses as shown below to
42 # prevent Apache from glomming onto all bound IP addresses.
43 #
44 #Listen 12.34.56.78:80
45 Listen 80
46 Listen 6111
47 Listen 6222
48 Listen 6333


# vim /etc/httpd/conf/httpd.conf
134 <VirtualHost 192.168.10.10:6111>
135     DocumentRoot /home/wwwroot/6111
136     ServerName www.linuxprobe.com   域名暂不生效随意写
137     <Directory /home/wwwroot/6111>  目录权限
138     AllowOverride None              伪静态
139     Require all granted             允许访问
140     </Directory>
141 </VirtualHost>
142 <VirtualHost 192.168.10.10:6222>
143     DocumentRoot /home/wwwroot/6222
144     ServerName www.linuxcool.com
145     <Directory /home/wwwroot/6222>
146     AllowOverride None
147     Require all granted
148     </Directory>
149 </VirtualHost>
150 <VirtualHost 192.168.10.10:6333>
151     DocumentRoot /home/wwwroot/6333
152     ServerName www.linuxdown.com
153     <Directory /home/wwwroot/6333>
154     AllowOverride None
155     Require all granted
156     </Directory>
157 </VirtualHost>


# ls -ldZ /var/www/html
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333/*
# restorecon -Rv /home/wwwroot/


# semanage port -a -t http_port_t -p tcp 6111
# semanage port -a -t http_port_t -p tcp 6222
# semanage port -a -t http_port_t -p tcp 6333
# semanage port -l | grep http
# systemctl restart httpd
# systemctl enable httpd
# firefox

机器端口:0 - 65535个

 

 

  • Apache访问控制

Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。

它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。

在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。

比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。

 

第1步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含Successful单词的首页文件。

第2步:打开httpd服务的配置文件,在第161行后面添加下述规则来限制源主机的访问。

            这段规则的含义是允许使用Firefox浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。

# dnf install httpd

# mkdir /var/www/html/server
# echo "Successful" > /var/www/html/server/index.html


# vim /etc/httpd/conf/httpd.conf
161 <Directory "/var/www/html/server">
162     SetEnvIf User-Agent "Firefox" ff=1    ##set environment if 判断用户的环境变量  ff 别名
163     Order allow,deny                      ##用户对一个允许判断,没有允许的全部拒绝
164     Allow from env=ff
165 </Directory>
# systemctl restart httpd
# systemctl enable httpd
# firefox


# iptables -F
# firewall-cmd --zone=public --add-service=http

除了匹配源主机的浏览器特征之外,还可以通过匹配源主机的IP地址进行访问控制。例如,我们只允许IP地址为192.168.10.20的主机访问网站资源,那么就可以在httpd服务配置文件的第161行后面添加下述规则。

# vim /etc/httpd/conf/httpd.conf
161 <Directory "/var/www/html/server">
162     Order allow,deny
163     Allow from 192.168.10.20
164 </Directory>
# systemctl restart httpd
# systemctl enable httpd
# firefox

 

 

 

  • Vsftpd服务传输文件

文件传输协议(File Transfer Protocol,FTP)

vsftpd服务程序三种认证模式(匿名开放模式、本地用户模式、虚拟用户模式)

可插拔认证模块(Pluggable Authentication Module,PAM)

简单文件传输协议(Trivial File Transfer Protocol,TFTP)

 

为了能够在装有Windows、Linux、UNIX、Mac等不同的操作系统的设备之间解决问题解决文件传输问题,FTP(File Transfer Protocol)文件传输协议应运而生。

 

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

FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术。

 

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

FTP协议有下面两种工作模式

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

        被动模式:FTP服务器等待客户端发起连接请求(默认工作模式)。

vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。在不影响使用的前提下,能够让管理者自行决定是公开匿名、本地用户还是虚拟用户的验证方式。

# dnf install vsftpd


清空并保存防火墙策略
# iptables -F
# iptables-save


把FTP协议添加到firewalld服务的允许列表中
# firewall-cmd --permanent --zone=public --add-service=ftp
# firewall-cmd --reload


vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf), 通过grep -v 过滤掉注释行信息,并将文件写入到源文件中
# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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

vsftpd服务程序常用的参数以及作用

参数

作用

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为不限制

 

vsftpd作为更加安全的文件传输协议服务程序,允许用户以三种认证模式登录到FTP服务器上。

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

        本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。

        虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。

 

ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。

# dnf install ftp

 

匿名访问模式

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

向匿名用户开放的权限参数以及作用

参数

作用

anonymous_enable=YES

允许匿名访问模式

anon_umask=022

匿名用户上传文件的umask值

anon_upload_enable=YES

允许匿名用户上传文件

anon_mkdir_write_enable=YES

允许匿名用户创建目录

anon_other_write_enable=YES

允许匿名用户修改目录名称或删除目录

# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES   匿名
2 anon_umask=022         文件/目录新建后权限大小 
3 anon_upload_enable=YES  文件传输
4 anon_mkdir_write_enable=YES   可读可写
5 anon_other_write_enable=YES   其他写入权限 剪切等
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES


重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd


在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。在连接到FTP服务器后,默认访问的是/var/ftp目录。
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10: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> mkdir files
550 Permission denied.权限拒绝


# ls -ld /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug 13 2021 /var/ftp/pub
# chown -R ftp /var/ftp/pub
# ls -ld /var/ftp/pub
drwxr-xr-x. 2 ftp root 6 Aug 13 2021 /var/ftp/pub
# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10: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> mkdir files
550 Create directory operation failed.创建目录的操作失败


修改SELinux策略并将策略加入开机启动中   SELinux域
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on         


//再次尝试
# ftp 192.168.10.10
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

 

本地用户模式

本地用户模式使用的权限参数以及作用

参数

作用

anonymous_enable=NO

禁止匿名访问模式

local_enable=YES

允许本地用户模式

write_enable=YES

设置可写权限

local_umask=022

本地用户模式创建文件的umask值

userlist_deny=YES

启用“禁止用户名单”,名单文件为ftpusers和user_list

userlist_enable=YES

开启用户作用名单文件功能

 

默认情况下本地用户所需的参数都已经在了,不需要修改。而umask这个参数一般中文被称为权限掩码或权限补码,能够直接影响到新建文件的权限值。

例如Linux系统中新建普通文件后权限是644,新建的目录权限是755,虽然用户都习以为常了,但为什么是这个数呢?

首先不得不说到其实普通文件的默认权限应该是666,目录权限会是777,这是写在系统配置文件中的。但默认值不等于最终权限值,根据公式“默认权限 - umask = 实际权限”,而umask值默认是022,所以实际文件到手就剩下644,目录文件剩下755了。

# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES


重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd

 

vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers和user_list), vsftpd服务程序目录中的这两个文件只要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上。

# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>

此文件中包含的用户名,则无法登陆系统中  将两个文件中的root用户删除,就可以root用户登录了 
# cat /etc/vsftpd/user_list
# cat /etc/vsftpd/ftpuserss

 

同样是禁止用户登录的功能,却要做两个一摸一样的文件呢?

其实在user_list文件上面,如果把上面主配置文件中userlist_deny参数值改成NO,那么user_list列表就变成了强制白名单,功能完全是反过来的,只允许列表内的用户访问,拒绝其他人。

修改SELinux策略并将策略加入开机启动中
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on


# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/root/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

 

虚拟用户模式

虚拟用户模式是这三种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而不能用于SSH登录服务器。

 

第1步:重置安装vsftpd服务后。创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。

第2步:创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。

            FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

第3步:建立用于支持虚拟用户的PAM文件。

第4步:在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。

            当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。           

第5步:为虚拟用户设置不同的权限( 上传、创建、修改、查看、删除文件)。

第6步:设置SELinux域允许策略,使用虚拟用户模式登录FTP服务器。

# cd /etc/vsftpd/
# vim vuser.list
zhangsan 账号
redhat 密码
lisi 账号
redhat 密码


使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限,然后再把原始的明文信息文件删除。
# db_load -T -t hash -f vuser.list vuser.db
# chmod 600 vuser.db
# rm -f vuser.list


创建映射账户并禁止该账户登录系统
# useradd -d /var/ftproot -s /sbin/nologin virtual
# ls -ld /var/ftproot/
# chmod -Rf 755 /var/ftproot/


新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀
# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser


修改配置文件
# vim /etc/vsftpd/vsftpd.conf  
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 guest_enable=YES
5 guest_username=virtual      虚拟用户登录xiaofu
6 allow_writeable_chroot=YES  
7 local_umask=022
8 dirmessage_enable=YES
9 xferlog_enable=YES
10 connect_from_port_20=YES
11 xferlog_std_format=YES
12 listen=NO
13 listen_ipv6=YES
14 pam_service_name=vsftpd.vu   指定修改后的pam对应
15 userlist_enable=YES


设置权限
# mkdir /etc/vsftpd/vusers_dir/
# cd /etc/vsftpd/vusers_dir/
# touch lisi
# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES


修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。
# vim /etc/vsftpd/vsftpd.conf
15 userlist_enable=YES
16 user_config_dir=/etc/vsftpd/vusers_dir


重启vsftpd服务程序,让新的配置参数生效
# systemctl restart vsftpd
# systemctl enable vsftpd


修改SELinux策略并将策略加入开机启动中
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access=on


# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files550 Permission denied.
ftp> exit
221 Goodbye.

 

PAM可插拔认证模块是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

 

PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计的思想,包含应用程序层、应用接口层、鉴别模块层

 

 

利用PAM文件进行认证时使用的参数以及作用

参数

作用

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根目录执行写入操作,而且不拒绝用户的登录请求

 

vsftpd服务程序登陆后所在目录

登录方式

默认目录

匿名公开

/var/ftp

本地用户

该用户的家目录

虚拟用户

对应映射用户的家目录

 

 

 

  • TFTP简单文件传输协议

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

TFTP的命令功能不如FTP服务强大,甚至不能遍历目录,在安全性方面也弱于FTP服务。

由于TFTP在传输文件时采用的是UDP协议,占用的端口号为69,因此文件的传输过程也不像FTP协议那样可靠。

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

tftp-server是服务程序,tftp是用于连接测试的客户端工具,xinetd是管理服务

# dnf install tftp-server tftp xinetd

TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能,专门用于管理那些比较小的应用程序的开关工作,想开启那个服务就编辑对应的xinetd配置文件的开关参数。

在安装TFTP软件包后,还需要在xinetd服务程序中将其开启。在RHEL 8版本系统中tftp所对应的配置文件默认不存在,需要用户根据示例文件(/usr/share/doc/xinetd/sample.conf)自行创建。

# vim /etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}


重启xinetd服务并将它添加到系统的开机启动项中,将69端口号加入到防火墙的允许策略中
# systemctl restart xinetd
# systemctl enable xinetd
# firewall-cmd --zone=public --permanent --add-port=69/udp
# firewall-cmd --reload

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

 tftp命令中可用的参数以及作用

参数

作用

?

帮助信息

put

上传文件

get

下载文件

verbose

显示详细的处理信息

status

显示当前的状态信息

binary

使用二进制进行传输

ascii

使用ASCII码进行传输

timeout

设置重传的超时时间

quit

退出

# echo "i love linux" > /var/lib/tftpboot/readme.txt
# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  readme.txt  Videos
Desktop          Downloads  Music                 Public    Templates
# cat readme.txt
i love linux

 

 

 

 

热门文章

暂无图片
编程学习 ·

那些年让我们目瞪口呆的bug

程序员一生与bug奋战&#xff0c;可谓是杀敌无数&#xff0c;见怪不怪了&#xff01;在某知识社交平台中&#xff0c;一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读&#xff0c;可见程序员们对一个话题的敏感度有多高。 1、麻省理工“只能发500英里的邮件” …
暂无图片
编程学习 ·

redis的下载与安装

下载redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz解压redis tar -zxvf redis-5.0.0.tar.gz编译 make安装 make install快链方便进入redis ln -s redis-5.0.0 redis
暂无图片
编程学习 ·

《大话数据结构》第三章学习笔记--线性表(一)

线性表的定义 线性表&#xff1a;零个或多个数据元素的有限序列。 线性表元素的个数n定义为线性表的长度。n为0时&#xff0c;为空表。 在比较复杂的线性表中&#xff0c;一个数据元素可以由若干个数据项组成。 线性表的存储结构 顺序存储结构 可以用C语言中的一维数组来…
暂无图片
编程学习 ·

对象的扩展

文章目录对象的扩展属性的简洁表示法属性名表达式方法的name属性属性的可枚举性和遍历可枚举性属性的遍历super关键字对象的扩展运算符解构赋值扩展运算符AggregateError错误对象对象的扩展 属性的简洁表示法 const foo bar; const baz {foo}; baz // {foo: "bar"…
暂无图片
编程学习 ·

让程序员最头疼的5种编程语言

世界上的编程语言&#xff0c;按照其应用领域&#xff0c;可以粗略地分成三类。 有的语言是多面手&#xff0c;在很多不同的领域都能派上用场。大家学过的编程语言很多都属于这一类&#xff0c;比如说 C&#xff0c;Java&#xff0c; Python。 有的语言专注于某一特定的领域&…
暂无图片
编程学习 ·

写论文注意事项

参考链接 给研究生修改了一篇论文后&#xff0c;该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情&#xff0c;很多情况下&#xff0c;他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言&#xff0c;首先要用一小句话引…
暂无图片
编程学习 ·

安卓 串口开发

上图&#xff1a; 上码&#xff1a; 在APP grable添加 // 串口 需要配合在项目build.gradle中的repositories添加 maven {url "https://jitpack.io" }implementation com.github.licheedev.Android-SerialPort-API:serialport:1.0.1implementation com.jakewhart…
暂无图片
编程学习 ·

2021-2027年中国铪市场调研与发展趋势分析报告

2021-2027年中国铪市场调研与发展趋势分析报告 本报告研究中国市场铪的生产、消费及进出口情况&#xff0c;重点关注在中国市场扮演重要角色的全球及本土铪生产商&#xff0c;呈现这些厂商在中国市场的铪销量、收入、价格、毛利率、市场份额等关键指标。此外&#xff0c;针对…
暂无图片
编程学习 ·

Aggressive cows题目翻译

描述&#xff1a; Farmer John has built a new long barn, with N (2 < N < 100,000) stalls.&#xff08;John农民已经新建了一个长畜棚带有N&#xff08;2<N<100000&#xff09;个牛棚&#xff09; The stalls are located along a straight line at positions…
暂无图片
编程学习 ·

剖析组建PMO的6个大坑︱PMO深度实践

随着事业环境因素的不断纷繁演进&#xff0c;项目时代正在悄悄来临。设立项目经理转岗、要求PMP等项目管理证书已是基操&#xff0c;越来越多的组织开始组建PMO团队&#xff0c;大有曾经公司纷纷建造中台的气质&#xff08;当然两者的本质并不相同&#xff0c;只是说明这个趋势…
暂无图片
编程学习 ·

Flowable入门系列文章118 - 进程实例 07

1、获取流程实例的变量 GET运行时/进程实例/ {processInstanceId} /变量/ {变量名} 表1.获取流程实例的变量 - URL参数 参数需要值描述processInstanceId是串将流程实例的id添加到变量中。变量名是串要获取的变量的名称。 表2.获取流程实例的变量 - 响应代码 响应码描述200指…
暂无图片
编程学习 ·

微信每天自动给女[男]朋友发早安和土味情话

微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…
暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

项目经理,你有什么优势吗?

大侠被一个问题问住了&#xff1a;你和别人比&#xff0c;你的优势是什么呢? 大侠听到这个问题后&#xff0c;脱口而出道&#xff1a;“项目管理能力和经验啊。” 听者抬头看了一下大侠&#xff0c;显然听者对大侠的这个回答不是很满意&#xff0c;但也没有继续追问。 大侠回家…
暂无图片
编程学习 ·

nginx的负载均衡和故障转移

#注&#xff1a;proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one&#xff0c;内存缓存空间大小为200MB&#xff0c;1天没有被访问的内容自动清除&#xff0c;硬盘缓存空间大小为30GB。 pro…
暂无图片
编程学习 ·

业务逻辑漏洞

身份认证安全 绕过身份认证的几种方法 暴力破解 测试方法∶在没有验证码限制或者一次验证码可以多次使用的地方&#xff0c;可以分为以下几种情况︰ (1)爆破用户名。当输入的用户名不存在时&#xff0c;会显示请输入正确用户名&#xff0c;或者用户名不存在 (2)已知用户名。…