Linux面试题总结

Linux面试题总结_第1张图片

文章目录

  • 一、Linux概述
    • 1.1 Linux介绍
    • 1.2 Linux&Unix
    • 1.3 Linux内核
    • 1.4 Linux基本组件
    • 1.5 Linux体系结构
    • 1.6 BASH && DOS
    • 1.7 Linux开启过程
    • 1.8 Linux系统缺省的运行级别
    • 1.9 Linux进程间通信方式
    • 1.10 Linux系统日志文件
    • 1.11 Linux安装多个桌面环境是否有帮助
    • 1.12 Linux交换空间
    • 1.13 Linux的Root账户
    • 1.14 什么是LILO
    • 1.15 Bash
    • 1.16 CLI
    • 1.17 GUI
    • 1.18 开源优势
    • 1.19 GNU项目重要性
    • 1.20 Linux特点
    • 1.21 Linux目录结构
  • 二、磁盘 目录 文件
    • 2.1 Linux文件系统
    • 2.2 Linux目录结构
    • 2.3 inode
    • 2.4 硬链接&软链接
    • 2.5 RAID
  • 三、安全
    • 3.1 Linux系统初始化环境后需要做些什么安全工作
    • 3.2 CC攻击&DDOS攻击
    • 3.3 网站数据库注入
  • 四、Shell脚本
    • 4.1 Shell脚本
    • 4.2 Shell脚本变量类型
    • 4.3 Shell脚本中if语法
    • 4.4 Shell脚本中case语法
    • 4.5 Shell脚本中for语法
    • 4.6 Shell脚本中while语法
    • 4.7 Shell脚本如何执行
    • 4.8 Shell脚本定义函数
    • 4.9 判断一个文件是不是字符设备文件,如果是,将其拷贝到/devm目录下
    • 4.10 添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为 stdxx ,其中 xx 从 01 到 30 。
  • 五、实战
    • 5.1 Linux操作系统版本的选择
    • 5.2 Linux主机规划步骤
    • 5.3 处理用户访问网站慢问题
    • 5.4 Linux性能调优方式
  • 六、文件管理命令
    • 6.1 cat
    • 6.2 chmod
    • 6.3 chown
    • 6.4 cp
    • 6.5 find
    • 6.6 head
    • 6.7 less
    • 6.8 In
    • 6.9 locate
    • 6.10 more
    • 6.11 mv
    • 6.12 rm
    • 6.13 tail
    • 6.14 touch
    • 6.15 vim
    • 6.16 whereis
    • 6.17 which
  • 七、文档编辑命令
    • 7.1 grep
    • 7.2 wc
  • 八、磁盘管理命令
    • 8.1 cd
    • 8.2 df
    • 8.3 du
    • 8.4 ls
    • 8.5 mkdir
    • 8.6 pwd
    • 8.7 rmdir
  • 九、网络通讯命令
    • 9.1 ifconfig
    • 9.2 iptables
    • 9.3 netstat
    • 9.4 ping
    • 9.5 telnet
  • 十、系统管理命令
    • 10.1 date
    • 10.2 free
    • 10.3 kill
    • 10.4 ps
    • 10.5 rpm
    • 10.6 top
    • 10.7 yum
  • 十一、备份压缩命令
    • 11.1 bzip
    • 11.2 gzip
    • 11.3 tar
    • 11.4 unzip

一、Linux概述

1.1 Linux介绍

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。 它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统

1.2 Linux&Unix

Linux和Unix都是功能强大的操作系统,都是应用广泛的服务器操作系统

两者区别如下

区别 Linux Unix
开源性 Linux是一款开源操作系统,不需要付费,即可使用; Unix是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。
跨平台性 Linux操作系统具有良好的跨平台性能,可运行在多种硬件平台上; Unix操作系统跨平台性能较弱,大多需与硬件配套使用。
可视化界面 Linux除了进行命令行操作,还有窗体管理系统; Unix只是命令行下的系统。
硬件环境 Linux操作系统对硬件的要求较低,安装方法更易掌握; Unix对硬件要求比较苛刻,按照难度较大。
用户群体 Linux的用户群体很广泛,个人和企业均可使用; Unix的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等。

相比于Unix操作系统,Linux操作系统更受广大计算机爱好者的喜爱,主要原因是Linux操作系统具有Unix操作系统的全部功能,并且能够在普通PC计算机上实现全部的Unix特性,开源免费的特性,更容易普及使用!

1.3 Linux内核

Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
1.系统内存管理
2.应用程序管理
3.硬件设备管理
4.文件系统管理

1.4 Linux基本组件

Linux组件:内核,shell和GUI,系统实用程序和应用程序。
Linux比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。

1.5 Linux体系结构

Linux体系结构可以分为两块:

  • 用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。
  • 内核空间(Kernel Space) :内核空间又包括系统调用接口(System Call Interface)、内核(Kernel)、平台架构相关的代码(Architecture-Dependent Kernel Code) 。
    Linux面试题总结_第2张图片
    Linux之所以要分为用户空间和内核空间,有以下原因:
    1、现代 CPU 实现了不同的工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器不同。
    2、Linux 从 CPU 的角度出发,为了保护内核的安全,把系统分成了两部分。

用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。

1.6 BASH && DOS

BASH和DOS控制台之间的主要区别在于3个方面:

  1. BASH命令区分大小写,而DOS命令则不区分;
    2.在BASH下,/ 是目录分隔符,\作为转义字符。在DOS下,/用作命令参数分隔符,\是目录分隔符
    3.DOS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。

1.7 Linux开启过程

Linux开启五个阶段:
1.内核的引导。
2.运行 init。
3.系统初始化。
4.建立终端 。
5.用户登录系统。

内核引导

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
Linux面试题总结_第3张图片

运行init

nit 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。
Linux面试题总结_第4张图片

运行级别

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
Linux系统有7个运行级别(runlevel):
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
Linux面试题总结_第5张图片
系统初始化
在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。
它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

