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 系统本身的优化-规则
- 不用 root ,使用 sudo 提升权限
- 定时的自动更新服务时间,使用 nptdate npt1.aliyun.com , 让 crond 定时更新
- 配置 yum 源,指向国内镜像(清华,163)
- 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
- 打开最大文件数(调整文件的描述的数量) vim /etc/profile ulimit -SHn 65535
- 配置合理的监控策略
- 配置合理的系统重要文件的备份策略
- 对安装的软件进行优化,比如 nginx ,apache
- 内核参数进行优化 /etc/sysctl.conf
- 锁定一些重要的系统文件 chattr /etc/passwd /ect/shadow /etc/inittab
- 禁用不必要的服务 setup , ntsysv