Linux服务器期末复习总结

一、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=nfs

firewall-cmd --reload

firewall-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/share

ls /mnt/share

(8)查看和卸载已挂载的目录(课本多的)

mount | grep nfs
umount /mnt/share

2.拓展题

(1)指定NFS客户端地址的配置详细说明

客户端地址具体地址说明
授权单一客户端访问NFS192.168.56.101一般情况下,生产环境中此配置不多
授权整个网段可访问NFS192.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-ens33

BEFROUTE=dhcp->static
添加👇
IPADDR=192.168.71.108
GATEWAY=192.168.71.108
NETMASK=255.255.255.0

保存腿出后重启
systemctl restart network

ip 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 httpd

firewall-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 addr

cmd
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 FollowSymLinks
                AllowOverride None
                Require 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 FollowSymLinks
                AllowOverride None
                Require 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_64

yum 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;  // 找到,总数加1
                cout<<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 -y

systemctl 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=YES

userlist_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 Directories
        valid users = lyl,root
        browseable = Yes
        read only = No
        path=/sharedata
        create mask = 0666
        directory mask = 0775
        hosts 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 0

mkdir /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 Directories
        valid users = lyl,root
        browseable = Yes
        read only = No
        path=/sharedata
        create mask = 0666
        directory mask = 0775
        hosts 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 0

mkdir /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)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值