第2章 第2周课前测试考试题


2.1 过滤一级目录

第1题如何过滤出已知当前目录下oldboy中的所有一级目录

(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录)?

[root@lb01 ~]# mkdir /oldboy/{a..b}/{c..g}/{e..f} -p

方法一

[root@lb01 ~]# tree -L 1 -dfi /oldboy/
/oldboy
/oldboy/a
/oldboy/

tree命令参数

-d     List directories only
-f     Prints the full path prefix for each file
-i     Makes tree not print the indentation lines
-L     Max display depth of the directory tree

方法二

[root@lb01 ~]# find /oldboy/ -maxdepth 1 -type d
/oldboy/
/oldboy/b
/oldboy/a

方法三

[root@lb01 ~]# ls -l /oldboy/|grep ^d|awk '{print $9}'
[root@lb01 ~]# ls -l /oldboy/|sed -n '/^d/p'|awk '{print $9}'
[root@lb01 ~]# ls -l /oldboy/|awk '/^d/'|awk '{print $9}'
a
b

方法四

[root@lb01 ~]# ls -F /oldboy/|grep /
[root@lb01 ~]# ls -p /oldboy/|grep /
a/
b/

ls的参数

-F, --classify  append indicator (one of */=>@|) to entries
-p, --indicator-style=slash  append / indicator to directories

2.2 切换到上一次目录

第2题/oldboy 和 /tmp目录这间来回切换

[root@lb01 oldboy]# pwd#当前路径
/oldboy
[root@lb01 oldboy]# cd /tmp/#切换到/tmp
[root@lb01 tmp]# cd -#切换回上一次的目录
/oldboy
[root@lb01 oldboy]# pwd#检查
/oldboy
[root@lb01 oldboy]# echo $OLDPWD#能够来回切换,是由这个变量控制的
/tmp

2.3 查看最近的文件

第3题一个目录中有很多文件(ls -l 查看时好多屏),想用一条命令最快速度查看到最近更新的文件。如何看?

[root@lb01 oldboy]# ls -lrt
总用量 20
-rw-r--r-- 1 root root   16 8月  25 22:24 c.sh
-rw-r--r-- 1 root root   16 8月  25 22:24 b.sh
-rw-r--r-- 1 root root   16 8月  25 22:24 a.sh
drwxr-xr-x 7 root root 4096 8月  26 09:12 a
drwxr-xr-x 7 root root 4096 8月  26 09:12 b
-rw-r--r-- 1 root root    0 8月  26 09:35 chen.txt
-rw-r--r-- 1 root root    0 8月  26 09:36 oldboy.txt

总结:

当ls -l列出目录条目时,默认是按文件名来排序的,如果想看到最新更新的文件,则应该加-t参数,它代表按修改时间排序,但是如果只加-t参数,列表的排序默认是最近更新的条目在最上方,但题目中很文件特别多,放在屏幕最上方就需要再滑滚轮来看了,所以应该再加-r参数,代表逆序排序,就是跟默认的排序相反。

2.4 软链接

第4题/application/apache2.2.17 -> /application/apache

在配置apache时 执行了./configure --prefix=/application/apache2.2.17 来编译apche,在make install 完成后,希望用户访问 apache 路径更简单,需要给/application/apache2.2.17 目录做一个软链接/application/apache,使得内部开发或管理人员通过/application/apache 就可以访问到 apache 的安装目录/application/apache2.2.17 下的内容,请你给出实现的命令。(提示:apache 为一个 web 服务)

[root@lb01 ~]# mkdir -p /application/apache2.2.17     
[root@lb01 ~]# ln -s /application/apache2.2.17/ /application/apache
[root@lb01 ~]# ls -lid /application/apache2.2.17/ /application/apache
142163 lrwxrwxrwx 1 root root   26 8月  26 09:43 /application/apache -> /application/apache2.2.17/
142162 drwxr-xr-x 2 root root 4096 8月  26 09:41 /application/apache2.2.17/

总结:

1.目录只能做软链接,不能做硬链接

2.符号连接目录的inode不同,而硬连接文件原文件或目录的inode是相同的

3.软链接相当于文件或目录的快捷方式

4.删除符号连接,对原文件或目录无影响

5.删除原文件或目录,会导致符号连接失效

2.5 删7天前的文件

第5题考查find命令

已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张,现在要求只能保留最近 7 天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令。(提示:可以从 apache 服务配置上着手,也可以从生成出来的日志上着手。)

解答:

查找出7天以前的日志文件,将它们给删了,可以把这条命令放到定时任务的配置文件里,这样就可以实现自动删除了。

准备素材

mkdir /app/logs -p
cd /app/logs/
touch {1..10}.log

把系统时间往后调,这样现在创建的文件可以是7天前的

[root@lb01 logs]# date
2016年 09月 09日 星期五 00:00:01 CST

方法一