l5:5:wait:/etc/rc.d/rc 5

这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以 S 开头的启动脚本,将以start参数来运行。
而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。
这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。
Linux面试题总结_第6张图片

建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。
init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。
同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

用户登录系统

Linux预设提供了六个命令窗口终端机让我们来登录。
默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。
如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。
当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。
如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。
Linux面试题总结_第7张图片
Linux关机
在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。
正确的关机流程为:sync > shutdown > reboot > halt
关机指令为:shutdown ,你可以man shutdown 来看一下帮助文档。
例如你可以运行如下命令关机:

sync 将数据由内存同步到硬盘中。

shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。

shutdown –h now 立马关机

shutdown –h 20:25 系统会在今天20:25关机

shutdown –h +10 十分钟后关机

shutdown –r now 系统立马重启

shutdown –r +10 系统十分钟后重启

reboot 就是重启,等同于 shutdown –r now

halt 关闭系统,等同于shutdown –h now 和 poweroff

# shutdown 会给系统计划一个时间关机。它可以被用于停止、关机、重启机器。
shutdown -p now  ### 关闭机器
shutdown -H now  ### 停止机器      
shutdown -r 09:35 ### 在 09:35am 重启机器
# 要取消即将进行的关机,只要输入下面的命令:
shutdown -c

# halt 命令通知硬件来停止所有的 CPU 功能,但是仍然保持通电。你可以用它使系统处于低层维护状态。注意在有些情况会它会完全关闭系统。
halt             ### 停止机器
halt -p          ### 关闭机器、关闭电源
halt --reboot    ### 重启机器

# poweroff 会发送一个 ACPI 信号来通知系统关机。
poweroff           ### 关闭机器、关闭电源
poweroff --halt    ### 停止机器
poweroff --reboot  ### 重启机器

#reboot 命令 reboot 通知系统重启。
reboot           ### 重启机器
reboot --halt    ### 停止机器
reboot -p        ### 关闭机器

最后总结一下,不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中。
关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6。

几个有时候很有用的快捷键

# [Tab] 有『命令补全』与『文件补齐』的功能
Tab      ## 接在一串指令的第一个字的后面,则为『命令补全』
Tab]     ## 接在一串指令的第二个字以后时,则为『文件补齐』
#若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行『选项/参数的补齐』功能!

# [Ctrl]+ C 如果在Linux 底下输入了错误的指令或参数,想让当前的程序『停掉』的话,可以输入:
[Ctrl] + c 

# [Ctrl]-d 『键盘输入结束(End Of File, EOF 或 End Of Input)』的意思
# 另外,他也可以用来取代 exit 的输入。
# 例如你想要直接离开文字接口,可以直接按下:
[Ctrl] + d   ## 相当于输入 exit

# [shift]+{[PageUP]|[Page Down]}
[Shift]+[Page Up]    ## 往前翻页 
[Shift]+[Page Down]  ## 往后翻页

1.8 Linux系统缺省的运行级别

  • 关机。
  • 单机用户模式。
  • 字符界面的多用户模式(不支持网络)。
  • 字符界面的多用户模式。
  • 未分配使用。
  • 图形界面的多用户模式。
  • 重启。

1.9 Linux进程间通信方式

1、管道(pipe)、流管道(s_pipe)、有名管道(FIFO)。
2、信号(signal) 。
3、消息队列。
4、共享内存。
5、信号量。
6、套接字(socket) 。

1.10 Linux系统日志文件

比较重要的是 /var/log/messages 日志文件。
该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。
另外,如果胖友的系统里有 ELK 日志集中收集,它也会被收集进去。

1.11 Linux安装多个桌面环境是否有帮助

通常,一个桌面环境,如KDE或Gnome,足以在没有问题的情况下运行。尽管系统允许从一个环境切换到另一个环境,但这对用户来说都是优先考虑的问题。有些程序在一个环境中工作而在另一个环境中无法工作,因此它也可以被视为选择使用哪个环境的一个因素。

1.12 Linux交换空间

交换空间是Linux使用的一定空间,用于临时保存一些并发运行的程序。当RAM没有足够的内存来容纳正在执行的所有程序时,就会发生这种情况。

1.13 Linux的Root账户

root帐户就像一个系统管理员帐户,允许你完全控制系统。你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限。每次安装Linux时都是默认帐户。

1.14 什么是LILO

LILO是Linux的引导加载程序。它主要用于将Linux操作系统加载到主内存中,以便它可以开始运行。

1.15 Bash

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……

Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

1.16 CLI

命令行界面(英语**:command-line interface**,缩写]:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。
通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。

1.17 GUI

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点

1.18 开源优势

开源允许你将软件(包括源代码)免费分发给任何感兴趣的人。然后,人们可以添加功能,甚至可以调试和更正源代码中的错误。它们甚至可以让它运行得更好,然后再次自由地重新分配这些增强的源代码。这最终使社区中的每个人受益。

1.19 GNU项目重要性

这种所谓的自由软件运动具有多种优势,例如可以自由地运行程序以及根据你的需要自由学习和修改程序。它还允许你将软件副本重新分发给其他人,以及自由改进软件并将其发布给公众。

1.20 Linux特点

多用户,
多任务,
丰富的网络功能,
可靠的系统安全,
良好的可移植性,
具有标准兼容性,
良好的用户界面,
出色的速度性能,
开源

1.21 Linux目录结构

Linux面试题总结_第8张图片

bin :
(binaries)存放二进制可执行文件,这个目录存放着最经常使用的命令。
boot :
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
dev :
是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
etc :
是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve
lib:
是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
root:
该目录为系统管理员,也称作超级权限者的用户主目录。
sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
srv:
该目录存放一些服务启动之后需要提取的数据。
sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。
usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
usr/bin:
系统用户使用的应用程序。
usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。
usr/src:
内核源代码默认的放置目录。
var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里

在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。
文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。
在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点 . 来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点 … 来表示。
. :代表当前的目录,也可以使用 ./ 来表示;
… :代表上一层目录,也可以 …/ 来代表。
如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件。

二、磁盘 目录 文件

2.1 Linux文件系统

在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。
也就是说在 Linux 系统中有一个重要的概念**:一切都是文件**。其实这是 Unix 哲学的一个体现,而 Linux 是重写 Unix 而来,所以这个概念也就传承了下来。在 Unix 系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。

Linux 支持 5 种文件类型,如下图所示:
Linux面试题总结_第9张图片
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:

chown (change ownerp)  #修改所属用户与组。
chmod (change mode)    #修改用户的权限。

下图中通过 chown 来授权用户,通过 chmod 为用户设置可以开门的权限。
Linux面试题总结_第10张图片

# 在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:
[root@www /]# ls -l
total 64
dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot

实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
当为 d 则是目录
当为 - 则是文件;
若是 l 则表示为链接文档(link file);
若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
Linux面试题总结_第11张图片
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
Linux面试题总结_第12张图片
从左至右用 0-9 这些数字来表示。
第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;
第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。

Linux文件属主和属组

[root@www /]# ls -l
total 64
drwxr-xr-x 2 root  root  4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21  2014 mysql
……

对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。
同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。
文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。
因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。
在以上实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
对于 root 用户来说,一般情况下,文件的权限对其不起作用。

2.2 Linux目录结构

Linux面试题总结_第13张图片
/bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里;
/etc: 存放系统管理和配置文件;
/home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;
**/usr **: 用于存放系统应用程序;
/opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
/proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
/root: 超级用户(系统管理员)的主目录(特权阶级o);
/sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
/dev: 用于存放设备文件;
/mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
/boot: 存放用于系统引导时使用的各种文件;
**/lib **: 存放着和系统运行相关的库文件 ;
/tmp: 用于存放各种临时文件,是公用的临时文件存储点;
/var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
/lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。

2.3 inode

理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。“块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

简述 Linux 文件系统通过 i 节点把文件的逻辑结构和物理结构转换的工作过程?

  • inode 节点是一个 64 字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在 inode 节点表中最重要的内容是磁盘地址表。在磁盘地址表中有 13 个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。
  • Linux 文件系统通过把 inode 节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的 inode 节点号,通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。

2.4 硬链接&软链接

硬链接:
由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
不足:

  • 不可以在不同文件系统的文件间建立链接;
  • 只有超级用户才可以为目录创建硬链接。

软连接:
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
不足:
因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径

实际场景下,基本是使用软链接。总结区别如下:
硬链接不可以跨分区,软件链可以跨分区。
硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点
删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。

2.5 RAID

RAID 全称为独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。RAID 通常被用在服务器电脑上,使用完全相同的硬盘组成一个逻辑扇区,因此操作系统只会把它当做一个硬盘。
RAID 分为不同的等级,各个不同的等级均在数据可靠性及读写性能上做了不同的权衡。在实际应用中,可以依据自己的实际需求选择不同的 RAID 方案。

三、安全

3.1 Linux系统初始化环境后需要做些什么安全工作

  1. 添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号。
  2. 服务器使用密钥登陆,禁止密码登陆。
  3. 开启防火墙,关闭 SElinux ,根据业务需求设置相应的防火墙规则。
  4. 装 fail2ban 这种防止 SSH 暴力破击的软件。
  5. 设置只允许公司办公网出口 IP 能登陆服务器(看公司实际需要)
  6. 修改历史命令记录的条数为 10 条。
  7. 只允许有需要的服务器可以访问外网,其它全部禁止。
  8. 做好软件层面的防护。
    8.1 设置 nginx_waf 模块防止 SQL 注入。
    8.2 把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。

3.2 CC攻击&DDOS攻击

CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽。

DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。

攻击,即是通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。

3.3 网站数据库注入

  • 由于程序员的水平及经验参差不齐,大部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断。
  • 应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL 注入。
  • SQL注入,是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,如果管理员没查看日志的习惯,可能被入侵很长时间都不会发觉。

如何过滤与预防?

数据库网页端注入这种,可以考虑使用 nginx_waf 做过滤与预防。

四、Shell脚本

4.1 Shell脚本

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这些日常工作任务。
业界所说的 shell 通常都是指 shell 脚本,但要知道,shell 和 shell script 是两个不同的概念。

Shell环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……

运行shell脚本有两种方法

# 1.作为可执行文件
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

# 注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,
#直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 
#PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。



# 2.作为解释器参数
# 这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php

# 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

什么是默认登录 Shell ?

在 Linux 操作系统,"/bin/bash" 是默认登录 Shell,是在创建用户时分配的。
使用 chsh 命令可以改变默认的 Shell 。示例如下所示:
chsh <用户名> -s <新shell>
chsh ThinkWon -s /bin/sh

Shell注释

# 注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以 # 开头。例子如下:
#!/bin/bash
## This is a command
echo “I am logged in as $USER# 多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
注释内容...
EOF

## EOF也可以使用其他符号
:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

4.2 Shell脚本变量类型

Shell脚本可以使用哪些类型的变量?

  1. 系统定义变量
    系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过 set 命令查看。
    2.用户定义变量
    户变量由系统用户来生成和定义,变量的值可以通过命令 “echo $<变量名>” 查看。

Shell变量

定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name=“runoob.com”
注意:
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name=“qinjx”
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo "I am good at s k i l l S c r i p t " , 解 释 器 就 会 把 skillScript",解释器就会把 skillScript"skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写 y o u r n a m e = " a l i b a b a " , 使 用 变 量 的 时 候 才 加 美 元 符 ( your_name="alibaba",使用变量的时候才加美元符( yourname="alibaba"使)。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl  #设置变量为只读
myUrl="https://www.runoob.com" 


# 运行结果
/bin/sh: NAME: This variable is read only.

删除变量

 使用 unset 命令可以删除变量。语法:
 `#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl`

变量类型

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Shell字符串

:<<EOF字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,
也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,
也可以不用引号。
EOF

# 单引号
str='this is a string'

# 单引号字符串的限制:
## 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
## 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

# 双引号
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

## 输出结果
Hello, I know you are "runoob"! 

# 拼接字符串
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

## 输出结果
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !


# 获取字符串长度
string="abcd"
echo ${#string} #输出 4

# 提取子字符串
# 以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
#注意:第一个字符的索引值为 0。

# 查找子字符串
# 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

## 注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。

Shell数组

# bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
#类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,
#下标可以是整数或算术表达式,其值应大于或等于 0。

# 定义数组
# 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
# 数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
# 或者
array_name=(
value0
value1
value2
value3
)
# 还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
#可以不使用连续的下标,而且下标的范围没有限制。

# 读取数组
# 读取数组元素值的一般格式是:
${数组名[下标]}
valuen=${array_name[n]}
# 使用 @ 符号可以获取数组中的所有元素
echo ${array_name[@]}

# 获取数组的长度
# 获取数组长度的方法与获取字符串长度的方法相同,
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell传递参数

# 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:
# $n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,
#以此类推……

# 以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
#--------------------------------------------
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
#------------------------------------------------
# 为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。如" 使"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
# 脚本
#----------------
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
# -----------------------------------
# 执行脚本,输出结果如下所示:
$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

# $* 与 $@ 区别:
## 相同点:都是引用所有参数。
## 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

# 脚本
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

# 执行脚本,输出结果如下所示:
$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

# 在为shell脚本传递的参数中如果包含空格,应该使用单引号或者双引号将该参数括起来,以便于脚本将这个参数作为整体来接收。

#在有参数时,可以使用对参数进行校验的方式处理以减少错误发生:
if [ -n "$1" ]; then
    echo "包含第一个参数"
else
    echo "没有包含第一参数"
fi
# 注意:中括号 [] 与其中间的代码应该有空格隔开


# Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:
## 算术比较, 比如一个变量是否为0, [ $var -eq 0 ]。
## 文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]。
## 字符串比较, 比如两个字符串是否相同, [[ $var1 = $var2 ]]。

4.3 Shell脚本中if语法

If嵌套

if [ 条件 ]
	then
		命令1
		命令2
		…..
else
	if [ 条件 ]
		then
			命令1
			命令2
			….
	else
		命令1
		命令2
		…..
	fi
fi

在 Shell 脚本中如何比较两个数字?

# 在 if-then 中使用测试命令( -gt 等)来比较两个数字。例如:
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi


## 输出结果
y is greater than x

4.4 Shell脚本中case语法

# 基础语法如下
case 变量 in
值1)
命令1
命令2
…..
最后命令
!!
值2)
命令1
命令2
……
最后命令
;;
esac

4.5 Shell脚本中for语法

for 变量 in 循环列表
do
命令1
命令2
….
最后命令
done

4.6 Shell脚本中while语法

# 如同 for 循环,while 循环只要条件成立就重复它的命令块。
# 不同于 for循环,while 循环会不断迭代,直到它的条件不为真。
while [ 条件 ]
do
	命令…
done


# do-while 语句的基本格式?
# do-while 语句类似于 while 语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用 do-while 语句的语法:
do
{
	命令
} while (条件)

# break 命令的作用?
# break 命令一个简单的用途是退出执行中的循环。我们可以在 while 和 until 循环中使用 break 命令跳出循环。

# continue 命令的作用?
# continue 命令不同于 break 命令,它只跳出当前循环的迭代,而不是整个循环。 continue 命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候

4.7 Shell脚本如何执行

# 使用 chmod 命令来使脚本可执行。例子如下:
chmod a+x myscript.sh

#!/bin/bash 的作用?
##!/bin/bash 是 Shell 脚本的第一行,称为释伴(shebang)行。
### 这里 # 符号叫做 hash ,而 ! 叫做 bang。
###  它的意思是命令通过 /bin/bash 来执行。

如何调试 Shell脚本?

# 使用 -x' 数(sh -x myscript.sh)可以调试 Shell脚本。
sh -x myscript.sh

#另一个种方法是使用 -nv 参数(sh -nv myscript.sh)。
sh -nv myscript.sh

在 Shell 脚本中,如何测试文件?

# test 命令可以用来测试文件。基础用法如下:
Test         用法
-d 文件名    如果文件存在并且是目录,返回true
-e 文件名    如果文件存在,返回true
-f 文件名    如果文件存在并且是普通文件,返回true
-r 文件名    如果文件存在并可读,返回true
-s 文件名    如果文件存在并且不为空,返回true
-w 文件名    如果文件存在并可写,返回true
-x 文件名    如果文件存在并可执行,返回true

# eg
test -d test.sh

4.8 Shell脚本定义函数

函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:

[ function ] funname [()]

{

    action;

    [return int;]

}

# 说明
## 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
## 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

# Demo1
#!/bin/bash

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

# 输出结果
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----


# Demo2
#!/bin/bash
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

# 输出类似下面
这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 12 !
输入的两个数字之和为 3 !

# 函数返回值在调用该函数后通过 $? 来获得。
# 注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
带参数的函数示例:

#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

