一、NFS+DHCP
NFS 网络文件系统
网络文件系统 NFS(Network File System)
在不同系统之间实现文件共享,提供文件进行共享的系统是主机,共享这些文件的计算机是客户机。甚至一台计算机可以是主机也可以是客户机。
1.基础题
1.安装NFS,对共享目录进行权限分配,并对配置文件进行设置
(1)CentOS 7系统实现NFS服务功能首先必须安装nfs-utils和rpcbind软件包
yum install -y nfs-utils rpcbind
(2)开启服务,开放服务端口,显示共享目录状态
systemctl start rpcbind
systemctl start nfs
(3)Centos系统防火墙默认没有开放NFS服务的端口号。要开放NFS服务相关的端口号,通过rpcinfo -p
查询。
/*
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=111/udp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --permanent --add-port=20048/tcp
firewall-cmd --permanent --add-port=20048/udp
*/firewall-cmd --permanent --add-service=nfsfirewall-cmd --reloadfirewall-cmd --list-all
(4)创建共享目录
[root@localhost ~]# mkdir /home/pub
[root@localhost ~]# ls -a /home/pub
[root@localhost ~]# cd /home/pub
[root@localhost pub]# echo "Hello" > a.txt
[root@localhost pub]# chmod -Rf 777 /home/pub
(5)NFS服务器的配置文件/etc/exports
vi /etc/exports
进入后添加
/home/pub *(sync,ro)
或
/home/pub 192.168.71.133(sync,rw)
或
/home/pub 192.168.1.0/24(sync,rw)sync 数据同步
ro 只读
rw 读写配置完后记得关闭再打开过nfs服务
systemctl stop nfs
systemctl start nfs
(6)显示共享目录状态
showmount -e 192.168.71.133
(7)客户端挂载NFS服务器中目录
mkdir -p /mnt/share
mount 192.168.71.133:/home/pub /mnt/sharels /mnt/share
(8)查看和卸载已挂载的目录(课本多的)
mount | grep nfs
umount /mnt/share
2.拓展题
(1)指定NFS客户端地址的配置详细说明
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 192.168.56.101 | 一般情况下,生产环境中此配置不多 |
授权整个网段可访问NFS | 192.168.56…0/24 | 其中的24等同于255.255.255.0,指定网段为生产环境中最常见的配置。配置简单、维护方便 |
授权某个域名客户端访问 | nfs.nulige.com | 此方法生产环境中一般情况不常用 |
/home/pub 192.168.56.101(sync,ro)
/home/pub 192.168.56.0/24(sync,rw)
/home/pub nfs.nulige.com(sync,rw)
(2)mount -o 参数对应选项
mount命令-o选项后面可以接的参数,注意,有些选项只有出现在/etc/fstab里面才有效,下面这些选项可以应用在绝大多数文件系统上,但是sync仅适合ext2、ext3、fat、vfat和ufs等文件系统。
参数 | 参数意义 | 系统默认值 |
---|---|---|
exec、noexec | 是否具有执行文件的权限,如果想要挂载的仅是普通资源数据区(如:图片、附件),那么可以选择noexec。 | exec |
user、nuser | 是否允许用户进行文件的挂载与卸载功能,如果要保护文件系统,最好不要提供用户进行挂载与卸载。 | nouser |
atime | 在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。 在高并发的情况下,建议通过明确加上noatime,来取消这个默认选项,以达到提升I/O性能,优化I/O的目的。 | atime |
-o exec:允许在文件系统中执行可执行文件,默认是exec允许
-o noexec: 不允许在文件系统中执行可执行文件
-o user: 使用者可以执行 mount/umount 的动作;
-o nouser: 使用者不可以执行 mount/umount 的动作;
-o atime: 系统会在每次读取文档时更新文档时间;
-o noatime: 系统会在每次读取文档时不更新文档时间;
(3)NFS配置权限设置常用参数说明
参数名称 | 参数用途 |
---|---|
rw | 读写权限 |
sync | 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。优点:数据安全不会丢;缺点:性能比不启动该参数要差 |
root_squash | 如果访问NFS Server共享目录的用户是root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。 |
/home/pub 192.168.56.101(sync,ro)
/home/pub 192.168.56.0/24(sync,noroot_squash)
DHCP 动态主机配置协议
动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一个简化主机IP地址分配管理的TCP/IP标准协议,用户可以利用DHCP服务器管理动态的IP地址分配及其他相关的环境配置工作,如:DNS服务器、Gateway(网关)的设置。
担任DHCP服务器的计算机需要安装TCP/IP协议,并为其设置静态IP地址、子网掩码、默认网关等内容。
在DHCP机制中可以分为服务器和客户端两个部分.
服务器使用固定的IP地址,在局域网中扮演着给客户端提供动态IP地址、DNS配置和网管配置的角色。
客户端与IP地址相关的配置,都在启动时由服务器自动分配。
1.基础题
安装并启动DHCP服务,配置DHCP服务,能为客户机自动分配IP地址,需要验证。
(1)首先进入控制面板 查看网络连接处 将VMnet1启用
然后更改虚拟机网络适配器为**仅主机模式😗*与主机共享的专用网络
(2)编辑-网络编辑器**-取消VMnet1的DHCP分配**
(3)手动设置VMnet1的IP地址 设置IP地址、掩码、网关
(4)在虚拟机中修改ifcfg-ens33配置
cd /etc/sysconfig/network-scripts/
vi ifcfg-ens33BEFROUTE=dhcp->static
添加👇
IPADDR=192.168.71.108
GATEWAY=192.168.71.108
NETMASK=255.255.255.0保存腿出后重启
systemctl restart networkip addr 查看ip地址是否改变
(5)通过本地ping虚拟机192.168.71.108
cmd
ping 192.168.71.108
(6)通过虚拟机ping本地记住关掉本地防火墙
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIYXZjaF-1643163313849)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20220103224955572.png)]
在linux下
ping 192.168.71.106验证
(7)以上为前期工作 接下来正式开始配置DHCP服务器
配置完静态地址之后可以用XShell登录了
yum install -y dhcp
此时无法启动dhcp
[root@localhost ~]# systemctl start dhcpd
Failed to start dhcp.service: Unit not found.
修改配置文件I 用模板文件example覆盖dhcpd.conf
cd /etc/dhcp
ls
vi dhcpd.conf配置文件为空
#see /usr/share/doc/dhcp*/dhcpd.conf.example
进入链接文件
cd /usr/share/doc/dhcp*/
ls
cp -a dhcpd.conf.example /etc/dhcp/dhcpd.conf
进行覆盖
修改配置文件II 进入主配置文件/etc/dhcp/dhcpd.conf
设置动态DNS更新模式:ddns-update-style 将值设为none即可。
ddns-update-style none; 将注释删掉
:set nu
:47,55 co 104
拷贝后修改如下
106 subnet 192.168.71.0 netmask 255.255.255.0 {
107 range 192.168.71.107 192.168.71.114;
108 option domain-name-servers ns1.internal.example.org;
109 option domain-name "internal.example.org";
110 option routers 192.168.71.108;
111 option broadcast-address 192.168.71.108;
112 default-lease-time 600;
113 max-lease-time 7200;
114 }
systemctl start dhcpd
(8)验证DHCP能够为客户机自动分配地址
将本地的VM1IP改为自动获取
然后禁用启动后
cmd
ipconfig
以太网适配器 VMware Network Adapter VMnet1:
IPv4 地址 . . . . . . . . . . . . : 192.168.71.110
2.拓展题
(1)定义全局参数:默认搜索域(√)
option domain-name “example.org”
(2)定义全局参数:默认租期,单位为秒
default-lease-time 600
(3)定义DNS服务动态更新的类型,
类型包括:none (不支持动态 更新),interim (互动更新模式)与ad-hoc (特殊更新模式)
ddns-update-style 类型
ddns-update-style none;
ddns-update-style interim;
ddns-update-style ad-hoc
(4)允许或忽略客户机更新DNS记录
allow/ignore client-updates
(5)定义客户机的网络时间服务器(NTP)
ntp-server IP 地址
(6)定义客户机的NIS域服务器的地址
nis-servers IP 地址
(7)指定网卡接口的类型与MAC地址
hardware 硬件类型MAC地址
(8)主机名通知DHCP客户机服务器的主机名
server-name
(9)将某个固定IP地址分配给指定主机
fixed-address IP 地址
二、DNS
DNS 域名系统
域名系统或者域名服务 DNS (Domain Name System/Service)
采用域名系统来管理名字和IP的对应关系。
正向解析与反向解析
(1)正向解析。正向解析是指域名到IP地址的解析过程。
(2)反向解析。反向解析是从IP地址到域名的解析过程。反向解析的作用为服务器的身份验证。
1.基础题
安装并启动DNS服务。
(1)前期检查
VMnet8、NAT模式、/if-ens33内为dhcp动态地址
(2)安装bind软件
yum install bind -y
(3)启动服务named
systemctl start named
配置DNS正向和反向解析,需要验证。
(4)首先修改主配置文件 /etc/named.conf 怕出问题记得备份
将监听端口和访问方式都改成any
listen-on port 53{any;};
allow-query{any;};
dnssec-enable:yes 改成no 、dnssec-validation:yes改为no
dnssec-enable:no;
dnssec-validation:no;
检查配置文件语法
named-checkconf /etc/named.conf
(6)修改主区域文件 /etc/named.rfc1912.zones 怕出问题记得备份
cd /etc
ls named*
vi /etc/named.rfc1912.zones
配置正向解析
快捷方式:通过:set nu设置行号 然后通过:12,18 co 41拷贝一份后修改即可
abc.com.zone
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jGDku1ys-1643163313851)(image-20220104101941567.png)]
配置反向解析
快捷方式:通过:set nu设置行号 然后通过:36,41 co 48拷贝一份后修改即可
71.168.192.in-addr.arpa
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BrFBXEXa-1643163313852)(image-20220104102023223.png)]
检测配置文件语法
named-checkconf /etc/named.rfc1912.zones
编辑区域配置文件 /var/named/named.localhost
cp -a 拷贝一份named.localhost 为abc.com.zone
编辑正向配置文件abc.com.zone
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGOqIjMM-1643163313853)(image-20220104103528270.png)]
正向区域解析测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5z47tWU-1643163313854)(clip_image002-1641263749968.jpg)]
反向文件编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q53a8NV4-1643163313854)(image-20220104103642774.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ui59CTEC-1643163313855)(image-20220104103646027.png)]
反向区域解析测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3feX89zY-1643163313856)(clip_image002-1641263811466.jpg)]
防火墙开放对应服务 然后重启服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJ1siRUW-1643163313856)(clip_image002-1641263827836.jpg)]
更改物理机DNS地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNLlftzU-1643163313857)(clip_image002-1641263836067.jpg)]
正向解析和反向解析结果测试
正向测试结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTUsREqu-1643163313859)(clip_image002-1641263852155.jpg)]
反向测试结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRtlBcdd-1643163313859)(clip_image004.jpg)]
2.拓展题
(1)设置rndc控制的端口以及端口,keys用来设置控制的密钥
controls主要用于对bind进行控制,如:
key “rndc-key” {
algorithm hmac-md5;
secret “VkMaNHXfOiPQqcMVYJRyjQ==”;
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { “rndc-key”; };
};
三、Apache
Apache Web服务器软件
apache两个主要作用:
1.解析网页语言,如html,php,jsp等
2.接收web用户的请求,并给予一定的响应
1.基础题
(1)安装并启动Apache服务。
yum install httpd -y
systemctl start httpdfirewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
(2)在物理机的浏览器上访问主目录下以自己姓名命名的目录,要求以清单方式列出文件,需要验证。
cd /var/www/html
mkdir lyl
touch a b c输入地址 IP/lyl
(3)基于IP地址的虚拟主机搭建,需要验证
static
IPADDR=192.168.71.135
IPADDR1=192.168.71.136
IPADDR2=192.168.71.137
GATEWAY=192.168.71.1
NETMASK=255.255.255.0
systemctl restart network
ip addrcmd
ping 192.168.71.135 136 137
(4)建立基于IP方式的虚拟主机存放站点的根目录,并创建首页index.html文件
在/var/www下创建文件(类比html)
mkdir h1 h2
随便写入点东西到index.html
[root@localhost www]# echo "192.168.71.136" > h1/index.html
[root@localhost www]# echo "192.168.71.137" > h2/index.html
接下来编辑每个ip的不同配置文件
[root@localhost www]# cd /etc/httpd/
[root@localhost httpd]# ls
conf conf.d conf.modules.d logs modules run
[root@localhost httpd]# cd conf
[root@localhost conf]# ls
进入conf下的httpd.conf中拷贝
#
# DocumentRoot: The directory out of which you will serve your
#
DocumentRoot "/var/www/html"
# Relax access to content within /var/www.
#
<Directory "/var/www">AllowOverride None# Allow open access:Require all granted
# Further relax access to the default document root:
<Directory "/var/www/html">## Possible values for the Options directive are "None", "All",# or any combination of:## doesn't give it to you.## http://httpd.apache.org/docs/2.4/mod/core.html#options# for more information.#Options Indexes FollowSymLinks## AllowOverride controls what directives may be placed in .htaccess files.# It can be "All", "None", or any combination of the keywords:# Options FileInfo AuthConfig Limit#AllowOverride None## Controls who can get stuff from this server.#Require all granted
</Directory>#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
创建文件夹vhost(类比conf)在httpd中
cd vhost
vi h1.conf
<VirtualHost 192.168.71.136>DocumentRoot "/var/www/h1"DirectoryIndex index.html<Directory "/var/www/h1">Options Indexes FollowSymLinksAllowOverride NoneRequire all granted</Directory>
</VirtualHost>
cp -a h1.conf h2.conf
然后修改h2.conf
编辑完后在主配置文件结尾加上图中最后一行信息
IncludeOptional vhost/*.conf然后重启服务
systemctl restart network
(4)基于端口号的虚拟主机搭建,需要验证
[root@localhost www]# mkdir p8081
[root@localhost www]# echo "8081port" > p8081/index.html
[root@localhost www]# ls
<VirtualHost 192.168.71.135:8081>DocumentRoot "/var/www/p8081"DirectoryIndex index.html<Directory "/var/www/p8081">Options Indexes FollowSymLinksAllowOverride NoneRequire all granted</Directory>
</VirtualHost>
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload[root@localhost vhost]# setenforce 0
[root@localhost vhost]# getenforce
Permissive[root@localhost conf]# vi httpd.conf
Listen 8081
[root@localhost conf]# systemctl restart httpd
(5)个人Web站点的发布,需要验证。
cd /etc/httpd/conf.d
编辑用户配置文件 userdir.conf
加root
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jnumWq4g-1643163313860)(image-20220104192006346.png)]
去#号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iO5NEoak-1643163313860)(image-20220104191814840.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NukuJ68M-1643163313861)(image-20220104191759999.png)]
[root@localhost conf.d]# su - lyl
上一次登录:二 1月 4 19:20:59 CST 2022pts/0 上
[lyl@localhost ~]$ ls
public_html
[lyl@localhost ~]$ cd public_html
[lyl@localhost public_html]$ cd ..
[lyl@localhost ~]$ chmod -Rf 711 lyl
[lyl@localhost ~]$ cd ~/public_html/
[lyl@localhost public_html]$ echo "lyl web site" > index.html
[lyl@localhost public_html]$
网页测试IP/~lyl/
2.拓展题
# 在出现错误页的时候是否显示服务器操作系统的名称,ServerTokens Prod为不显示
ServerTokens OS
# 服务器与客户端断开的时间
Timeout 60
# 是否持续连接(因为每次连接都得三次握手,如果是访问量不大,建议打开此项,如果网站访问量比较大关闭此项比较好),修改为:KeepAlive On 表示允许程序性联机
KeepAlive Off
# 设置特殊的参数,以保证对老版本浏览器的兼容,并支持新浏览器的特性
BrowserMatch “Mozilla/2” nokeepalive
BrowserMatch “MSIE 4.0b2;” nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch “RealPlayer 4.0” force-response-1.0
BrowserMatch “Java/1.0” force-response-1.0
BrowserMatch “JDK/1.0” force-response-1.0
# 当服务器出现404错误的时候,返回missing.html页面
ErrorDocument 404 /missing.html
开启长连接
KeepAlive onKeepAliveTimeout 60 #超时时间
MaxKeepAliveRequests 100 #超时时间内达到100个请求也将断开连接
配置http强制跳转https
在主配置文件中添加如下字段
RewriteEngine OnRewriteCond %{HTTPS} !=onRewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
反向代理
在主配置文件中或者虚拟主机中添加如下字段
ProxyRequests off
## Order deny,allow# Allow from all#
ProxyPass / http://172.16.138.129
ProxyPassReverse / http://172.16.138.129
配置basic访问验证
<Directory “/var/www/html”>
Options Indexes FollowSymLinks #允许索引,和链接文件
AllowOverride None
authtype basic #认证类型
authname “test” #浏览器弹框提示信息
authuserfile /etc/httpd/.htpass #认证用户文件
#authgroupfile /etc/httpd/allow.group #认证组文件
#require group test
require valid-user #所有userfile文件的用户都可以访问
#require user user1 user2 #user1 user2 可以访问
四、Linux下编程
C
yum install -y gcc
vi test.c
gcc -o 1.out test.c
./1.out
C++
yum install -y gcc-c++
vi test.cpp
g++ -o 1.out test.cpp
./1.out
Java
1.基础题
yum search jdk
找到java-1.8.0-openjdk-devel.x86_64yum install java-1.8.0-openjdk-devel.x86_64 -y
可以进/usr/lib/jvm查看是否安装了
在/etc/profile中做环境变量配置
vi world.java
public class world{public static void main(String[] args){System.out.println("Hello world");}
}
-----------------------
javac world.java
java world
2.拓展题
(1)编写程序模拟两个村庄共用同一口井水。编写一个Village类,该类有一个静态的int型成员变量waterAmout,用于模拟井水的水量。在主类Land的main()方法中创建两个村庄,一个村庄改变了waterAmount的值,另一个村庄查看waterAmount的值。
public class test1{public static void main(String[] args){Village v1=new Village();Village v2=new Village();v1.drinkWater(120);System.out.println("查看剩余水量:"+v2.seeWater());}
}class Village{static int waterAmount=600;public void drinkWater(double drink){if(waterAmount>=drink)waterAmount-=drink;}public double seeWater(){return waterAmount;}
}
(2)简历的内容如下:“姓名:张三 出生时间:1989.10.16。个人网站:http://www.zhang.com。身高:185cm,体重:72kg”
编写一个java应用程序,判断简历中的姓名是否姓“张”,单独输出简历中的出生日期和个人网站,并判断简历中的身高是否大于180cm,体重是否小于75kg。
package qimo;public class test2 {public static void main(String[] args) {String mess="姓名:张三 出生时间:1989.10.16。个人网站:http://www.zhang.com。身高:185cm,体重:72kg";String []S=mess.split(":");//System.out.println(S);//for(String s:S) {System.out.println(s);}String date=S[2].split("。")[0];//日期Double h=Double.parseDouble(S[4].split("c")[0]);//身高Double w=Double.parseDouble(S[5].split("k")[0]);//体重String web=S[3].split("。")[0];//网址String name=S[1].split(" ")[0];//姓名//System.out.println(h);//System.out.println(w);//System.out.println(date);//System.out.println(web);//System.out.println(name.substring(0,1));if("张".equals(name.substring(0,1))) {//System.out.println(name.substring(0,1));System.out.println("他姓张");}else {System.out.println("他不姓张");}if(h>=180) {System.out.println("他身高大于180cm");}else {System.out.println("他身高小于180cm");}if(w<=75) {System.out.println("他体重小于75kg");}else {System.out.println("他体重大于75kg");}}}
3.卡车需要计算出整批货物的重量。要求有一个ComputerWeight接口,该接口中有一个方法:
public double computeWeight()
有三个实现该接口的类:Television、Computer和WashMachine. 这三个类通过实现接口给出自重。
有一个卡车Truck类,该类用ComputeWeight接口类型的数组作为成员(Truck类面向接口),那么该数组的元素就可以存放Television对象的引用、Computer对象的引用或WashMachine
对象的引用。程序能输出Truck对象所装载的货物的总重量。
import java.util.ArrayList ;
import java.util.Arrays ;
public class Test3{public static void main(String args[]){ComputerWeight tv = new TV(100) ;ComputerWeight cp = new CP(80) ;ComputerWeight wm = new WM(160) ;Truck tk = new Truck() ;tk.add(tv); tk.add(cp); tk.add(wm) ;System.out.println("重量为:"+tk.calc_total()) ;}
}
class Truck{public ArrayList<ComputerWeight> gools=new ArrayList<>() ;public void add(ComputerWeight gool){gools.add(gool);}public double calc_total(){double ans=0 ;for(ComputerWeight gool:gools){ans+=gool.computeWeight();};return ans ;}
}
interface ComputerWeight{public double computeWeight();
}
class TV implements ComputerWeight{public double w ;public TV(double w){this.w=w;} ;public double computeWeight(){return w ;}
}
class CP implements ComputerWeight{public double w ;public CP(double w){this.w=w;} ;public double computeWeight(){return w ;}
}
class WM implements ComputerWeight{public double w ;public WM(double w){this.w=w;} ;public double computeWeight(){return w ;}
}
实验要求:车站检查危险品的设备,如果发现危险品会发出警告。编程模拟设备发现危险品。
编写一个Exception的子类DangerException,该子类可以创建异常对象,该异常对象调用toShow()方法输出:“危险品”。
编写一个Machine类,该类的方法checkBag(Goods goods)当发现参数goods是危险品时(goods的isDanger属性是true)将抛出DangerException异常对象。
程序在主类的main方法中的try-catch语句的try部分让Machine类的实例调用checkBag(Goods goods)方法,如果发现危险品就在try-catch语句的catch部分处理危险品。
public class Test4{public static void main(String args[]){Goods[] goods = new Goods[10] ;for(int i=0;i<10;i++){goods[i] = new Goods() ;if(i%3==0){goods[i].setIsDanger(true) ;}}for(int i=0;i<10;i++){try{Machine.checkBag(goods[i]) ;System.out.println("这不是危险品!") ;} catch(DangerException e){System.out.println(e.toShow()) ;}}}
}
class DangerException extends Exception{public String toShow(){return "危险品";}
}
class Machine{public static boolean checkBag(Goods goods) throws DangerException{if(goods.isDanger){throw new DangerException();}return true;}
}
class Goods{public boolean isDanger ;public void setIsDanger(boolean isDanger){this.isDanger=isDanger ;}
}
实验要求:使用Scanner类和正则表达式统计一篇英文中的单词,要求如下:
一共出现了多少个单词。
有多少个互不相同的单词。
按单词出现频率大小输出单词。
//利用regex_search()统计一篇英文文章中的单词数:C++
#include <iostream>
#include <regex>
#include <string>
#include <fstream>
using namespace std;
// 统计单词数
int countword(string& str)
{ try{int n = 0;smatch m; // 保存匹配结果的match_result// 匹配单词的正则表达式,// 包含了大小写英文字母,连字符,括号,引号// 这个正则表达式还不完善,可以继续改进regex ex("\\b[a-zA-Z-()\"]*\\b");// 用regex_search()在文章中进行匹配,查找单词while(regex_search(str,m,ex)){++n; // 找到,总数加1cout<<m[0]<<endl; // 输出找到的单词str = m.suffix().str(); // 移动到下一个位置}return n;}catch (regex_error e){cout<<e.what()<<endl;}
}
// 读取文件内容
bool readfile(const string name,string& str)
{ifstream in(name);if(in.is_open()){char line[512] = "";while(true){in.getline(line,512);str += line;if(in.good()){str += '\n';}else{break;}}return true;}else{return false;}
}
int main(int argc,char* argv[])
{if(2 != argc){cout<<"argument error. eg. count.exe demo.txt"<<endl;}string str("");if(readfile(argv[1],str)){int n = countword(str);cout<<"there are "<<n<<" words in "<<argv[1]<<endl;}return 0;
}
import java.util.regex.*;
import java.util.Scanner;
import java.util.HashMap;
public class Test5 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("nextLine:");HashMap<String, Integer> mp = new HashMap<String, Integer>();int cnt = 0;if (scan.hasNextLine()) {String []str = (scan.nextLine()).split(" ");for(String s:str){if(Pattern.matches("^[A-Za-z]+$", s)){cnt ++;mp.putIfAbsent(s, 0) ;mp.put(s, mp.get(s)+1) ;}}}System.out.printf("共出现%d个单词\n",cnt);System.out.printf("共有%d个不同的单词\n",mp.size());String[] word = new String[mp.size()+1];Integer[] count = new Integer[mp.size()+1];int sum = mp.size();for(int i = 0 ; i < sum ; i ++){boolean flag = true;for (String key: mp.keySet()){if(flag){word[i] = key;count[i] = mp.get(key);flag = false;}if(count[i] < mp.get(key)){word[i] = key;count[i] = mp.get(key);}}mp.remove(word[i]);}for(int i = 0 ; i < sum ; i ++){System.out.printf("%s出现了%d次\n",word[i],count[i]);}scan.close();}
}
实验要求:用两个线程玩猜数字游戏,第一个线程负责随机给出1到100之间的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”、“猜大了”或“猜对了”。猜数之前,要求第二个线程要等待第一个线程设置好要猜测的数。第一个线程设置好猜测数之后,两个线程还要互相等待,其原则是,第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待给第二个线程给出猜测,如此进行,直到第二个线程给出正确的猜测后,两个线程进入死亡状态。
package text;
import java.util.*;
import java.util.Random; public class Test6 { public static void main(String[] args) { number num=new number("线程一"); num.start(); guess gue=new guess("线程二"); gue.start(); } }
//给出整数的线程
class number extends Thread{ String name1; private static int n; number(String name){ name1=name; } public void run() { //获取1~100的随机数 Random random=new Random(); n=random.nextInt(100); System.out.println(name1+"给出的数字为:"+n); } //猜数字(静态方法,可通过类名调用) public static String guessnum(int m) { if(m<n) { return "猜小了"; }else if(m>n){ return "猜大了"; }else return "猜对了"; }
}
//猜数线程
class guess extends Thread{ String name2; //最大值和最小值 private int min=0,max=100,nownum; //比较结果 String Result; guess(String name){ name2=name; } //获取比较结果 public String getGuess() { return Result; } public void run() { while(true) { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } Random ran=new Random(); //当前猜的数字(最大值和最小值之间的数) nownum=min+ran.nextInt(max-min); //调用给出整数的线程 的猜数字方法guessnum, Result=number.guessnum(nownum); if(Result.equals("猜小了")) { min=nownum; System.out.println("线程二猜的数字是:"+nownum+"---猜小了"); }else if(Result.equals("猜大了")) { max=nownum; System.out.println("线程二猜的数字是:"+nownum+"---猜大了"); }else { System.out.println("线程二猜的数字是:"+nownum+"---猜对了,结果是"+nownum); System.exit(0); } } }
}
import java.util.*;
public class Test6{public static void main(String []args) throws Exception{Game game = new Game() ;game.flag=1 ;Thread judge = new Judge(game) ;Thread guess = new Guess(game) ;judge.start() ;Thread.sleep(10) ;guess.start() ;}
}
class Game{public int flag, guess ;
}
class Judge extends Thread{Game game ;public Judge(Game game){this.game=game;}public void run(){Random random=new Random() ;int num=random.nextInt(100) ;while(game.flag!=0){synchronized(game){try{game.wait() ;if(game.guess>num){game.flag=1;}else if(game.guess<num){game.flag=-1;}else {game.flag=0;}game.notify() ;}catch(Exception e){}}}}
}
class Guess extends Thread{Game game ;public Guess(Game game){this.game=game;}public void run(){Random random=new Random() ;while(game.flag!=0){synchronized(game){try{game.guess=random.nextInt(100) ;game.notify() ;game.wait() ;System.out.print(game.guess+"\t");if(game.flag==1){System.out.println("猜大了");}else if(game.flag==-1){System.out.println("猜小了");}else {System.out.println("猜对了");}}catch(Exception e){}}}}
}
五、FTP
FTP文件传输协议
FTP(File Transfer Protocol)
1.基础题(√3)
(1)安装并启动vsftpd服务。
yum install vsftpd -ysystemctl start vsftpd
安装完后往ftp服务器文件夹里写点东西 开端口 防火墙
cd /var/ftp/pub
touch a b c
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --reload
(2)实现匿名用户访问FTP服务器,需要验证。
关windows防火墙
cmd
ftp 服务器IP
用户名: anonymous
密码:空
cd pub
ls
(3)实现本地用户访问FTP服务器,需要验证。
useradd lyl
passwd lyl
cmd
ftp 服务器
用户名: lyl
密码:xxx
(4)实现匿名用户传文件到FTP服务器,需要验证.
cd /etc/vsftpd
vi vsftpd.conf
anonymous_upload_enable=YES 去# 允许匿名用户上传
anon_mkdir_write_enable=YES 去# 允许匿名创建新用户anon_world_readable_only=NO 开放匿名用户的浏览权限
write_enable=YES 开放匿名用户的写权限
systemctl restart vsftpd
chmod 777 /var/ftp/pub -Rf
(5)限制指定本地用户访问FTP服务器,需要验证。
/etc/vsftpd/vsftpd.conf
userlist_enable=YESuserlist_deny=YES
userlist_file=/etc/vsftpd/user_list
在user_list中添加lyl
(6)设置用户连接FTP服务器后的欢迎语,需要验证。
ftpd_banner=Welcome to blah FTP service. 去#
2.拓展题
六、Mariadb
1.基础题
(1)安装并启动Mariadb服务。
yum install mariadb mariadb-server -y
systemctl start mariadb
mysql_secure_installation
(2)分别对数据库、表进行创建,并对数据记录进行CRUD操作。
show databases;
create database luyilin;
drop database luyilin
use luyilin;
//创建表
create table user(id int primary key,username varchar(20) not null,passwd varchar(20),email varchar(20)
);
insert into user values('1','lyl','12345','@qq.com');
update user set passwd='2345678' where id =1;select * from user;
delete from user where id=1;
(3) 创建一个以自己姓名全拼命名的账户,授予指定数据库查询、修改权限,需要验证。
create user 'lyl'@'%' identified by 'lyl123' ;
grant select,update on luyilin.user to 'lyl'@'%' with grant option;
mysql -u lyl -p
update user set passwd='d32323' where id=1;
(4)允许root用户远程访问权限,需要验证。
grant all on *.* to 'root'@'%' with grant option;
update mysql.user set host='%' where user ='root';mysql -h 192.168.71.143 -u root -p
密码直接回车 因为远程登录的密码没有设置
#firewall-cmd --permanent --add-port=3306/tcp
#firewall-cmd --reload
#systemctl restart mariadb
(5)删除指定数据库,然后进行恢复,需要验证。
(1)备份
mysqldump -u root -plyl123456 luyilin>/home/luyilin.sql
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kdEzRykV-1643163313861)(clip_image002-1641363694096.jpg)]
(2)删除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3DWPrfZ-1643163313862)(clip_image004-1641363694097.jpg)]
(3)恢复
mysql -u root -plyl123456 stu < /home/luyilin.sql(需要有stu这个数据库)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lg8qSRSK-1643163313863)(clip_image006.jpg)]
2.拓展题
(1)多条件查询
id、age 多个条件查询
select * from t1 where id=1 and age = 'zxg '
mysql配置文件
#允许最大接收数据包的大小,防止服务器发送过大的数据包,可以设置为16MB或者更大,但设置太大也可能有危险
max_allowed_packet = 1M
#该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。
max_connect_errors = 100
#如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。
open_files_limit = 65535
#mysql打开最大文件数
grant select, insert, update, delete on testdb.* to common_user@’%’
grant 创建、修改、删除 MySQL 数据表结构权限。
grant create on testdb.* to developer@‘192.168.0.%’;
grant alter on testdb.* to developer@‘192.168.0.%’;
grant drop on testdb.* to developer@‘192.168.0.%’;
grant 普通 DBA 管理某个 MySQL 数据库的权限。
grant all privileges on testdb to dba@'localhost'
grant 高级 DBA 管理 MySQL 中所有数据库的权限。
grant all on *.* to dba@'localhost
grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
grant select(user_id,username) on smp.users to mo_user@’%’ identified by ‘123345’;
grant select on smp.mo_sms to mo_user@’%’ identified by ‘123345’;
七、Samba
SMB(Server Message Block)是一个高层协议,用于共享文件、共享打印机、共享串口等。
Samba让Linux和Windows操作系统之间实现文件共享
Linux和Windows文件共享
1.基础题
(1)安装并启动SMB服务。
yum install samba -y
systemctl start smb
(2)允许指定IP地址并指定用户的主机访问共享目录,需要验证。
/etc/samba/smb.conf
[pub]comment = Pub Directoriesvalid users = lyl,rootbrowseable = Yesread only = Nopath=/sharedatacreate mask = 0666directory mask = 0775hosts allow=192.168.71.1
[root@localhost samba]# useradd lyl
[root@localhost samba]# passwd lyl
更改用户 lyl 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost samba]#
[root@localhost samba]# firewall-cmd --permanent --add-service=samba
success
[root@localhost samba]# firewall-cmd --reload
success
[root@localhost samba]# smbpasswd -a lyl
New SMB password:
Retype new SMB password:
Added user lyl.
[root@localhost samba]#
(3)通过Windows系统访问Linux系统的共享目录共享,需要验证。
setenforce 0mkdir /share
windows:
\\192.168.71.136
(4)通过Linux系统访问Windows系统的共享目录共享,需要验证。
linux端安装 samba-client
windows端创建个文件分配权限给用户
然后linux端
[root@localhost sharefile]# smbclient //192.168.71.1/wc -U LYL
2.拓展题
global
security = user #用于登陆域,或用户验证登陆
hosts allow = 192.168.0. #指定那些主机可以访问
encrypt passwords = yes #密码需要加密
browse list = yes #samba将在服务器上生成浏览列表
remote browse sync = 192.168.222.22 # samba 将会同步在其他子网(local master)的列表,但子网的(LOCAL MASTER)必须是SAMBA服务器
public
force security mode = 0 # 当修改文件的属性,指定哪些模式必须设置
oplocks = no #本地缓存,如果设置成yes,会提高samba的速度
homes
read list = badguy # 限制这些用户在可写文件上的些操作权限
invalid users = root #不可登陆用户
-y
systemctl start smb
(2)允许指定IP地址并指定用户的主机访问共享目录,需要验证。
/etc/samba/smb.conf
[pub]comment = Pub Directoriesvalid users = lyl,rootbrowseable = Yesread only = Nopath=/sharedatacreate mask = 0666directory mask = 0775hosts allow=192.168.71.1
[root@localhost samba]# useradd lyl
[root@localhost samba]# passwd lyl
更改用户 lyl 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost samba]#
[root@localhost samba]# firewall-cmd --permanent --add-service=samba
success
[root@localhost samba]# firewall-cmd --reload
success
[root@localhost samba]# smbpasswd -a lyl
New SMB password:
Retype new SMB password:
Added user lyl.
[root@localhost samba]#
(3)通过Windows系统访问Linux系统的共享目录共享,需要验证。
setenforce 0mkdir /share
windows:
\\192.168.71.136
(4)通过Linux系统访问Windows系统的共享目录共享,需要验证。
linux端安装 samba-client
windows端创建个文件分配权限给用户
然后linux端
[root@localhost sharefile]# smbclient //192.168.71.1/wc -U LYL
2.拓展题
global
security = user #用于登陆域,或用户验证登陆
hosts allow = 192.168.0. #指定那些主机可以访问
encrypt passwords = yes #密码需要加密
browse list = yes #samba将在服务器上生成浏览列表
remote browse sync = 192.168.222.22 # samba 将会同步在其他子网(local master)的列表,但子网的(LOCAL MASTER)必须是SAMBA服务器
public
force security mode = 0 # 当修改文件的属性,指定哪些模式必须设置
oplocks = no #本地缓存,如果设置成yes,会提高samba的速度
homes
read list = badguy # 限制这些用户在可写文件上的些操作权限
invalid users = root #不可登陆用户
[外链图片转存中…(img-fJ2uqVZa-1643163313863)]