[root@lb01 logs]# find ./ -type f -name "*.log" -mtime +7|xargs rm
# 找文件类型,名字是以.log结尾的,而且是7天以前就创建了的,找到后就删掉。把找到的结果塞进管道,接着用xargs命令处理成一行内容,再全部给rm命令处理掉。

方法二

[root@lb01 logs]# rm -f `find ./ -type f -name "*.log" -mtime +7` # 注意尖角号

方法三

[root@lb01 logs]# find ./ -type f -name "*.log" -mtime +7 -exec rm {} \;

2.6 实时查看文件的动态改变

第6题调试系统服务时,希望能实时查看/var/log/messages 系统日志的更新,如何做?

解答:

[root@lb01 ~]# tail -f /var/log/messages# 实时查看这个文件尾部的变化
[root@lb01 ~]# tailf /var/log/messages# 独立存在的命令,生产环境不建议使用

验证:

可以克隆一个会话,输入命令/etc/init.d/network restart,可以观察到文件/var/log/messages是有变化的

总结:

-f  参数的意思是当文件增长时,会实时输出被增加的数据
-F  参数和-f不一样的是,它会不断的重次

2.7 显示行号

第7题打印轻量级 web 服务的配置文件 nginx.conf 内容的行号及内容,该如何做?

1、cat -n 显示行号

[root@lb01 ~]# cat -n nginx.conf 
     1  chen001
     2  chen002
     3  chen003
     4  chen004
     5  chen005

2、nl  专业显示行号的命令

[root@lb01 ~]# nl nginx.conf 
     1  chen001
     2  chen002
     3  chen003
     4  chen004
     5  chen005

3、grep  点代表所有的内容,先把所有的内容过滤出来,接着在前面分别加上行号

[root@lb01 ~]# grep -n . nginx.conf 
1:chen001
2:chen002
3:chen003
4:chen004
5:chen005

4、awk  NR代表行号,逗号代表默认的分隔符是空格,$0代表所有域,即整行内容

[root@lb01 ~]# awk '{print NR,$0}' nginx.conf 
1 chen001
2 chen002
3 chen003
4 chen004
5 chen005

5、vim显示行号

[root@lb01 ~]# vim nginx.conf  # 显示行号 :set nu   去掉行号  :set nonu
  1 chen001
  2 chen002
  3 chen003
  4 chen004
  5 chen005

总结:

专业显示行号的命令是nl,正则表达示中的特殊符号,点代表任意字符,^代表以…开头,$符号代表以…结尾,\代表转义字符,awk的打印功能不要忘记加单引号括起来。

2.8 开机自启动服务

第8题装完 Centos 系统后,希望网络文件共享服务 NFS,仅在 3 级别上开机自启动,该如何做?

[root@lb01 ~]# chkconfig --level 3 nfs on
[root@lb01 ~]# chkconfig --list nfs
nfs             0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:关闭  6:关闭

2.9 系统运行级别

第9题linux 系统运行级别一般为 0-6,请分别写出每个级别的含义。

Linux系统运行级别的配置文件是:/etc/inittab

0 - halt (Do NOT set initdefault to this)# 关机,别设置默认级别为0
1 - Single user mode # 单用户模式
2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 没有网络文件系统的多用户模式,其它和3都一样
3 - Full multiuser mode# 完整的多用户模式
4 - unused# 未使用
5 - X11# 桌面
6 - reboot (Do NOT set initdefault to this)# 重启,如果设置为默认,则开机后就重启,不断循环
id:3:initdefault: # 默认的级别是3级别,修改默认级别,就在这个地方改

2.10 中文乱码

第10题linux 系统中查看中文乱码,请问如何解决乱码问题?

方法一:当前生效

[root@lb01 ~]# echo $LANG# 先看当前的环境变量LANG
en_US.UTF-8
[root@lb01 ~]# export LANG='zh_CN.UTF-8'# 修改字符集的环境变量为中国中文
[root@lb01 ~]# echo $LANG               
zh_CN.UTF-8

方法二:永久生效,写到配置文件里

[root@lb01 ~]# cat /etc/sysconfig/i18n # 先看字符集配置文件
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
[root@lb01 ~]# echo 'LANG="zh_CN.UTF-8"' >/etc/sysconfig/i18n
# 修改字符集,将美国英语改成中国中文
[root@lb01 ~]# source /etc/sysconfig/i18n # 使字符集配置文件生效

方法三:永久生效,放到系统全局环境变量配置文件里

