「这是我参与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 restart、mysql -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-tablesmysql -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】 - 使用
SUID、SGID、Sticky设置特殊权限 - 可以利用工具,比如 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 读写速率、磁盘存储、端口占用、进程查看命令是什么?
答案:top、df -lh、netstat -tunlp、ps -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 -lfind /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
希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