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
相关推荐
Yana.nice21 小时前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月21 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
想逃离铁厂的老铁21 小时前
Day55 >> 并查集理论基础 + 107、寻找存在的路线
java·服务器
小白跃升坊21 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey1 天前
【Linux】线程同步与互斥
linux·笔记
杨江1 天前
seafile docker安装说明
运维
舰长1151 天前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀1 天前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng1 天前
Linux 输出重定向
linux·运维
路由侠内网穿透.1 天前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居