第2章 第2周课前测试考试题
2.1 过滤一级目录
第1题如何过滤出已知当前目录下oldboy中的所有一级目录
(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录)?
[[email protected] ~]# mkdir /oldboy/{a..b}/{c..g}/{e..f} -p
方法一
[[email protected] ~]# tree -L 1 -dfi /oldboy/ /oldboy /oldboy/a /oldboy/b 2 directories
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
方法二
[[email protected] ~]# find /oldboy/ -maxdepth 1 -type d /oldboy/ /oldboy/b /oldboy/a
方法三
[[email protected] ~]# ls -l /oldboy/|grep ^d|awk ‘{print $9}‘ [[email protected] ~]# ls -l /oldboy/|sed -n ‘/^d/p‘|awk ‘{print $9}‘ [[email protected] ~]# ls -l /oldboy/|awk ‘/^d/‘|awk ‘{print $9}‘ a b
方法四
[[email protected] ~]# ls -F /oldboy/|grep / [[email protected] ~]# 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目录这间来回切换
[[email protected] oldboy]# pwd# 当前路径 /oldboy [[email protected] oldboy]# cd /tmp/# 切换到/tmp [[email protected] tmp]# cd -# 切换回上一次的目录 /oldboy [[email protected] oldboy]# pwd# 检查 /oldboy [[email protected] oldboy]# echo $OLDPWD# 能够来回切换,是由这个变量控制的 /tmp
2.3 查看最近的文件
第3题一个目录中有很多文件(ls -l 查看时好多屏),想用一条命令最快速度查看到最近更新的文件。如何看?
[[email protected] 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 服务)
[[email protected] ~]# mkdir -p /application/apache2.2.17 [[email protected] ~]# ln -s /application/apache2.2.17/ /application/apache [[email protected] ~]# 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天前的
[[email protected] logs]# date 2016年 09月 09日 星期五 00:00:01 CST
方法一
[[email protected] logs]# find ./ -type f -name "*.log" -mtime +7|xargs rm # 找文件类型,名字是以.log结尾的,而且是7天以前就创建了的,找到后就删掉。把找到的结果塞进管道,接着用xargs命令处理成一行内容,再全部给rm命令处理掉。
方法二
[[email protected] logs]# rm -f `find ./ -type f -name "*.log" -mtime +7` # 注意尖角号
方法三
[[email protected] logs]# find ./ -type f -name "*.log" -mtime +7 -exec rm {} \;
2.6 实时查看文件的动态改变
第6题调试系统服务时,希望能实时查看/var/log/messages 系统日志的更新,如何做?
解答:
[[email protected] ~]# tail -f /var/log/messages# 实时查看这个文件尾部的变化 [[email protected] ~]# tailf /var/log/messages# 独立存在的命令,生产环境不建议使用
验证:
可以克隆一个会话,输入命令/etc/init.d/network restart,可以观察到文件/var/log/messages是有变化的
总结:
-f 参数的意思是当文件增长时,会实时输出被增加的数据 -F 参数和-f不一样的是,它会不断的重次
2.7 显示行号
第7题打印轻量级 web 服务的配置文件 nginx.conf 内容的行号及内容,该如何做?
1、cat -n 显示行号
[[email protected] ~]# cat -n nginx.conf 1 chen001 2 chen002 3 chen003 4 chen004 5 chen005
2、nl 专业显示行号的命令
[[email protected] ~]# nl nginx.conf 1 chen001 2 chen002 3 chen003 4 chen004 5 chen005
3、grep 点代表所有的内容,先把所有的内容过滤出来,接着在前面分别加上行号
[[email protected] ~]# grep -n . nginx.conf 1:chen001 2:chen002 3:chen003 4:chen004 5:chen005
4、awk NR代表行号,逗号代表默认的分隔符是空格,$0代表所有域,即整行内容
[[email protected] ~]# awk ‘{print NR,$0}‘ nginx.conf 1 chen001 2 chen002 3 chen003 4 chen004 5 chen005
5、vim显示行号
[[email protected] ~]# 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 级别上开机自启动,该如何做?
[[email protected] ~]# chkconfig --level 3 nfs on [[email protected] ~]# 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 系统中查看中文乱码,请问如何解决乱码问题?
方法一:当前生效
[[email protected] ~]# echo $LANG# 先看当前的环境变量LANG en_US.UTF-8 [[email protected] ~]# export LANG=‘zh_CN.UTF-8‘# 修改字符集的环境变量为中国中文 [[email protected] ~]# echo $LANG zh_CN.UTF-8
方法二:永久生效,写到配置文件里
[[email protected] ~]# cat /etc/sysconfig/i18n # 先看字符集配置文件 LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" [[email protected] ~]# echo ‘LANG="zh_CN.UTF-8"‘ >/etc/sysconfig/i18n # 修改字符集,将美国英语改成中国中文 [[email protected] ~]# source /etc/sysconfig/i18n # 使字符集配置文件生效
方法三:永久生效,放到系统全局环境变量配置文件里
[[email protected] ~]# echo "export LANG=‘zh_CN.UTF-8‘" >>/etc/profile [[email protected] ~# . /etc/profile # 使配置文件立马生效
验证:
[[email protected] ~]# 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 命令实现)
解答:
第一小题
[[email protected] ~]# cd /# 先切换到上级目录 [[email protected] /]# tar zcvf etc.tar.gz ./etc # z代表支持gzip解压文件,c代表建立新的压缩档案,v代表显示操作过程,f代表指定压缩文件,切记,f这个参数是最后一个参数,后面只能接档案名。 [[email protected] /]# du -h etc.tar.gz # 可看到单个压缩文件的大小是9.3M 9.3M etc.tar.gz
第二小题
[[email protected] /]# tar zcf etc.tar.gz ./etc --exclude=./etc/services [[email protected] /]# tar tf etc.tar.gz |grep /etc/services # 验证:t代表列出档案的内容,看不到文件
第三小题
[[email protected] /]# mkdir /tmp/etcbak# 准备好解压的目录 [[email protected] /]# tar -zxf etc.tar.gz -C /tmp/etcbak/ # x代表解压,C代表指定解压后的目录 [[email protected] /]# 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命令
已知如下命令及结果:
[[email protected] ~]$ echo "I am oldboy,myqq is 31333741">>oldboy.txt [[email protected] ~]$ cat oldboy.txt I am oldboy,myqq is 31333741
现在需要从文件中过滤出“oldboy”和“31333741”字符串,请给出命令。
解答:
[[email protected] ~]# awk -F ‘[ ,]+‘ ‘{print $3,$6}‘ oldboy.txt oldboy 31333741
总结:
-F指定分隔符,这个文件的内容只有一行,但分隔符有空格和逗号,所以再用[ ]把多个分隔符括起来,后面的+号代表把这多个分隔符看成是一个分隔符。
2.14 统计行号
第14题如何查看/etc/services 文件内容有多少行?
方法一:先用wc输出总数,再过滤
[[email protected] ~]# wc /etc/services 10774 58104 641020 /etc/services 总行数 单词数 字节数 [[email protected] ~]# wc /etc/services |awk ‘{print $1}‘ 10774
方法二:直接用wc的-l参数来统计共多少行
[[email protected] ~]# 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 两数据库端口的行的内容。
方法一
[[email protected] ~]# 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
方法二
[[email protected] ~]# 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