# 输出结果
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意, 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10{10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

4.9 判断一个文件是不是字符设备文件,如果是,将其拷贝到/devm目录下

#!/bin/bash
read -p "Input file name: " FILENAME
if [ -c "$FILENAME" ];then
  cp $FILENAME /dev
fi

4.10 添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为 stdxx ,其中 xx 从 01 到 30 。

#!/bin/bash
groupadd class1
for((i=1;i<31;i++))
do
        if [ $i -le 10 ];then
                useradd -g class1 std0$i
        else
                useradd -g class1 std$i
        fi
done

五、实战

5.1 Linux操作系统版本的选择

一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。
根据具体要求:

  • 安全性要求较高,则选择 Debian 或者 FreeBSD 。
  • 需要使用数据库高级服务和电子邮件网络应用的用户可以选择 SUSE 。
  • 想要新技术新功能可以选择 Feddora ,Feddora 是 RHEL 和 CentOS 的一个测试版和预发布版本。
    【重点】根据现有状况,绝大多数互联网公司选择 CentOS 。现在比较常用的是 6 系列,现在市场占有大概一半左右。另外的原因是 CentOS 更侧重服务器领域,并且无版权约束。

5.2 Linux主机规划步骤

  1. 首先确定机器用途,比如是做 WEB 、DB、还是游戏服务器。不同的用途,机器的配置会有所不同。
  2. 确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做。
  3. 需要优化系统的哪些参数,需要创建哪些用户等等的。

5.3 处理用户访问网站慢问题

有哪些方面的因素会导致网站网站访问慢?

1、服务器出口带宽不够用

  • 本身服务器购买的出口带宽比较小。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。
  • 跨运营商网络导致带宽缩减。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。

2、服务器负载过大,导致响应不过来

  • 分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。
  • 如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。

3、数据库瓶颈

  • 如果慢查询比较多。那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
  • 如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。

4、网站开发代码没有优化好
例如 SQL 语句没有优化,导致数据库读写相当耗时。

针对网站访问慢,怎么去排查?

1、首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。
2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。
3、针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。
4、如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。

怎么去解决?

1、如果是出口带宽问题,那么久申请加大出口带宽。
2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、申请购买 CDN 服务,加载用户的访问。
5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。

5.4 Linux性能调优方式

1、Disabling daemons (关闭 daemons)。
2、Shutting down the GUI (关闭 GUI)。
3、Changing kernel parameters (改变内核参数)。
4、Kernel parameters (内核参数)。
5、Tuning the processor subsystem (处理器子系统调优)。
6、Tuning the memory subsystem (内存子系统调优)。
7、Tuning the file system (文件系统子系统调优)。
8、Tuning the network subsystem(网络子系统调优)。

六、文件管理命令

6.1 cat

cat 命令用于连接文件并打印到标准输出设备上。
cat 主要有三大功能:
1.一次显示整个文件:

cat filename

2.从键盘创建一个文件,只能创建新文件,不能编辑已有文件。

cat > filename

3.将几个文件合并为一个文件:

cat file1 file2 > file

-b 对非空输出行号
-n 输出所有行号

# (1)把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里
cat -n log2012.log log2013.log

# (2) 把 log2012.log 和 log2013.log 的文件内容加上行号(空白行不加)之后将内容附加到 log.log 里
cat -b log2012.log log2013.log log.log

# (3) 使用 here doc 生成新文件
cat >log.txt <<EOF
>Hello
>World
>PWD=$(pwd)
>EOF
ls -l log.txt
cat log.txt
Hello
World
PWD=/opt/soft/test


# (4)反向列示
tac log.txt
PWD=/opt/soft/test
World
Hello

6.2 chmod

chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。

Linux面试题总结_第14张图片Linux面试题总结_第15张图片

# 语法
chmod [-cfvR] [--help] [--version] mode file...

# Demo
# (1)增加文件 t.log 所有用户可执行权限
chmod a+x t.log

# (2)撤销原来所有的权限,然后使拥有者具有可读权限,并输出处理信息
chmod u=r t.log -c

# (3)给 file 的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
chmod 751 t.log -c(或者:chmod u=rwx,g=rx,o=x t.log -c)

# (4)将 test 目录及其子目录所有文件添加可读权限
chmod u+r,g+r,o+r -R text/ -c

6.3 chown

chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID;组可以是组名或者组 ID;文件是以空格分开的要改变权限的文件列表,支持通配符。

-c 显示更改的部分的信息
-R 处理指定目录及子目录

# Demo 
# (1)改变拥有者和群组 并显示改变信息
chown -c mail:mail log2012.log

#(2)改变文件群组
chown -c :mail t.log

#(3)改变文件夹及子文件目录属主及属组为 mail
chown -cR mail: test/

6.4 cp

将源文件复制至目标文件,或将多个源文件复制至目标目录。
注意:命令行复制,如果目标文件已经存在会提示是否覆盖,而在 shell 脚本中,如果不加 -i 参数,则不会提示,而是直接覆盖!

-i 提示
-r 复制目录及目录内所有项目
-a 复制的文件与原文件时间一样

#(1)复制 a.txt 到 test 目录下,保持原文件时间,如果原文件存在提示是否覆盖。

cp -ai a.txt test

#(2)为 a.txt 建议一个链接(快捷方式)
cp -s a.txt link_a.txt

6.5 find

# 用于在文件树中查找文件,并作出相应的处理
find pathname -options [-print -exec -ok ...]

# 命令参数:
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

# 命令选项
-name 按照文件名查找文件
-perm 按文件权限查找文件
-user 按文件属主查找文件
-group  按照文件所属的组来查找文件。
-type  查找某一类型的文件,诸如:
   b - 块设备文件
   d - 目录
   c - 字符设备文件
   l - 符号链接文件
   p - 管道文件
   f - 普通文件

# Demo
(1)查找 48 小时内修改过的文件

find -atime -2
1
(2)在当前目录查找 以 .log 结尾的文件。 . 代表当前目录

find ./ -name '*.log'
1
(3)查找 /opt 目录下 权限为 777 的文件

find /opt -perm 777
1
(4)查找大于 1K 的文件

find -size +1000c
1
查找等于 1000 字符的文件

find -size 1000c 
1
-exec 参数后面跟的是 command 命令,它的终止是以 ; 为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{} 花括号代表前面find查找出来的文件名。



6.6 head

# head 用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。
-n<行数> 显示的行数(行数为复数表示从最后向前数)

# 1)显示 1.log 文件中前 20 行
head 1.log -n 20

#(2)显示 1.log 文件前 20 字节
head -c 20 log2014.log

#(3)显示 t.log最后 10 行
head -n -10 t.log


6.7 less

less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
常用命令参数
-i 忽略搜索时的大小写
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-s 显示连续空行为一行
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
-x <数字> 将“tab”键显示为规定的数字空格
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一行
回车键 滚动一页
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页

# Demo
#(1)ps 查看进程信息并通过 less 分页显示
ps -aux | less -N

#(2)查看多个文件
less 1.log 2.log

# 可以使用 n 查看下一个,使用 p 查看前一个。

6.8 In

Linux ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

6.9 locate

locate 通过搜寻系统内建文档数据库达到快速找到档案,数据库由 updatedb 程序来更新,updatedb 是由 cron daemon 周期性调用的。默认情况下 locate 命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是 locate 所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb 每天会跑一次,可以由修改 crontab 来更新设定值 (etc/crontab)。

6.10 more

功能类似于 cat, more 会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示

+n      从笫 n 行开始显示
-n       定义屏幕大小为n行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示 
-c       从顶部清屏,然后显示
-d       提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l        忽略Ctrl+l(换页)字符
-p       通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s       把连续的多个空行显示为一行
-u       把文件内容中的下画线去掉

# 常用操作命令
Enter    向下 n 行,需要定义。默认为 1 行
Ctrl+F   向下滚动一屏
空格键  向下滚动一屏
Ctrl+B  返回上一屏
=       输出当前行的行号
:f     输出文件名和当前行的行号
V      调用vi编辑器
!命令   调用Shell,并执行命令
q       退出more


# Demo
#(1)显示文件中从第3行起的内容
more +3 text.txt

#(2)在所列出文件目录详细信息,借助管道使每次显示 5 行
ls -l | more -5

# 按空格显示下 5 行。

6.11 mv

移动文件或修改文件名,根据第二参数类型(如目录,则移动文件;如为文件则重命令该文件)。
当第二个参数为目录时,第一个参数可以是多个以空格分隔的文件或目录,然后移动第一个参数指定的多个文件到第二个参数指定的目录中。

6.12 rm

删除一个目录中的一个或多个文件或目录,如果没有使用 -r 选项,则 rm 不会删除目录。如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。

6.13 tail

用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

#常用参数:
-f 循环读取(常用于查看递增的日志文件)
-n<行数> 显示行数(从后向前)

# demo
# (1)循环读取逐渐增加的文件内容
ping 127.0.0.1 > ping.log &

# 后台运行:可使用 jobs -l 查看,也可使用 fg 将其移到前台运行。
tail -f ping.log

6.14 touch

Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
ls -l 可以显示档案的时间记录。

touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]

# 参数说明:
a 改变档案的读取时间记录。
m 改变档案的修改时间记录。
c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
f 不使用,是为了与其他 unix 系统的相容性而保留。
r 使用参考档的时间记录,与 --file 的效果一样。
d 设定时间与日期,可以使用各种不同的格式。
t 设定档案的时间记录,格式与 date 指令相同。
–no-create 不会建立新档案。
–help 列出指令格式。
–version 列出版本讯息。

# 实例

# 使用指令"touch"修改文件"testfile"的时间属性为当前系统时间,输入如下命令:
$ touch testfile                #修改文件的时间属性 

# 首先,使用ls命令查看testfile文件的属性,如下所示:
$ ls -l testfile                #查看文件的时间属性   
-rw-r--r-- 1 hdd hdd 55 2011-08-22 16:09 testfile  #原来文件的修改时间为16:09 

# 执行指令"touch"修改文件属性以后,并再次查看该文件的时间属性,如下所示:
$ touch testfile                #修改文件时间属性为当前系统时间  
$ ls -l testfile                #查看文件的时间属性  

#修改后文件的时间属性为当前系统时间  
-rw-r--r-- 1 hdd hdd 55 2011-08-22 19:53 testfile  

# 使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
$ touch file            #创建一个名为“file”的新的空白文件 

6.15 vim

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富

  • 打开文件并跳到第 10 行:vim +10 filename.txt 。
  • 打开文件跳到第一个匹配的行:vim +/search-term filename.txt 。
  • 以只读模式打开文件:vim -R /etc/passwd 。

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。简单的说,我们可以将这三个模式想成底下的图标来表示:
Linux面试题总结_第16张图片

6.16 whereis

whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。whereis 及 locate 都是基于系统内建的数据库进行搜索,因此效率很高,而find则是遍历硬盘查找文件。

-b   定位可执行文件。
-m   定位帮助文件。
-s   定位源代码文件。
-u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。

# demo
# 1)查找 locate 程序相关文件
whereis locate

# (2)查找 locate 的源码文件
whereis -s locate

# (3)查找 lcoate 的帮助文件
whereis -m locate

6.17 which

在 linux 要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:

which     查看可执行文件的位置。
whereis 查看文件的位置。
locate  配合数据库查看文件位置。
find        实际搜寻硬盘查询文件名称。

# which 是在 PATH 就是指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

# 常用参数
-n  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

#Demo 
# 查看 ls 命令是否存在,执行哪个
which ls

# (2)查看 which
which which

# (3)查看 cd
which cd(显示不存在,因为 cd 是内建命令,而 which 查找显示是 PATH 中的命令)

# 查看当前 PATH 配置:
echo $PATH

# 或使用 env 查看所有环境变量及对应值

七、文档编辑命令

7.1 grep

强大的文本搜索命令,grep(Global Regular Expression Print) 全局正则表达式搜索。
grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep [option] pattern file|dir

-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的列数
-i 忽略大小写
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹

# grep 的规则表达式:
^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。 
$  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。  
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.*   #一起用代表任意字符。  
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。  
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。   
\<      #锚定单词的开始,如:'\
\>      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。 
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。  
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。  
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。  
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。  
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。


# Demo
# (1)查找指定进程
ps -ef | grep svn

# (2)查找指定进程个数
ps -ef | grep svn -c

# (3)从文件中读取关键词
cat test1.txt | grep -f key.log

# (4)从文件夹中递归查找以grep开头的行,并只列出文件
grep -lR '^grep' /tmp

