Linux 面试题篇

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

bash 复制代码
http://192.168.200.10/index1.html
http://192.168.200.10/index2.html
http://192.168.200.20/index1.html
http://192.168.200.30/index1.html
http://192.168.200.40/index1.html
http://192.168.200.30/order.html
http://192.168.200.10/order.html

答案:

bash 复制代码
root@ubuntu:/opt/interview# cat t.log | cut -d "/" -f 3
192.168.200.10
192.168.200.10
192.168.200.20
192.168.200.30
192.168.200.40
192.168.200.30
192.168.200.10
root@ubuntu:/opt/interview# cat t.log | cut -d "/" -f 3 | sort | uniq 
192.168.200.10
192.168.200.20
192.168.200.30
192.168.200.40
root@ubuntu:/opt/interview# cat t.log | cut -d "/" -f 3 | sort | uniq -c
      3 192.168.200.10
      1 192.168.200.20
      2 192.168.200.30
      1 192.168.200.40
root@ubuntu:/opt/interview# cat t.log | cut -d "/" -f 3 | sort | uniq -c | sort -nr
      3 192.168.200.10
      2 192.168.200.30
      1 192.168.200.40
      1 192.168.200.20

注意:uniq 只能把相邻且完全相同 的行当成"重复",不相邻就视为新记录,所以需要两次sort

1.2、统计连接到服务器的各个 ip 情况,并按连接数从大到小排序(腾讯)

即统计ESTABLISHED的外网地址。

答案:

bash 复制代码
root@ubuntu:/opt/interview# netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | sort | uniq -c | sort -nr
      1 192.168.200.254:67
      1 192.168.200.1:9376

1.3、问题:如忘记了 mysql5.7 数据库的 ROOT 用户的密码,如何找回? (滴滴)

1、修改/etc/my.cfg文件,在文件最末尾处加上:

skip-grant-tables

2、重启mysqld服务

service mysqld restart

bash 复制代码
# 现在不用输入密码也可以直接进入系统
[root@lingbo ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

3、在mysql数据库中修改root用户密码

sql 复制代码
# 使用mysql数据库
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
# 查看表名
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| user                      |
+---------------------------+

# 查看表字段,找到 authentication_string
mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+

# 修改root用户的密码
mysql> update user set authentication_string=password("lingbo123") where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

# 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

4、注释掉/etc/my.cfg中的跳过权限认证,并重启mysql服务。

bash 复制代码
# 修改配置文件
[root@lingbo ~]# vim /etc/my.cnf
# 重启服务
[root@lingbo ~]# service mysqld restart
Redirecting to /bin/systemctl restart mysqld.service

5、用修改完的密码登录mysql,登录成功。

bash 复制代码
[root@lingbo ~]# mysql -u root -plingbo123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

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

答案:

bash 复制代码
# 查看access.log的基本格式
[root@lingbo interview]# cat access.log 
192.168.201.20 aaaa.html
192.168.201.20 aaaa.html
192.168.201.20 aaaa.html
192.168.201.21 aaaa.html
192.168.201.20 aaaa.html
192.168.201.40 aaaa.html
192.168.201.20 aaaa.html
192.168.201.21 aaaa.html
192.168.201.21 aaaa.html
192.168.201.30 aaaa.html

# 将第一列单独列出
[root@lingbo interview]# cat access.log | awk -F " " '{print $1}'
192.168.201.20
192.168.201.20
192.168.201.20
192.168.201.21
192.168.201.20
192.168.201.40
192.168.201.20
192.168.201.21
192.168.201.21
192.168.201.30

# 对不同的ip进行计数
[root@lingbo interview]# cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr
      5 192.168.201.20
      3 192.168.201.21
      1 192.168.201.40
      1 192.168.201.30
# 只显示访问数量前两位的
[root@lingbo interview]# cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2
      5 192.168.201.20
      3 192.168.201.21

1.5、使用 tcpdump 监听本机, 将来自 ip 192.168.200.1,tcp 端口为22 的数据,保存输出到tcpdump.log , 用做将来数据分析(美团)

答案:

bash 复制代码
# 将tcpdump抓包的数据存到日志文件中
[root@lingbo interview]# tcpdump -i ens33 host 192.168.200.1 and port 22 >> /home/tcpdump.log
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
2 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@lingbo interview]# cat /home/tcpdump.log | head -10
15:40:51.566431 IP lingbo.ssh > pc.9840: Flags [P.], seq 2656650636:2656650824, ack 484491939, win 262, length 188
15:40:51.566565 IP pc.9840 > lingbo.ssh: Flags [.], ack 188, win 252, length 0

[root@lingbo interview]# cat /home/tcpdump.log
15:40:51.566431 IP lingbo.ssh > pc.9840: Flags [P.], seq 2656650636:2656650824, ack 484491939, win 262, length 188
15:40:51.566565 IP pc.9840 > lingbo.ssh: Flags [.], ack 188, win 252, length 0

1.6、如果你是系统管理员,在进行 Linux 系统权限划分时,应考虑哪些因素?(腾讯)

(1)首先阐述 Linux 权限的主要对象


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

  • 注意权限分离,比如: 工作中,Linux 系统权限和数据库权限不要在同一个部门
  • 权限最小原则(即:在满足使用的情况下最少优先)
  • 减少使用 root 用户,尽量用普通用户+sudo 提权进行日常操作。
  • 重要的系统文件,比如/etc/passwd,/etc/shadow,/etc/fstab,/etc/sudoers 等,日常建议使用chattr(change attribute)锁定,需要操作时再打开。【演示 比如: 锁定 /etc/passwd 让任何用户都不能随意 useradd,除非解除锁定】
  • 使用 SUID, SGID, Sticky 设置特殊权限。
  • 可以利用工具,比如 chkrootkit/rootkit hunter 检测 rootkit 脚本(rootkit 是入侵者使用工具,在不察觉的建立了入侵系统途径) 【演示使用 wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
  • 利用工具 Tripwire 检测文件系统完整性

1.7、权限操作思考题

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

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

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

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

1.8、说明 CentOS7 启动流程,并说明和 CentOS6 相同和不同的地方(腾讯)


第一步、硬件启动阶段

这一步和CentOS6差不多,详细请看图

第二步、GRUB2引导阶段

从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了。CentOS7的主引导程序使用的是grub2。

这一步的流程:显示加载两个镜像,再加载MOD模块文件,把grub2程序加载执行,接着解析配置文件/boot/grub2/grub.cfg,根据配置文件加载内核镜像到内存,之后构建虚拟根文件系统,最后转到内核。

在这里grub.cfg配置文件已经比较复杂了,但并不用担心,到了CentOS7中一般是使用命令进行配置,而不直接去修改配置文件了。不过我们可以看到grub.cfg配置文件开头注释部分说明了由/etc/grub.d/目录下文件和/etc/default/grub文件组成。

一般修改好配置后都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。

第三步、内核引导阶段

这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd

第四步、systemed初始化阶段(又叫系统初始化阶段)

CentOS7中我们的初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。然后执行sysinit.target来初始化系统和basic.target来准备操作系统。接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。

注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。

System概述(了解):systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的以来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。

与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:A.采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;B.用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。

unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)

(1)./etc/systemd/system/default.target

这是一个软链接,和默认运行级别相关

bash 复制代码
# ll /etc/systemd/system/default.target

lrwxrwxrwx. 1 root root 36 12月 9 15:47 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target

# 我们可以到这个目录下看看

# cd /lib/systemd/system/

# ls *.target

anaconda.target      local-fs.target      runlevel2.target

basic.target        machines.target      runlevel3.target

bluetooth.target      multi-user.target     runlevel4.target

cryptsetup-pre.target   network-online.target   runlevel5.target

cryptsetup.target     network-pre.target    runlevel6.target

ctrl-alt-del.target    network.target      shutdown.target

default.target       nfs-client.target     sigpwr.target

emergency.target      nss-lookup.target     sleep.target

final.target        nss-user-lookup.target  slices.target

getty-pre.target      paths.target       smartcard.target

getty.target        poweroff.target      sockets.target

graphical.target      printer.target      sound.target

halt.target        rdma-hw.target      suspend.target

hibernate.target      reboot.target       swap.target

hybrid-sleep.target    remote-cryptsetup.target sysinit.target

initrd-fs.target      remote-fs-pre.target   system-update.target

initrd-root-fs.target   remote-fs.target     timers.target

initrd-switch-root.target rescue.target       time-sync.target

initrd.target       rpcbind.target      umount.target

iprutils.target      rpc_pipefs.target     virt-guest-shutdown.target

kexec.target        runlevel0.target

local-fs-pre.target    runlevel1.target

这里可以看到runlevel开头的target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件,也算一种向下兼容吧

bash 复制代码
# ll runlevel*.target

lrwxrwxrwx. 1 root root 15 4月  5 22:10 runlevel0.target -> poweroff.target

lrwxrwxrwx. 1 root root 13 4月  5 22:10 runlevel1.target -> rescue.target

lrwxrwxrwx. 1 root root 17 4月  5 22:10 runlevel2.target -> multi-user.target

lrwxrwxrwx. 1 root root 17 4月  5 22:10 runlevel3.target -> multi-user.target

lrwxrwxrwx. 1 root root 17 4月  5 22:10 runlevel4.target -> multi-user.target

lrwxrwxrwx. 1 root root 16 4月  5 22:10 runlevel5.target -> graphical.target

lrwxrwxrwx. 1 root root 13 4月  5 22:10 runlevel6.target -> reboot.target

可以看到我的default.target与runlevel5.target指向的是同一个文件,可以看出我的默认运行级别是5。

(2)./usr/lib/systemd/system/

这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/。

(2)./run/systemd/system/

系统执行过程中产生的脚本。

(3)./etc/systemd/system/

类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接

1.9、问题:列举 Linux 高级命令,至少 6 个(百度)

netstat //网络状态监控

top //系统运行状态

lsblk //查看硬盘分区

find //按条件递归找文件/目录

ps -aux //查看运行进程

chkconfig //查看服务启动状态

systemctl //管理系统服务器

1.10、问题:Linux 查看内存、io 读写、磁盘存储、端口占用、进程查看命令是什么?(瓜子)

查看内存:top,

查看io读写: iotop,

查看磁盘存储: df -lh ,

查看端口占用:netstat -tunlp ,

查看进程运行情况:ps -aux | grep 关心的进程

1.11、使用 Linux 命令计算 t2.txt 第二列的和并输出 (美团)

txt 复制代码
张三 40
李四 50
王五 60

cat t2.txt | awk -F " " '{sum+=$2} END {print sum}'

1.12、Shell 脚本里如何检查一个文件是否存在?并给出提示(百度)

bash 复制代码
#!/bin/bash
if [ -f 文件名 ]
then
	echo "存在"
else
	echo "不存在"
fi

1.13、用 shell 写一个脚本,对文本 t3.txt 中无序的一列数字排序, 并将总和输出(百度)

bash 复制代码
# 查看t3.txt内容
[root@lingbo interview]# cat t3.txt 
9
8
7
6
5
4
3
2
10
# 倒序排列t3.txt内容
[root@lingbo interview]# sort -nr t3.txt 
10
9
8
7
6
5
4
3
2
[root@lingbo interview]# sort -nr t3.txt | awk '{print $1}'
10
9
8
7
6
5
4
3
2
[root@lingbo interview]# sort -nr t3.txt | awk '{sum+=$1;print $1} END {print sum}'
10
9
8
7
6
5
4
3
2
54
[root@lingbo interview]# sort -nr t3.txt | awk '{sum+=$1;print $1} END {print "和="sum}'
10
9
8
7
6
5
4
3
2
和=54

1.14、请用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符"jack"的文件名称(金山)

bash 复制代码
[root@lingbo interview]# grep -r "jack" /home/
/home/jack/.viminfo:'0  1  4  ~/jack.txt
/home/jack/.viminfo:-'  1  4  ~/jack.txt
/home/jack/.viminfo:> ~/jack.txt
/home/jack/.bash_history:vim jack.txt
/home/jack/.bash_history:chmod 640 jack.txt 
/home/jack/.bash_history:chmod g+rw,o+r jack.txt 
/home/jack/.bash_history:chmod 770 /jack
/home/jack/.bash_history:chmod 770 /home/jack
匹配到二进制文件 /home/myhome.zip
/home/xq/.bash_history:cd jack/
/home/info.txt:drwx------.  5 jack   jack   4096 12月 23 18:31 jack
/home/xh/.bash_history:cd /home/jack/
/home/xh/.bash_history:cat jack.txt 
/home/xh/.bash_history:echo "ok" >> jack.txt 
/home/xh/.bash_history:cat jack.txt 
/home/xh/.bash_history:cd jack/
/home/xh/.bash_history:cd jack/
/home/xh/.bash_history:cat jack.txt
/home/xh/.bash_history:cd jack
/home/xh/.bash_history:cd jack/
/home/xh/.bash_history:ll jack
/home/xh/.bash_history:su - jack
[root@lingbo interview]# grep -r "jack" /home/ | cut -d ":" -f 1
/home/jack/.viminfo
/home/jack/.viminfo
/home/jack/.viminfo
/home/jack/.bash_history
/home/jack/.bash_history
/home/jack/.bash_history
/home/jack/.bash_history
/home/jack/.bash_history
匹配到二进制文件 /home/myhome.zip
/home/xq/.bash_history
/home/info.txt
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history
/home/xh/.bash_history

1.15、请写出统计/home 目录下所有文件个数和所有文件总行数的指令(在金山面试题扩展)

bash 复制代码
# 统计/home目录下的文件个数
[root@lingbo interview]# find /home/ -name "*.*" | wc -l
333
# 统计/home目录下的所有文件总行数
[root@lingbo interview]# find /home/ -name "*.*" | xargs wc -l
       11 /home/jack/.bashrc
        2 /home/jack/.bash_logout
       12 /home/jack/.bash_profile
        2 /home/jack/jack.txt
wc: /home/jack/.config: 是一个目录
        0 /home/jack/.config
wc: /home/jack/.mozilla: 是一个目录
        0 /home/jack/.mozilla
       35 /home/jack/.viminfo
       ...
  1328954 总用量

1.16、每天晚上 10 点 30 分,打包站点目录/var/spool/mail 备份到/home 目录下(每次备份按时间生成不同的备份包 比如按照 年月日时分秒)(滴滴)


1.17、如何优化 Linux 系统, 说出你的方法 (瓜子)

(1)对 Linux 的架构的优化,和原则分析

(2)对 linux 系统本身的优化-规则

  1. 不用 root ,使用 sudo 提升权限
  2. 定时的自动更新服务时间,使用 nptdate npt1.aliyun.com , 让 crond 定时更新
  3. 配置 yum 源,指向国内镜像(清华,163)
  4. 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
  5. 打开最大文件数(调整文件的描述的数量) vim /etc/profile ulimit -SHn 65535
  6. 配置合理的监控策略
  7. 配置合理的系统重要文件的备份策略
  8. 对安装的软件进行优化,比如 nginx ,apache
  9. 内核参数进行优化 /etc/sysctl.conf
  10. 锁定一些重要的系统文件 chattr /etc/passwd /ect/shadow /etc/inittab
  11. 禁用不必要的服务 setup , ntsysv
相关推荐
Joren的学习记录9 小时前
【Linux运维疑难杂症】k8s集群创建calico网络失败
linux·运维·kubernetes
乾元9 小时前
现场运维机器人的工程化落地——移动探针采集 + AI 诊断,在真实网络中的实现路径
运维·网络·人工智能·架构·机器人·自动化
虾..10 小时前
Linux 线程控制
linux·运维·服务器
镜中人★10 小时前
408操作系统考纲知识点
linux·运维·服务器
liulilittle10 小时前
rinetd 端口转发工具技术原理
linux·服务器·网络·c++·端口·通信·转发
fy zs10 小时前
应用层自定义协议和序列化
linux·网络·c++
lytao12310 小时前
MySQL高可用集群部署与运维完整手册
运维·数据库·mysql·database
末日汐10 小时前
库的制作与原理
linux·后端·restful
tmacfrank10 小时前
Binder 预备知识
linux·运维·binder