[root@lb01 ~]# echo "export LANG='zh_CN.UTF-8'" >>/etc/profile
[root@lb01 ~# . /etc/profile # 使配置文件立马生效

验证:

[root@lb01 ~]# echo $LANG# 把变量LANG打印出来

zh_CN.UTF-8

总结:

中文乱码是因为字符集不一致而导致的,所以需要把默认的字符集变量改为中文的UTF-8类型就可以了,还要记得source这个文件下,将配置文件生效。

2.11 优化系统

第11题如何优化 linux 系统(可以不说太具体)?

1.关防火墙

2.关selinux

3.设置开机默认的运行级别为3

4.精简开机自启动服务,只保留5个:network、network、crond、rsyslog、sysstat

5.做定时任务,同步时间

6.中文字符集

7.增大文件描述符

8.注释多余的系统虚拟帐号

9.隐藏linux版本信息的显示

10.bash安全,例如,空闲超时时间,命令历史记录的数量

11.定时清理邮件服务临时目录垃圾文件

12.优化内核参数

13.锁定关键系统文件,防止提权篡改

14.优化sshd服务,例如:不允许空密码、不允许root用户远程连接,修改远程连接的端口等

15.sudo授权普通用户能远程管理服务器

16.给grub菜单加密码,防止进入单用户模式,破解root密码

17.禁止ping

18.升级不漏洞的软件

2.12 打包和压缩

第12题/etc/目录为 linux 系统的默认的配置文件及服务启动命令的目录 

1.请用 tar 打包/etc 整个目录(打包及压缩) 

2.请用 tar 打包/etc 整个目录(打包及压缩,但需要排除/etc/services 文件) 

3.请把 a 点命令的压缩包,解压到/tmp 指定目录下(最好只用 tar 命令实现)

解答:

第一小题

[root@lb01 ~]# cd /# 先切换到上级目录
[root@lb01 /]# tar zcvf etc.tar.gz ./etc
# z代表支持gzip解压文件,c代表建立新的压缩档案,v代表显示操作过程,f代表指定压缩文件,切记,f这个参数是最后一个参数,后面只能接档案名。
[root@lb01 /]# du -h etc.tar.gz # 可看到单个压缩文件的大小是9.3M
9.3M    etc.tar.gz

第二小题

[root@lb01 /]# tar zcf etc.tar.gz ./etc --exclude=./etc/services
[root@lb01 /]# tar tf etc.tar.gz |grep /etc/services
# 验证:t代表列出档案的内容,看不到文件

第三小题

[root@lb01 /]# mkdir /tmp/etcbak# 准备好解压的目录
[root@lb01 /]# tar -zxf etc.tar.gz -C /tmp/etcbak/
# x代表解压,C代表指定解压后的目录
[root@lb01 /]# ll /tmp/etcbak/etc/#验证

总结:

一般用法:打包参数:zcvf解包参数:zxvf

注:tar是打包,不是压缩!

打包和压缩的概念

  • 打包是指将一大堆文件或目录变成一个总的文件

  • 压缩则是将一个大的文件通过一些压缩算法变成一个小文件

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩。

tar命令常用参数

-z, --gzip#压缩为gzip包
    filter the archive through gzip
-c, --create#创建一个档案
    create a new archive
-v, --verbose#显示详细信息,可省略……
    verbosely list files processed
-f, --file=ARCHIVE#指定档案的名称
    use archive file or device ARCHIVE
-t, --list  #列出档案内的内容
    list the contents of an archive
-x, --extract, --get#解包
    extract files from an archive
-C, --directory=DIR #指定解包的目录
    change to directory DIR
--exclude=PATTERN#排除
    exclude files, given as a PATTERN

2.13 过滤指定字符串

第13题考查grep命令

已知如下命令及结果: 

[oldboy@test ~]$ echo "I am oldboy,myqq is 31333741">>oldboy.txt 
[oldboy@test ~]$ cat oldboy.txt  
I am oldboy,myqq is 31333741

现在需要从文件中过滤出“oldboy”和“31333741”字符串,请给出命令。

解答:

[root@lb01 ~]# awk -F '[ ,]+' '{print $3,$6}' oldboy.txt  
oldboy 31333741

总结:

-F指定分隔符,这个文件的内容只有一行,但分隔符有空格和逗号,所以再用[ ]把多个分隔符括起来,后面的+号代表把这多个分隔符看成是一个分隔符。

2.14 统计行号

第14题如何查看/etc/services 文件内容有多少行?

方法一:先用wc输出总数,再过滤

[root@lb01 ~]# wc /etc/services 
 10774   58104   641020 /etc/services
 总行数  单词数  字节数
[root@lb01 ~]# wc /etc/services |awk '{print $1}'
10774

方法二:直接用wc的-l参数来统计共多少行

[root@lb01 ~]# wc -l /etc/services 
10774 /etc/services

总结:

wc命令可以给每个文件打印字节数,字符数,总行数,单词总数,最长行的长度

wc命令的参数

-c, --bytes  print the byte counts
-m, --chars  print the character counts
-l, --lines  print the newline counts
-w, --words  print the word counts
-L, --max-line-length  print the length of the longest line
# 最长行的长度:字符数,计空格

2.15 过滤指定字符串所在的行

第15题过滤出/etc/services 文件包含 3306 或 1521 两数据库端口的行的内容。

方法一

[root@lb01 ~]# grep -E "3306|1521" /etc/services 
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager

方法二

[root@lb01 ~]# egrep --color=auto "3306|1521" /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager