「Linux 奏章 22」Linux 面试题

321 阅读11分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

该文章修改了 2 轮,当作复习加深印象了💦

  • V 1.0:添加截图,演示结果,增强联想!
  • V 2.0:添加题目分析,分析的过程收获了不少!

Title 1

题目:分析日志 t.log (访问量),将各个 ip 地址截取,并统计出现次数,并按从大到小排序

http://192.168.200.10/index1.html
http://192.168.200.20/index1.html
http://192.168.200.30/index2.html
http://192.168.200.10/index1.html
http://192.168.200.20/index3.html
http://192.168.200.10/index2.html

答案:cat 1.txt | cut -d '/' | -f 3 | sort | uniq -c | sort -nr

分析:

指令已被我逐步分解,见上图(全篇文章如此,不再赘述);如下详细地讲解下各个指令部分。

cat 指令大家都挺熟悉了,这里将 cat 显示的数据通过 cut -d '/' 过滤分成几段,-f 3 就是取出第三段啦,也就是 (点分十进制) IP 地址,然后通过 sort 将其按类别(升序)排列,然后 uniq -c 进行同类别数量统计并合并,而题目要求从大到小(降序)排列,那我们在 sort 后再添加参数 -nr 即可完成降序排序。

Title 2

题目:统计连接到服务器的各 ip 情况,并按照连接数从大到小排序

答案:netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr

分析:

netstat 显示当前服务的端口占用情况grep ESTABLISHED 从中过滤出已建立连接的服务及其对应 IP,awk -F " " '{print $5}' 则将过滤出的数据按照空格分割并打印第 5 部分的数据(此处不能用 cut 指令)即如上图的 <IP:Port> 部分;题目只需要 IP 那么我们再用一次 awk 指令过滤一下即可;sort 排序后 uniq -c 统计再重新降序 -nr 排序一番。

Title 3

题目:如果忘记了 mysql 5.7 数据库的 ROOT 用户的密码,如何找回?

答案:

1、vim /etc/my.cnf 加入如下内容:

# 通过配置以越过权限表
skip-grant-tables

2、service mysqld restartmysql -u root -p、然后 enter 直接进入:

这里能直接进入而无需密码就是因为刚刚配置了 skip-grant-tables,直接可以越过权限表进入。显然这是 mysql 为防止用户忘记密码而准备的操作。