# (5)查找非x开关的行内容
grep '^[^x]' test.txt

# (6)显示包含 ed 或者 at 字符的内容行
grep -E 'ed|at' test.txt

7.2 wc

wc(word count)功能为统计指定的文件中字节数、字数、行数,并将统计结果输出

wc [option] file..

-c 统计字节数
-l 统计行数
-m 统计字符数
-w 统计词数,一个字被定义为由空白、跳格或换行字符分隔的字符串

# (1)查找文件的 行数 单词数 字节数 文件名
wc text.txt

# (2)统计输出结果的行数
cat test.txt | wc -l

八、磁盘管理命令

8.1 cd

切换当前目录至 dirName。
cd / 进入要目录
cd ~ 进入 “home” 目录
cd - 进入上一次工作路径
cd !$ 把上个命令的参数作为cd参数使用。

8.2 df

显示磁盘空间使用情况。获取硬盘被占用了多少空间,目前还剩下多少空间等信息,如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB 为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示:

-a 全部文件系统列表
-h 以方便阅读的方式显示信息
-i 显示inode信息
-k 区块为1024字节
-l 只显示本地磁盘
-T 列出文件系统类型

#(1)显示磁盘使用情况
df -l

# 以易读方式列出所有文件系统及其类型
df -haT

8.3 du

du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看:

du [选项] [文件]

-a 显示目录中所有文件大小
-k 以KB为单位显示文件大小
-m 以MB为单位显示文件大小
-g 以GB为单位显示文件大小
-h 以易读方式显示文件大小
-s 仅显示总计
-c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和

#(1)以易读方式显示文件夹内及子文件夹大小
du -h scf/

#(2)以易读方式显示文件夹内所有文件大小
du -ah scf/

#(3)显示几个文件或目录各自占用磁盘空间的大小,还统计它们的总和
du -hc test/ scf/

#(4)输出当前目录下各个子目录所使用的空间
du -hc --max-depth=1 scf/

8.4 ls

就是 list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。

ls -a 列出目录所有文件,包含以.开始的隐藏文件
ls -A 列出除.及..的其它文件
ls -r 反序排列
ls -t 以文件修改时间排序
ls -S 以文件大小排序
ls -h 以易读大小显示
ls -l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来

8.5 mkdir

mkdir 命令用于创建文件夹。

-m: 对新建目录设置存取权限,也可以用 chmod 命令设置;
-p: 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不在的目录,即一次可以建立多个目录。

# (1)当前工作目录下创建名为 t的文件夹
mkdir t

# 在 tmp 目录下创建路径为 test/t1/t 的目录,若不存在,则创建:
mkdir -p /tmp/test/t1/t

8.6 pwd

pwd 命令用于查看当前工作目录路径。
(1)查看当前路径
pwd
(2)查看软链接的实际路径
pwd -P

8.7 rmdir

从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对其父目录的写权限。
注意:不能删除非空目录

# 1)当 parent 子目录被删除后使它也成为空目录的话,则顺便一并删除:
rmdir -p parent/child/child11

九、网络通讯命令

9.1 ifconfig

  • ifconfig 用于查看和配置 Linux 系统的网络接口。
  • 查看所有网络接口及其状态:ifconfig -a 。
  • 使用 up 和 down 命令启动或停止某个接口:ifconfig eth0 up 和 ifconfig eth0 down 。

9.2 iptables

iptables ,是一个配置 Linux 内核防火墙的命令行工具。功能非常强大,对于我们开发来说,主要掌握如何开放端口即可。例如:

# 把来源 IP 为 192.168.1.101 访问本机 80 端口的包直接拒绝:
iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT 。

# 开启 80 端口,因为web对外都是这个端口
iptables -A INPUT -p tcp --dport 80 -j ACCEP

# 另外,要注意使用 iptables save 命令,进行保存。否则,服务器重启后,配置的规则将丢失。

9.3 netstat

Linux netstat命令用于显示网络状态。利用netstat指令可让你得知整个Linux系统的网络情况。

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
参数说明:

-a或–all 显示所有连线中的Socket。
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
-c或–continuous 持续列出网络状态。
-C或–cache 显示路由器配置的快取信息。
-e或–extend 显示网络其他相关信息。
-F或–fib 显示FIB。
-g或–groups 显示多重广播功能群组组员名单。
-h或–help 在线帮助。
-i或–interfaces 显示网络界面信息表单。
-l或–listening 显示监控中的服务器的Socket。
-M或–masquerade 显示伪装的网络连线。
-n或–numeric 直接使用IP地址,而不通过域名服务器。
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
-o或–timers 显示计时器。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。
-r或–route 显示Routing Table。
-s或–statistice 显示网络工作信息统计表。
-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-v或–verbose 显示指令执行过程。
-V或–version 显示版本信息。
-w或–raw 显示RAW传输协议的连线状况。
-x或–unix 此参数的效果和指定"-A unix"参数相同。
–ip或–inet 此参数的效果和指定"-A inet"参数相同。


9.4 ping

Linux ping命令用于检测主机。
执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
指定接收包的次数

ping -c 2 www.baidu.com

9.5 telnet

Linux telnet命令用于远端登入。
执行telnet指令开启终端机阶段作业,并登入远端主机。
语法

telnet [-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<用户名称>][-n<记录文件>][-S<服务类型>][-X<认证形态>][主机名称或IP地址<通信端口>]

# 参数说明:
-8 允许使用8位字符资料,包括输入与输出。
-a 尝试自动登入远端系统。
-b<主机别名> 使用别名指定远端主机名称。
-c 不读取用户专属目录里的.telnetrc文件。
-d 启动排错模式。
-e<脱离字符> 设置脱离字符。
-E 滤除脱离字符。
-f 此参数的效果和指定"-F"参数相同。
-F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
-k<域名> 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
-K 不自动登入远端主机。
-l<用户名称> 指定要登入远端主机的用户名称。
-L 允许输出8位字符资料。
-n<记录文件> 指定文件记录相关信息。
-r 使用类似rlogin指令的用户界面。
-S<服务类型> 设置telnet连线所需的IP TOS信息。
-x 假设主机有支持数据加密的功能,就使用它。
-X<认证形态> 关闭指定的认证形态。