3、修改 MySQL 数据库密码

  • use mysql:记住是在 mysql 数据库(自带)
  • update user set authentication_string=password("w123456") where user='root';:重新设置自己的 Mysql 密码
  • flush privileges;:刷新权限(一定要执行,可理解为使得重置密码生效
  • vim /etc/my.cnf:注释掉 skip-grant-tables
  • mysql -u root -p:重新根据密码登录

Title 4

问题:统计 ip 访问情况,要求分析 nginx 访问日志(access.log),找出访问页面数量在前2位的ip

192.168.130.21 aaa.html
192.168.130.20 aaa.html
192.168.130.22 aaa.html
192.168.130.22 aaa.html
192.168.130.25 aaa.html
192.168.130.21 aaa.html
192.168.130.26 aaa.html
192.168.130.26 aaa.html
192.168.130.26 aaa.html

答案:cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2

分析:如果理解了 [Title 2](#Title 2) 后,这题就没什么难度了,可以试着自己做做看,分析看 [Title 2](#Title 2) 即可(同理且相对简单,不再赘述)。

Title 5

题目:使用 tcpdump 监听本机,将来自 ip 192.168.200.1,tcp 端口为 22 的数据保存输出到 tcpdump.log,用于将来数据分析。

答案:tcpdump -i ens33 host 192.168.200.1 and port 22 >> /root/interview/tcpdump.log

分析:tcpdump 基于 unix 系统命令行的数据包嗅探指令,可以抓取流动在网卡上的数据包;-i ens33 host 192.168.200.1 and port 22 指明了网卡、IP 与 端口,也就是指明监听来自 ip 192.168.200.1,tcp 端口为 22 的数据,然后将其通过 >> 重定向到 tcpdump.log

Title 6

题目:常用的 Nginx 模块用于做什么?

Nginx 模块分两种:官方和第三方,我们可以通过 nginx -V 查看 nginx 已经安装的模块!

[root@localhost ~]# nginx -V
nginx version: nginx/1.15.9
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_modul

查看当前 Nginx 客户端状态信息

常用的 Nginx 模块名称(包括但不限于)模块作用
rewrite 模块实现重写功能
access 模块来源控制
ssl 模块安全加密
ngx_http_gzip_module网络传输压缩模块
ngx_http_proxy_module模块实现代理
ngx_http_upstream_module模块实现定义后端服务器列表
ngx_cache_purge实现缓存清除功能
......

Title 7

题目:如果你是系统管理员,在进行 Linux 系统权限划分时,应考虑哪些因素?

Step 1

先阐述 Linux 权限的主要对象:

💦 rwx 作用到文件

  • 【r】可以读取、查看文件
  • 【w】可以修改文件,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限!
  • 【x】可执行该文件

💦 rwx 作用到目录

  • 【r】可以读取——ls
  • 【w】可以修改,对目录内创建、删除,重命名目录
  • 【x】可以进入目录

Step 2

根据自己实际经验谈考虑因素

  • 注意权限分离
  • 权限最小原则(即:在满足使用的情况下最少优先)
  • 减少使用 root 用户,尽量使用普通用户 + sudo 进行日常操作
  • 重要的系统文件,比如 /etc/passwd/etc/shadow/etc/fstab/etc/sudoers 等,日常建议使用 chattr 锁定,需要操作时再打开【chattr】
  • 使用 SUIDSGIDSticky 设置特殊权限
  • 可以利用工具,比如 chkrootkit / rootkit hunter 检测 rootkit 脚本(rootkit 是入侵者使用工具,在不察觉的情况下建立了入侵系统途径)
  • 利用工具 Tripwire 检测文件系统完整性

Title 8

rwx 权限说明

rwx 作用到文件

  • 【r】可以读取、查看文件
  • 【w】可以修改文件,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限!
  • 【x】可执行该文件

rwx 作用到目录

  • 【r】可以读取——ls
  • 【w】可以修改,对目录内创建、删除,重命名目录
  • 【x】可以进入目录

权限思考题

1、用户 tom 对目录 /home/test 有执行和读写权限 (rwx),/home/test/hello.java 是只读文件 (r),问 tom 对 hello.java 文件能读吗?能修改吗?能删除吗?

答案:读取✔;修改❌;删除✔。

分析

  • 读取:首先是 /home/test/hello.java 文件可读,再者有权限进入 /home/test 目录下
  • 修改:/home/test/hello.java 是只读文件,没有修改权限 (w)
  • 删除:文件能否删除取决于所在目录能否修改 (w) 而不在于文件本身的 rwx 权限,显然 /home/test 有修改权限 (w)

2、用户 tom 对目录 /home/test 只有读写权限 (rw),/home/test/hello.java 是只读文件 (r),问 tom 对 hello.java 文件能读吗?能修改吗?能删除吗?

答案:读取❌;修改❌;删除❌。

分析

  • 读取:虽然 /home/test/hello.java 文件可读,但没有 /home/test 文件夹的写权限 (x),前提不成立所以无法读取;但可以通过 ll 命令查看到该目录下有此文件
  • 修改:/home/test/hello.java 是只读文件,没有修改权限 (w)
  • 删除: 对于目录而言 x 权限是 w 权限的前提,无法进入目录,则无法对文件进行操作

3、用户 tom 对目录 /home/test 只有执行权限 (x),/home/test/hello.java 是只读文件,问 tom 对 hello.java 文件能读吗?能修改吗?能删除吗?

答案:读取✔;修改❌;删除❌。

分析

  • 读取:/home/test 目录写权限 (x) 且文件可读
  • 修改:/home/test/hello.java 是只读文件,没有修改权限 (w)
  • 删除:仅有 x 权限的目录只能进入该目录中,而无法修改文件 (缺少 x 权限)

4、用户 tom 对目录 /home/test 有执行和写权限 (wx),/home/test/hello.java 是只读文件,问 tom 对 hello.java 文件能读吗?能修改吗?能删除吗?

答案:读取✔;修改❌;删除✔。

分析

  • 读取:/home/test 目录有写权限 (x) 且文件可读
  • 修改:/home/test/hello.java 是只读文件,没有修改权限 (w)
  • 删除:目录同时具有执行权限 (x) 与写权限 (w),可进入并删除文件

Title 9

题目:说明 CentOS 7 启动流程,并说明和 CentOS 6 相同和不同的地方。

详见博客 (讲得挺详细, 不再赘述):CentOS 6 与 CentOS 7 启动流程

Title 10

问题:Linux 查看内存占用与 io 读写速率磁盘存储端口占用进程查看命令是什么?

答案:topdf -lhnetstat -tunlpps -aux | grep "xxx"

分析:

  • top 指令可实时监测内存占用与 io 读写速率
  • df -lh 查看系统磁盘储存
  • netstat -tunlp 查看端口占用情况
  • ps -aux | grep "xxx" 根据关键词 xxx 过滤出要检索的进程

Title 11

题目:使用 Linux 命令计算 11.txt 第二列的和并输出

张三 40
李四 50
王五 60

答案:cat 11.txt | awk -F " " '${sum+=$2}' END {print sum}

分析awk -F " " 将数据按照空格过滤,'${sum+=$2}' 则将所有分割出的第二段数据累加起来,{print sum} 毫无疑问打印输出流到控制台上。

Title 12

题目:Shell 脚本里如何检查一个文件是否存在?并给出提示。

答案if [ -f <文件名> ] then echo "存在" else echo "不存在" fi

分析

这题其实挺简单的,只需要掌握基本的 shell 语句即可完成,若对 shell 脚本没有概念,参考下我写的这篇文章 「Linux 奏章 18」Shell 脚本

⭐这里简单提一下 -f <文件名>,其实 if 语句的条件判断前后都要有空格[ -f <文件名>] 表示当文件存在且是一个常规的文件时,返回 true !

Title 13

题目:用 shell 编写一个脚本,对文本 13.txt 中无序的一列数字排序,并将总和输出

9 8 7 6 5 3 4 1 2 10

答案:sort -nr 13.txt | awk '{sum+=$0; print $0} END {print "和="sum}'

分析

分析题目,有两个要求(分步演示,如下图

  • 排序(容易遗漏):排序 (sort -nr 13.txt) 就是要将其排序后的结果输出,所以在 awk '{sum+=$0}' 统计的同时还要加上 print $0,即 awk '{sum+=$0; print $0}
  • 输出总和{print sum}

Title 14

问题:请用指令查找出 /home 下所有的文本文件内容中包含有字符 "cat" 的文件名称。

答案:grep -r "cat" /home | cut -d ":" -f 1

分析grep 指令用于查找内容包含指定的范本样式的文件,-r 参数就是在指定目录下列出所有包含的项 (即包括查找子目录),cut 指令搭配 | 过滤出文件名,省略了后缀

Title 15

问题:统计 /home 目录下所有文件个数和所有文件总行数的指令。

答案:

  • find /home -name "*.*" | wc -l
  • find /home -name "*.*" | xargs wc -l

分析

  • find 指令十分强大,用来在指定目录下查找文件;-name <name> 查找指定名称的文件。
    • 拓展:-iname <name> 查找指定名称文件的同时忽略文件名大小写
  • 你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令。xargs 可以将一个命令的输出作为参数发送给另一个命令。

Title 16

问题:列出你了解的 web 服务器负载架构

答案

  • Nginx💦
  • Haproxy💦
  • Keepalived
  • LVS💦

分析

🔥 Nginx / LVS/ HAProxy 是目前使用最广泛的三种负载均衡软件。

LVS

LVS(Linux Virtual Server),也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目。使用 LVS 技术要达到的目标是:通过 LVS 提供的负载均衡技术和 Linux 操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

🎯LVS 主要用来做四层负载均衡。

LVS 架构:LVS 架设的服务器集群系统由三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用 Server Array 表示,最底层的数据共享存储层,用 Shared Storage 表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

Nginx

Nginx 是一个网页服务器,它能反向代理 HTTP、HTTPS、SMTP、POP3、IMAP 的协议链接,以及一个负载均衡器和一个 HTTP 缓存

🎯Nginx 主要用来做七层负载均衡。

HAProxy

HAProxy 也是使用较多的一款负载均衡软件。HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,是免费、快速并且可靠的一种解决方案。特别适用于那些负载特大的 Web 站点。运行模式使得它可以很简单安全的整合到当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。

HAProxy 是一个使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。

🎯Haproxy 主要用来做七层负载均衡。

更多💬:浅谈几种常用负载均衡架构

Title 17

问题:每天 22:30,打包站点目录 /var/spool/mail 备份到 /home 目录下(每次备份按时间生成不同的备份包)

问题拆分与逐步解决

1、编写 shell 脚本💦

#!/bin/bash

# 先进入到指定目录下再使用 tar 命令打包: `cd /var/spool`
# /bin/tar -zcf /home/mail-`date +%Y-%m_%H%M%S`.tar.gz mail/: 将/var/spool/mail目录打包并命名为mail-`date +%Y-%m_%H%M%S`.tar.gz,然后放置到/home目录下
cd /var/spool/ && /bin/tar -zcf /home/mail-`date +%Y-%m-%d_%H%M%S`.tar.gz mail/

2、定时调度💦

定时调度的命令我也有写一篇单独的文章:「Linux 奏章 10」定时任务调度
相信我,看过之后你看这题基本没有疑问了..

  • 首先执行 crontab -e 编辑定时调度任务

  • 然后新建定时调度任务30 22 * * * /root/interview/cronTar.sh

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