# 登录远程主机
# 登录IP为 192.168.0.5 的远程主机
telnet 192.168.0.5 

十、系统管理命令

10.1 date

显示或设定系统的日期与时间。

# 命令参数:
-d<字符串>  显示字符串所指的日期与时间。字符串前后必须加上双引号。
-s<字符串>  根据字符串来设置日期与时间。字符串前后必须加上双引号。
-u  显示GMT。
%H 小时(00-23)
%I 小时(00-12)
%M 分钟(以00-59来表示)
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。
%S 秒(以本地的惯用法来表示)
%a 星期的缩写。
%A 星期的完整名称。
%d 日期(以01-31来表示)。
%D 日期(含年月日)。
%m 月份(以01-12来表示)。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)

10.2 free

显示系统内存使用情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。

-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-s<间隔秒数> 持续显示内存
-t 显示内存使用总合

#(1)显示内存使用情况
free
free -k
free -m

#(2)以总和的形式显示内存的使用信息

free -t

#(3)周期性查询内存使用情况
free -s 10

10.3 kill

杀死进程

-l  信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a  当处理当前进程时,不限制命令名和进程号的对应关系
-p  指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s  指定发送信号
-u  指定用户

# 1)先使用ps查找进程pro1,然后用kill杀掉
kill -9 $(ps -ef | grep pro1)

# 使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

10.4 ps

ps(process status),用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用 top
linux上进程有5种状态:

  1. 运行(正在运行或在运行队列中等待)
  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
  5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
# ps 工具标识进程的5种状态码:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process

# 命令参数:
-A 显示所有进程
a 显示所有进程
-a 显示同一终端下所有进程
c 显示进程真实名称
e 显示环境变量
f 显示进程间的关系
r 显示当前终端运行的进程
-aux 显示所有包含其它使用的进程

# Demo 
#(1)显示当前所有进程环境变量及进程间关系
ps -ef

#(2)显示当前所有进程
ps -A

#(3)与grep联用查找某进程
ps -aux | grep apache

#(4)找出与 cron 与 syslog 这两个服务有关的 PID 号码
ps aux | grep '(cron|syslog)'

10.5 rpm

Linux rpm 命令用于管理套件
rpm(redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。

# 查看系统自带jdk
rpm -qa | grep jdk
# 删除系统自带jdk
rpm -e --nodeps 查看jdk显示的数据
# 安装jdk
rpm -ivh jdk-7u80-linux-x64.rpm

10.6 top

显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等

-c 显示完整的进程命令
-s 保密模式
-p <进程号> 指定进程显示
-n <次数>循环显示次数


# Demo
top - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35
Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  3.4%sy,  0.0%ni, 90.4%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32949016k total, 14411180k used, 18537836k free,   169884k buffers
Swap: 32764556k total,        0k used, 32764556k free,  3612636k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
28894 root      22   0 1501m 405m  10m S 52.2  1.3   2534:16 java  

10.7 yum

yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器
基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,

1.列出所有可更新的软件清单命令:yum check-update
2.更新所有软件命令:yum update
3.仅安装指定的软件命令:yum install
4.仅更新指定的软件命令:yum update
5.列出所有可安裝的软件清单命令:yum list
6.删除软件包命令:yum remove
7.查找软件包 命令:yum search
8.清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers

#安装 pam-devel
[root@www ~]# yum install pam-devel

十一、备份压缩命令

11.1 bzip

创建 *.bz2 压缩文件:bzip2 test.txt 。
解压 *.bz2 文件:bzip2 -d test.txt.bz2 。

11.2 gzip

创建一个 *.gz 的压缩文件:gzip test.txt 。
解压 *.gz 文件:gzip -d test.txt.gz 。
显示压缩的比率:gzip -l *.gz 。

11.3 tar

用来压缩和解压文件。tar 本身不具有压缩功能,只具有打包功能,有关压缩及解压是调用其它的功能来完成。
弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件

# 常用参数
-c 建立新的压缩文件
-f 指定压缩文件
-r 添加文件到已经压缩文件包中
-u 添加改了和现有的文件到压缩包中
-x 从压缩包中抽取文件
-t 显示压缩文件中的内容
-z 支持gzip压缩
-j 支持bzip2压缩
-Z 支持compress解压文件
-v 显示操作过程

# 有关gzip及bzip2压缩
gzip 实例:压缩 gzip fileName .tar.gz 和.tgz  解压:gunzip filename.gz 或 gzip -d filename.gz
          对应:tar zcvf filename.tar.gz     tar zxvf filename.tar.gz

bz2实例:压缩 bzip2 -z filename .tar.bz2 解压:bunzip filename.bz2或bzip -d filename.bz2
       对应:tar jcvf filename.tar.gz         解压:tar jxvf filename.tar.bz2

# demo 
# 1)将文件全部打包成 tar 包
tar -cvf log.tar 1.log,2.log 或tar -cvf log.*

#(2)将 /etc 下的所有文件及目录打包到指定目录,并使用 gz 压缩

tar -zcvf /tmp/etc.tar.gz /etc

#(3)查看刚打包的文件内容(一定加z,因为是使用 gzip 压缩的)

tar -ztvf /tmp/etc.tar.gz

#(4)要压缩打包 /home, /etc ,但不要 /home/dmtsai

tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc


11.4 unzip

解压 *.zip 文件:unzip test.zip 。
查看 *.zip 文件的内容:unzip -l jasper.zip 。

参考文档:
菜鸟教程:https://www.runoob.com/linux/linux-tutorial.html
Linux面试题(2020最新版):https://thinkwon.blog.csdn.net/article/details/104588679

你可能感兴趣的:(linux,面试,运维)