Linux知识点汇总

  • Linux知识点汇总
    • 一、Linux文件与目录
      • 1.文件颜色代表的意义
      • 2.Linux文件目录结构
      • 3.Linux文件基本属性
      • 4.Linux文件与目录管理
        • 4.1 绝对路径
        • 4.2 相对路径
        • 4.3 处理目录的常用命令
        • 4.4 Linux 文件内容查看
        • 4.5 文件与目录的默认权限与隐藏权限
          • 4.5.1 文件与目录的默认权限
          • 4.5.2 文件隐藏属性
          • 4.5.2 文件特殊权限: SUID、SGID、SBIT
        • 4.6 命令与文件的查找
    • 二、Vim
      • 1. 什么是vim
      • 2. vi/vim 的使用
      • 3. vi/vim 使用实例
      • 4. vi/vim 按键说明
        • 4.1 第一部分:一般模式可用的光标移动、搜索替换、复制粘贴等
        • 4.2 第二部分:一般模式切换到编辑模式的可用的按钮说明
        • 4.3 第三部分:一般模式切换到指令行模式的可用的按钮说明
    • 三、Shell
      • 1. 什么是shell
      • 2. Shell 脚本
      • 3. Shell 环境
      • 4. Shell变量
        • 4.1 使用变量
        • 4.2 只读变量
        • 4.3 删除变量
        • 4.4 变量类型
        • 4.5 Shell 字符串
        • 4.6 Shell 数组
          • 4.6.1 定义数组
          • 4.6.2 读取数组
          • 4.6.3 获取数组的长度
        • 4.7 Shell 注释
          • 4.7.1 单行注释
          • 4.7.2 多行注释
      • 5. Shell传递参数
      • 6. Shell运算符
        • 6.1 Shell基本运算符
        • 6.2 Shell算术运算符
        • 6.3 Shell关系运算符
        • 6.4 Shell布尔运算符
        • 6.5 Shell逻辑运算符
        • 6.6 Shell字符串运算符
        • 6.7 Shell文件测试运算符
      • 7. Shell命令
        • 7.1 Shell echo命令
        • 7.2 Shell printf命令
        • 7.3 Shell test命令
      • 8. Shell 流程控制
        • 8.1 if else-if else
        • 8.2 for 循环
        • 8.3 while 语句
        • 8.4 until 循环
        • 8.5 case ... esac
      • 9. Shell 函数
        • 9.1 函数定义与使用
        • 9.2 函数参数
      • 10. Shell 输入/输出重定向
        • 10.1 输出重定向
        • 10.2 输入重定向
        • 10.3 重定向深入讲解
        • 10.4 Here Document
        • 10.5 /dev/null 文件
      • 11. Shell 文件包含
    • 四、Linux磁盘管理
      • 1.Linux 文件系统与磁盘的关系
        • 1.1 磁盘格式
        • 1.2 文件系统
        • 1.3 磁盘与目录的容量
        • 1.4 硬链接与符号链接(软连接)
        • 1.5 观察磁盘分区状态
        • 1.6 磁盘分区
        • 1.7 磁盘格式化(创建文件系统)
        • 1.8 文件系统挂载与卸载
        • 1.9 磁盘/文件系统参数自定义
      • 2.设置系统启动挂载
      • 3.内存交换分区创建
      • 4.磁盘配额(quota)
      • 5.软件磁盘阵列(redundant arrays of inexpensive disks, RAID)
        • 5.1软件磁盘阵列介绍
        • 5.1硬件RAID,软件RAID
      • 6.逻辑卷管理器(Logical Volume Manager, LVM)
        • 6.1 概念
        • 6.2 实践流程
    • 五、Linux用户和用户组管理
      • 1.Linux系统用户账号的管理
        • 1.1 添加用户
        • 1.2 删除帐号
        • 1.3 修改帐号
        • 1.4 用户口令的管理
        • 1.5 用户密码参数修改
      • 2.Linux一般身份用户功能
        • 2.1 id
        • 2.2 finger
        • 2.3 chfn
        • 2.4 chsh
      • 3.Linux系统用户组的管理
        • 3.1 增加用户组
        • 3.2 删除一个用户组
        • 3.3 修改用户组的属性
        • 3.4 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
        • 3.5 用户组管理员功能
      • 4.主机详细权限规划:ACL的使用
        • 4.1 getfacl、setfacl
      • 5.用户切换
        • 5.1 su
        • 5.1 sudo
      • 6.用户特殊shell和PAM模块
      • 7.Linux主机上的用户信息传递
        • 7.1 查询用户:w、who、last、lastlog
        • 7.2 用户对谈:write、mesg、wall
    • 六、Linux计划任务
      • 1. Linux计划任务种类:at、cron
      • 2. 单一执行计划任务:atd
      • 3. 循环执行的计划任务:crond
    • 七、Linux进程与服务
      • 1 进程与服务
      • 2 任务管理
        • 2.1 job control的管理
          • 2.1.1 直接将命令丢到后台中【执行】的&
          • 2.1.2 将【目前】的任务丢到后台中【暂停】:[ctrl]-z
          • 2.1.3 查看目前的后台任务状态:jobs
          • 2.1.4 将后台任务拿到前台处理:fg
          • 2.1.5 让任务在后台下的状态变成运行中:bg
          • 2.1.6 管理后台当中的任务:kill
        • 2.2 脱机管理问题
      • 3 进程管理
        • 3.1 查看进程
          • 3.1.1 ps:将某个时间点的进程运行情况截取下来
          • 3.1.2 ps aux:查看系统所有进程
          • 3.1.3 top:动态查看进程的变化
          • 3.1.4 ptree:查看进程相关性
      • 4 进程的执行顺序
      • 5 查看系统资源信息
        • 5.1.1 free:查看内存使用情况
        • 5.1.2 uname:查看系统与内核相关信息
        • 5.1.3 uptime:查看系统启动时间与任务负载
        • 5.1.4 netstat:追踪网络或socket文件
        • 5.1.5 dmesg:分析内核产生的信息
        • 5.1.6 vmstat:检测系统资源变化
      • 6 特殊文件与进程
        • 6.1 具有SUID/SGID权限的命令执行状态
        • 6.2 /proc/*代表的意义
      • 7 查询已使用文件或已执行进程使用的文件
        • 7.1 fuser:借由文件(或文件系统)找出正在使用该文件的进程
        • 7.2 lsof:列出被进程所使用的文件名称
        • 7.3 pidof:找出某个正在执行的进程的PID
    • 八、SELinux
      • 1.SELinux的运行模式
      • 2.SELinux的3种模式:启动、关闭、查看
        • 2.1 获取当前SELinux模式:getforce
        • 2.2 获取当前SELinux的策略(Policy):setstatus
        • 2.3 切换SELinux模式:setenforce
      • 3.SELinux策略内的规则管理
        • 3.1 SELinux各个规则的布尔值查询:getsebool
        • 3.2 SELinux各个规则规范的主体进程能够读取的文件SELinux类型查询seinfo、sesearch
        • 3.3 修改SELinux规则的布尔值:setsebool
      • 4.SELinux安全上下文的修改
        • 4.1 修改文件的SELinux类型:chcon
        • 4.2 让文件回复正确的SELinux类型:restorecon
        • 4.3 默认目录的安全上下文查询与修改:semanage
    • 九、认识与分析日志
      • 9.1 CentOS7日志文件简易说明
      • 9.2 rsyslogd
      • 9.3 logrotate
      • 9.4 logwatch
    • 十、系统基础设置与备份策略
      • 1.系统基本设置
        • 1.1 网络设置:手动设置与DHCP自动获取
        • 1.2 日期与时间设置
        • 1.3 语系设置
      • 2.服务器硬件数据收集
        • 2.1 查看硬件设备:dmidecode
        • 2.2 硬件资源的收集与分析:gdisk,dmesg,vmstat,lspci,lsusb,iostat
        • 2.3 了解磁盘的健康状态
      • 3.备份要点
        • 3.1 哪些Linux数据具有备份的意义
        • 3.2 备份的种类、频率与工具的选择
          • 3.2.1 累计备份
          • 3.2.2 差异备份
          • 3.2.3 远程备份
    • 十一、软件安装:源代码与Tarball
      • 1. 什么是make与configure
      • 2.Tarball安装的基本步骤
      • 3.利用patch更新源代码
      • 4.函数库管理
        • 4.1 静态函数库特色
        • 4.2 动态函数库特色
        • 4.3 把动态函数库从硬盘加载到内存缓存:ldconfig与/etc/ld.so.conf
        • 4.4 程序的动态函数库解析:ldd
        • 4.5 校验软件正确性:MD5sum、sha1sum、sha256sum
    • 十二、软件安装:RPM、SRPM、YUM
      • 1.什么是RPM与SRPM
      • 2.RPM属性依赖的解决方式:YUM在线升级
      • 3.RPM软件管理程序:rpm
        • 3.1 RPM安装(install)
        • 3.2 RPM升级与更新(upgrade/freshen)
        • 3.3 RPM查询(query)
        • 3.4 RPM验证与数字签名(Vertify/signature)
        • 3.5 RPM反安装与重建数据库(erase/rebuilddb)
      • 4.YUM在线升级功能
        • 4.1 YUM查询
        • 4.2 YUM安装/升级
        • 4.2 YUM删除
        • 4.3 YUM的配置文件
      • 5.管理的抉择:RPM还是Tarball
      • 6.基础服务安装示例
      • 7.SRPM的使用:rpmbuild

Linux知识点汇总

一、Linux文件与目录

1.文件颜色代表的意义

绿色文件---------- 可执行文件,可执行的程序
红色文件-----------压缩文件或者包文件
蓝色文件----------目录
白色文件----------普通,如文本文件,配置文件,源码文件等
浅蓝色文件----------链接文件,主要是使用ln命令建立的文件
红色闪烁----------表示链接的文件有问题
黄色文件----------表示设备文件
灰色文件----------表示其它文件

2.Linux文件目录结构


以下是对这些目录的解释:

/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

/lib:
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:
内核源代码默认的放置目录。

/usr/local:
系统管理员在本机下安装自己下载的软件(非发行版默认提供者),建议安装此目录,这样会便于管理。

/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

3.Linux文件基本属性

文件基本属性
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组。

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
当为 d 则是目录
当为 - 则是文件;
若是 l 则表示为链接文档(link file);
若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

更改文件属性
1、chgrp:更改文件属组
2、chown:更改文件属主,也可以同时更改文件属组
3、chmod:更改文件9个属性

4.Linux文件与目录管理

4.1 绝对路径

路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。

4.2 相对路径

路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd …/man 这就是相对路径的写法。

4.3 处理目录的常用命令

ls(英文全拼:list files): 列出目录及文件名
cd(英文全拼:change directory):切换目录
pwd(英文全拼:print work directory):显示目前的目录
mkdir(英文全拼:make directory):创建一个新的目录
rmdir(英文全拼:remove directory):删除一个空的目录
cp(英文全拼:copy file): 复制文件或目录
rm(英文全拼:remove): 删除文件或目录
mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
touch :创建文件
你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。

4.4 Linux 文件内容查看

cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 查看非文本文件
你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。

4.5 文件与目录的默认权限与隐藏权限

4.5.1 文件与目录的默认权限

当建立一个新的文件或者目录时,他的默认权限与umask有关。

4.5.2 文件隐藏属性

lsattr:显示文件隐藏属性

lsattr [-adR] 文件或目录选项与参数:
-a:将隐藏文件的属性也显示出来
-d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R:连同子目录的数据也一并列出来
4.5.2 文件特殊权限: SUID、SGID、SBIT

SUID(set UID)
当s这个标志出现在文件拥有者的x权限上时,如【-rwsr-xr-x】,此时就被称为Set UID,简称为SUID的特殊权限。
限制与功能:
1.SUID权限仅对二进制程序(binary program)有效
2.执行者对于该程序需要具有x的可执行权限
3.本权限仅在执行该程序的过程中有效(run-time)
4.执行者将具有该程序拥有者(owner)的权限

例子:/etc/shadow这个文件的权限是【---------- 1 root root】,意思是仅有root可读且仅有root可以强制写入。但是一般用户也可以通过passwd这个命令修改自己密码(就是修改/etc/shadow这个配置文件了),这就是SUID的功能。

SGID(set GID)
当s这个标志出现在文件用户组的x时,称为Set GID。
对文件的限制与功能:
1.SGID对二进制程序有用
2.程序执行者对于该程序来说,需具备x的权限
3.执行者在执行的过程中将会获得该程序用户组的支持
对目录的限制于功能:
1.用户若对于此目录具有r与x的权限时,该用户能够进入此目录
2.用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
3.用途:若用户在此目录下具有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同

SBIT(Sticky Bit)
SBIT目前只针对目录有效。
对目录的作用:
1.当用户对于此目录具有w、x权限,即具有写入的权限
2.当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除该文件

例子:/tmp目录的权限是【drwxrwxrwt】,在这样的权限下任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件

SUID/SGID/SBIT权限设置
数值更改权限的方式为【三个数字】的祖国和,那么如果在这三个数字之前再加上一个数字,最前面的数字就代表这几个权限。
4为SUID
2为SGID
1为SBIT

touch test
chmod 4755 test; ls- l test  //结果为-rwsr-xr-x
chmod 6755 test; ls -l test  //结果为-rwsr-sr-x
chmod 7755 test; ls -l test  //结果为-rwsr-sr-t
chmod 7666 test; ls -l test  //结果为-rwSr-Sr-T。 这个S与T代表空,也就是说user、group、others都没有x这个可执行的标志(666)

4.6 命令与文件的查找

file:观察文件类型,文件基本信息,例如是输入ASCII或者是数据文件或者是二进制文件,且其中有没有使用到动态链接库(share library)等信息.

which:查找【执行文件】,如ls这个常用的命令放在哪

whereis:找系统中某些特定目录下的文件

locate:查找已建立的数据库(/var/lib/mlocate/里面的数据)来查找文件名,所以不用直接再去硬盘当中取数据。

find:直接查找硬盘,所用时间较多

二、Vim

1. 什么是vim

什么是 vim?
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

2. vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:

命令模式
用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
: 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

输入模式
在命令模式下按下i就进入了输入模式。

在输入模式中,可以使用以下按键:

字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式

底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):

q 退出程序
w 保存文件
按ESC键可随时退出底线命令模式。

简单的说,我们可以将这三个模式想成底下的图标来表示:

3. vi/vim 使用实例

使用 vi/vim 进入一般模式
如果你想要使用 vi 来建立一个名为 runoob.txt 的文件时,你可以这样做:

vim runoob.txt

直接输入 vi 文件名 就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加文件名,不管该文件存在与否!

按下 i 进入输入模式(也称为编辑模式),开始编辑文字
在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式了!

在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。

按下 ESC 按钮回到一般模式
好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角的 – INSERT – 不见了!

在一般模式中按下 :wq 储存后离开 vi
OK,我们要存档了,存盘并离开的指令很简单,输入 :wq 即可保存离开!

4. vi/vim 按键说明

除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。

4.1 第一部分:一般模式可用的光标移动、搜索替换、复制粘贴等

光标移动

按键 说明
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
n n 为数字。光标向下移动 n 行(常用)

搜索替换

按键 说明
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

删除、复制与粘贴

按键 说明
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整行(常用)
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制游标所在行到第一行的所有数据
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)

这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

4.2 第二部分:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式

按键 说明
i, I 进入输入模式(Insert mode):i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
a, A 进入输入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O 进入输入模式(Insert mode):这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用)
r, R 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
[Esc] 退出编辑模式,回到一般模式中(常用)

上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!

4.3 第三部分:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令

按键 说明
:w 将编辑的数据写入硬盘档案中(常用)
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
ZQ 不保存,强制退出。效果等同于 :q!。
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如『:! ls /home』

vim 环境的变更

按键 说明
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!

特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。
举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

三、Shell

1. 什么是shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

2. Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

3. 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)

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

4. Shell变量

定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:

your_name="runoob.com"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

变量名的命名须遵循如下规则
1.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
2.中间不能有空格,可以使用下划线 _。
3.不能使用标点符号。
4.不能使用bash里的关键字(可用help命令查看保留关键字)。

4.1 使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

4.2 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.

4.3 删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

实例

#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl以上实例执行将没有任何输出。

4.4 变量类型

运行shell时,会同时存在三种变量:

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

4.5 Shell 字符串

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

单引号

str='this is a string'

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

双引号

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str输出结果为:
Hello, I know you are "runoob"!

双引号的优点:
1.双引号里可以有变量
2.双引号里可以出现转义字符

拼接字符串

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

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

4.6 Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

4.6.1 定义数组

在 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

可以不使用连续的下标,而且下标的范围没有限制。

4.6.2 读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}
4.6.3 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

4.7 Shell 注释

4.7.1 单行注释

以 # 开头的行就是注释,会被解释器忽略。

4.7.2 多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

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

5. Shell传递参数

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

实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comecho "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表示没有错误,其他任何值表明有错误。

6. Shell运算符

6.1 Shell基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bashval=`expr 2 + 2`
echo "两数之和为 : $val"两点注意:1.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
2.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

6.2 Shell算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 ` expr $a * $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [a==a==a==b] 是错误的,必须写成 [ $a == $b ]。

实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.coma=10
b=20val=`expr $a + $b`
echo "a + b : $val"val=`expr $a - $b`
echo "a - b : $val"val=`expr $a \* $b`
echo "a * b : $val"val=`expr $b / $a`
echo "b / a : $val"val=`expr $b % $a`
echo "b % a : $val"if [ $a == $b ]
thenecho "a 等于 b"
fi
if [ $a != $b ]
thenecho "a 不等于 b"
fi

执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

6.3 Shell关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

6.4 Shell布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

6.5 Shell逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

6.6 Shell字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

6.7 Shell文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

运算符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

其他检查符:

-S: 判断某文件是否 socket。
-L: 检测文件是否存在并且是一个符号链接。

7. Shell命令

7.1 Shell echo命令

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:

echo string

1.显示普通字符串:

echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo It is a test

2.显示转义字符

echo "\"It is a test\""结果将是:
"It is a test"
同样,双引号也可以省略

3.显示变量
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name
echo "$name It is a test"
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

4.显示换行:

echo -e "OK! \n" # -e 开启转义
echo "It is a test"
输出结果:OK!It is a test

5.显示不换行:

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
输出结果:OK! It is a test

6.显示结果定向至文件:

echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号):

echo '$name\"'
输出结果:$name\"

8.显示命令执行结果:

echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 '。结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014

7.2 Shell printf命令

printf 命令模仿 C 程序库(library)里的 printf() 程序。

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

printf 命令的语法:

printf  format-string  [arguments...]参数说明:
format-string: 为格式控制字符串
arguments: 为参数列表。

实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comprintf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876执行脚本,输出结果如下所示:
姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99说明:%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

printf 的转义序列

序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符

7.3 Shell test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

实例:

num1=100
num2=100
if test $[num1] -eq $[num2]
thenecho '两个数相等!'
elseecho '两个数不相等!'
fi

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

8. Shell 流程控制

8.1 if else-if else
if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi
8.2 for 循环
for var in item1 item2 ... itemN
docommand1command2...commandN
done

实例:

for loop in 1 2 3 4 5
doecho "The value is: $loop"
done结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
8.3 while 语句
while condition
docommand
done
8.4 until 循环
until condition
docommand
done
8.5 case … esac

case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac

9. Shell 函数

shell中函数的定义格式如下:

9.1 函数定义与使用

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

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comdemoFun(){echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

9.2 函数参数

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

带参数的函数示例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comfunWithParam(){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 !

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

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

10. Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

10.1 输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

实例:

执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):$ who > users

10.2 输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

实例:

我们需要统计 users 文件的行数,执行以下命令:$ wc -l < users

10.3 重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

1.标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
2.标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
3.标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:
$ command 2>file如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2>>file2 表示标准错误文件(stderr)。如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
或者
$ command >> file 2>&1如果希望对 stdin 和 stdout 都重定向,可以这样写
$ command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

10.4 Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

command << delimiterdocument
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:
1.结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
2.开始的delimiter前后的空格会被忽略掉。

实例:
在命令行中通过 wc -l 命令计算 Here Document 的行数:

$ wc -l << EOF欢迎来到菜鸟教程www.runoob.com
EOF
3          # 输出结果为 3 行
$

10.5 /dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。

11. Shell 文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

实例:

创建两个 shell 脚本文件。------------------
test1.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comurl="http://www.runoob.com"------------------test2.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com#使用 . 号来引用test1.sh 文件
. ./test1.sh# 或者使用以下包含文件代码
# source ./test1.shecho "菜鸟教程官网地址:$url"
------------------接下来,我们为 test2.sh 添加可执行权限并执行:
$ chmod +x test2.sh
$ ./test2.sh
菜鸟教程官网地址:http://www.runoob.com注:被包含的文件 test1.sh 不需要可执行权限。

四、Linux磁盘管理

1.Linux 文件系统与磁盘的关系

1.1 磁盘格式

磁盘格式主要有两种:MBR分区表和GPT分区表。
MBR分区表:第一扇区最重要,里面有:主引导记录(Master boot record, MBR)及分区表(partition table),其中MBR占446B,而分区表则占有64B。
GPT分区表:除了分区数量扩充较多之外,支持的磁盘容量也可以超过2TB。

1.2 文件系统

磁盘分区后,需要进行格式化(format),之后操作系统才可以使用这个文件系统。原因:每种操作系统所设置的文件属性/权限不相同,为了存放这些文件所需的数据,因此需要将分区进行格式化,以成为操作系统能够利用的文件系统格式(filesystem)

每个文件(不管是一般文件还是目录文件)都会占有一个inode,文件系统通常会将文件的权限与属性放置到inode中,文件实际的数据放到数据区块中。

超级区块(superblock)会记录整个文件系统的整体信息,包括inode与数据区块总量、使用量、剩余量等。一般来说,超级区块的大小为1024B,一个文件系统应该仅有一个超级区块。

1.3 磁盘与目录的容量

df(英文全称:disk full):列出文件系统的整体磁盘使用量
du(英文全称:disk used):检查磁盘空间使用量

1.4 硬链接与符号链接(软连接)

硬链接:只是在某个目录下新增一条文件名链接到某inode号码的关联记录。因此,不管你使用哪一个文件名来编辑,最终的结果都会写入到相同的inode与区块中,因此均能对数据进行修改。使用硬链接设置链接文件时,磁盘的空间与inode的数量都不会改变。硬链接只是在某个目录下的区块多写入一个关联数据而已,既不会增加inode也不会消耗区块数量。

软连接:新建一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名。

ln [-sf] 源文件  目标文件-s:如果不加任何参数就进行链接,那就是硬链接,至于-s就是软连接
-f: 如果目标文件存在时,就主动的将目标文件直接删除后再建立

1.5 观察磁盘分区状态

lsblk(英文全称:list block device ):列出所有存储设备
blkid:列出设备的UUID等参数

1.6 磁盘分区

fdisk:用于磁盘分区(用于MBR分区表)
gdisk:用于磁盘分区(用于GPT分区表)
partprobe:更新Linux内核的分区表信息

1.7 磁盘格式化(创建文件系统)

mkfs(英文全称:make filesystem ):磁盘分割完毕后自然就是要进行文件系统的格式化

1.8 文件系统挂载与卸载

mount:挂载
umount:卸载

配置/etc/fstab:系统开机自动挂载该文件所有内容。因此可以把想要开机自启动的服务写入到文件中。

autofs服务是一种Linux系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。

1.9 磁盘/文件系统参数自定义

mknod:

2.设置系统启动挂载

系统启动时自动进行挂载,修改etc/fstab

3.内存交换分区创建

mkswap:使用物理分区创建内存交换分区
free:观察内存和swap虚拟内存使用情况
dd:磁盘级的完全复制,无视文件系统

4.磁盘配额(quota)

磁盘配额一般用途:
1.限制某一用户组所能使用的最大磁盘配额
2.限制某一用户所能使用的最大磁盘配额
3.限制某一目录的最大磁盘配额

磁盘配额既然市管理文件系统,所以当然也可以管理inode和block,这两个管理的功能为:
1.限制inode使用量:管理用户可以建立的文件数量
2.限制block使用量:管理用户磁盘容量的限制

5.软件磁盘阵列(redundant arrays of inexpensive disks, RAID)

5.1软件磁盘阵列介绍

RAID0(等量模式,stripe):性能最佳。这种模式的RAID会将磁盘先切出等量的数据块(名为chunk,一般可设置4KB~1MB)。由于每个磁盘会交错地存放数据,因此当你的数据要写入RAID时,数据会被等量地放置在各个磁盘上面。风险:如果某块磁盘损坏了,那么文件数据将缺一块,此时这个文件就损坏了。因此RAID0只要有任何一块磁盘损坏,在RAID上面的所有数据都会遗失而无法读取。

RAID1(镜像模式,mirror):完整备份。这种模式主要是让同一份数据,完整地保存在两块磁盘上面。RAID1最大的有点在数据备份,不过由于磁盘容量有一半用在备份,因此总容量会是全部磁盘容量的一半。虽然RAID1的写入性能不佳,不过读取的性能则可以。这是因为数据有两份在不同的磁盘上,如果多个进程读取同一条数据时,RAID会自动获取最佳的读写速度平衡。

RAID1+0,RAID0+1(镜像模式+等量模式):所谓的RAID1+0就是:(1)先让两块磁盘组成RAID1,并且这样的设置共有两组;(2)将这两组RAID1再组成一组RAID0,这就是RAID1+0。这也是目前存储设备厂商最推荐的方法。

RAID5:性能与数据备份的均衡考虑。RAID5需要三块以上的磁盘才能够组才能这种类型的磁盘阵列,这种磁盘阵列写入的数据有点类似RAID0,不过每个循环的写入过程中(striping),在每块磁盘还会加入一个奇偶校验数据(Parity),并且每次都会记录到不同的磁盘,因此任何一个磁盘损坏时都能够借助其他磁盘的检查码来重建原本磁盘的数据。因此RAID5的总容量会是整体磁盘数量减少一块。

RAID6:使用两块磁盘的容量存储奇偶校验值,因此整体的磁盘容量就会减少两块。但是允许出错的数量就可以达到两块。

5.1硬件RAID,软件RAID

硬件RAID:通过磁盘阵列卡来完成磁盘阵列的功能。磁盘阵列卡上面有一块专门的芯片用于处理RAID的任务,因此在性能上面较好。

软件RAID:通过软件模拟磁盘阵列的任务,因此会损耗较多的系统资源,比如说CPU的运算和I/O总线等。CentOS提供的软件磁盘阵列为mdadm这个软件,这个软件会以分区或disk为单位,也就是说,你不需要两块以上的磁盘,只要有两个以上的硬盘分区(partition)就能够设置你的磁盘阵列了。

6.逻辑卷管理器(Logical Volume Manager, LVM)

6.1 概念

LVM的重点在于可以弹性地调整文件系统的容量,LVM可以整合多个物理分区,让这些分区看起来就像是一个磁盘一样。而且,未来还可以在这个LVM管理的磁盘当中新增或删除其他的物理分区。

LVM的做法是将几个物理的分区(或磁盘)通过软件组合成一块看起来是独立的大磁盘(VG),然后将这个快大磁盘再经过划分成为可使用的分区(LV)。

物理卷(Phisical Volumn,PV):我们实际的分区需要调整系统标识符(system ID)成为8e(LVM的标识符),然后经过pvcreate的命令将它转成LVM最底层的物理卷(PV),之后才能将会这些PV加以利用。调整system ID的方式是通过gdisk。

卷组(Volume Group,VG):所谓的LVM大磁盘就是将许多PV整合成这个VG。

物理扩展块(Physical Extent,PE):LVM默认使用4MB的PE数据块,而LVM的LV在32位系统上最多仅能含有65534个PE(lvm1的格式)。PE是整个LVM最小的储存数据单位,也就是说,我们的文件数据都是借由写入PE来完成的。

逻辑卷(Logical Volume,LV):最终的VG会被切成LV,这个LV就是最后可以被格式化使用的类似分区的东西。

LVM可以弹性地修改文件系统的容量,那是如何办到的呢?其实它就是通过【交换PE】来进行数据转换,将原本LV内的PE转移到其他设备中以降低LV的容量,或将其他设备的PE加到此LV中以加大容量。

6.2 实践流程

gdisk修改system ID -> 创建PV -> 以PV创建VG -> 从VG划分出LV -> mkfs,mount格式化后挂载使用

五、Linux用户和用户组管理

1.Linux系统用户账号的管理

1.1 添加用户

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

新增一个已有的用户账号使用useradd命令,其格式如下:

useradd 选项 用户名参数说明:选项:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。用户名:
指定新账号的登录名。实例1
# useradd –d  /home/sam -m sam
此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。实例2
# useradd -s /bin/sh -g group –G adm,root gem
此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。这里可能新建组:#groupadd group及groupadd adm增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

1.2 删除帐号

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

删除一个已有的用户账号使用userdel命令,其格式如下:

userdel 选项 用户名常用的选项是 -r,它的作用是把用户的主目录一起删除。例如:
# userdel -r sam
此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。目的:删除用户的相关数据,而用户的数据有:
1.用户账号/密码相关参数:/etc/passwd、/etc/shadow
2.用户组相关参数:/etc/group、/etc/gshadow
3.用户个人文件数据:/home/username、/var/spool/mail/username

1.3 修改帐号

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

修改已有用户的信息使用usermod命令,其格式如下:

usermod 选项 用户名常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外,有些系统可以使用选项:-l 新用户名这个选项指定一个新的账号,即将原来的用户名改为新的用户名。例如:
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

1.4 用户口令的管理

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

passwd 选项 用户名
可使用的选项:-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令。例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:$ passwd
Old password:******
New password:*******
Re-enter new password:*******
如果是超级用户,可以用下列形式指定任何用户的口令:# passwd sam
New password:*******
Re-enter new password:*******
普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。为用户指定空口令时,执行下列形式的命令:# passwd -d sam
此命令将用户 sam 的口令删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:# passwd -l sam

1.5 用户密码参数修改

change 选项 账号名
选项与参数:
-l:  列出该账号的详细密码参数;
-d: 后接日期,修改shadow第三栏位(最近一次修改密码的日期),格式 YYYY-MM-DD;
-E: 后接日期,修改shadow第八栏位(账号失效日),格式 YYYY-MM-DD;
-I: 后接日期,修改shadow第七栏位(密码失效日期);
-m:  后接日期,修改shadow第四栏位(密码最短保留日期);
-M:  后接日期,修改shadow第五栏位(密码多久需要进行修改);
-W: 后接日期,修改shadow第六栏位(密码过期前警告日期);

2.Linux一般身份用户功能

一般身份用户常用的账号数据修改与查询命令

2.1 id

id:这个命令可以查询某人或自己的相关UID/GID等信息

2.2 finger

finger:可以查看很多用户相关的信息。大部分在/etc/passwd这个文件里面的信息。

2.3 chfn

chfn:change finger,其实就是修改/etc/passwd的第五个栏位

chfn 选项 账号名
选项与参数:
-f:  后面接完整大名
-o:  您办公室的房间号码
-p:  办公室的电话号码
-h:  家里的电话号码

2.4 chsh

chsh:change shell的简写

chsh 选项
选项与参数:
-l:  列出目前系统上面可用的shell,其实就是/etc/shells的内容
-s:  设置修改自己的shell

3.Linux系统用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

3.1 增加用户组

使用groupadd命令,其格式如下:

groupadd 选项 用户组可以使用的选项有:-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。实例1:
# groupadd group1
此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。实例2:
# groupadd -g 101 group2
此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

3.2 删除一个用户组

使用groupdel命令,其格式如下:

groupdel 用户组例如:
# groupdel group1
此命令从系统中删除组group1。

3.3 修改用户组的属性

使用groupmod命令。其语法如下:

groupmod 选项 用户组
常用的选项有:-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组 将用户组的名字改为新名字实例1:
# groupmod -g 102 group2
此命令将组group2的组标识号修改为102。实例2:
# groupmod –g 10000 -n group3 group2
此命令将组group2的标识号改为10000,组名修改为group3。

3.4 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

$ newgrp root
这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。

3.5 用户组管理员功能

让某个用户组具有一个管理员,这个用户组管理员可以哪些账号可以加入/移出该用户组。

#关于系统管理员(root)的操作
gpasswd groupname
gpasswd [-A username1, ...] [-M username3, ...] groupname
gpasswd [-rR] groupname
选项与参数:
-A:  将groupname的管理权交给后面的使用者管理
-M:  将某些账号加入这个用户组中
-r:  将groupname的密码删除
-R:  让groupname的密码栏失效#关于用户组管理员的操作
gpasswd [-ad] user groupname
-a:  将某位使用者加入到groupname这个用户组当中。
-d:  将某位使用者删除出groupname这个用户组当中。

4.主机详细权限规划:ACL的使用

ACL(Access Control List,访问控制列表):ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用状态非常有用。

它可以针对几个选项:
1.用户(user):可以针对用户来设置权限;
2.用户组(group):针对用户组为对象来设置其权限;
3.默认属性(mask):还可以针对在该目录下建立新文件/目录时,规范新数据的默认权限。

4.1 getfacl、setfacl

setfacl: 设置某个目录/文件的ACL规范。
getfacl: 获取某个文件/目录的ACL设置选项;

setfacl:

setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m:  设置后续的ACL参数给文件使用,不可与-x合用
-x:  删除后续的ACL参数,不可以-m合用
-b:  删除【所有的】ACL设置参数
-k:  删除【默认的】ACL参数
-R:  递归设置ACL,即包括子目录都会被设置起来
-d:  设置【默认ACL参数】,只对目录有效,在该目录新建的数据会引用此默认值

getfacl:

getfacl filename
选项与参数:
几乎与setfacl相同

实例:

//【u:账号:权限】
# touch acl_test
# ll acl_test
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test
# setfacl -m u:vbird:rx acl_test
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test
可以看到权限部分多了个+,且与原本权限(644)看起来差异很大# getfacl acl_test
user::rwx  <===使用者列表栏是空的,代表文件拥有者的权限
user:vbird:r-x  <===针对vbird的权限设置成为rx,与拥有者不同
group::r--  <===针对文件用户组的权限设置仅有r
mask::r-x  <===此文件默认的有效权限(mask)
other::r--  <===其他人拥有的权限//【g:用户组名:权限】
# setfacl -m g:mygroup:rx acl_test
# getfacl acl_test
user::rwx
user:vbird:r-x
group::r--
group:mygroup:r-x
mask::r-x
other::r--//【m:权限】
# setfacl -m m:r acl_test
# getfacl acl_test
user::rwx
user:vbird:r-x
group::r--
group:mygroup:r-x
mask::r--
other::r--

5.用户切换

5.1 su

su [-lm] [-c 命令] [username]
选项与参数:
-:   单纯使用-如【su -】代表使用login-shell的变量文件读取方式来登录系统
-l:  与-类似,但后面需要加欲切换的使用者账号,也是login-shell的方式
-m:  -m与-p是一样的,表示【使用目前的环境设置,而不读取新使用者的配置文件】
-c:  仅进行一次命令,所以-c后面可以加上命令 单纯使用【su】切换成root身份,读取的变量设置方式为非登录shell的方式,这种方式很多原本的变量不会被修改,因此推荐使用【su -】切换成root。

5.1 sudo

sudo可以让你以其他用户的身份执行命令(通常是使用root的身份来执行命令),因此并非所有人都能执行sudo,而是仅有规范到/etc/sudoers内的用户才能够执行sudo这个命令。

除了root之外的其他账号,若想要使用sudo执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers,让该账号能够使用全部或部分的root命令功能。为什么使用visudo?因为/etc/sudoers是设置过语法的,如果设置出错会造成无法使用sudo命令的后果。

6.用户特殊shell和PAM模块

特殊shell:可以进行系统程序的工作,但是无法登录主机获取交互的shell。

PAM(Pluggable Authentication Modules,插入式验证模块):可以说是一套应用程序编程接口(Application Programming Interface,API),它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能够返回用户验证的结果。

7.Linux主机上的用户信息传递

7.1 查询用户:w、who、last、lastlog

w/who:查看目前已登录在系统上的用户
last:查看用户什么时候登录
lastlog:每个账号最近登录的事件,lastlog回去读取/var/log/lastlog文件

7.2 用户对谈:write、mesg、wall

write:与系统其他用户对话
mesg n/y:是否接受其他用户的信息,但无法阻止来自root的信息
wall:对系统上所有用户发送信息

六、Linux计划任务

1. Linux计划任务种类:at、cron

at:是个可以处理仅执行一次就结束的命令,不过需要执行at时,必须要有atd这个服务。
crontab:crontab这个命令所设置的任务会循环一直地执行下去,可循环的事件为分钟、小时、每周、每月或每年等。crontab除了可以使用命令执行外,亦可编辑/etc/crontab来支持,至于让crontab可以生效的服务是crond。

2. 单一执行计划任务:atd

atd的启动与at的运行

systemctl restart atd #重启atd这个服务
systemctl enable atd #让这个服务开机就启动
systemctl status atd #查看一下atd目前的状态

at的运行方式
我们使用at这个命令来产生所要运行的任务,并将这个任务以文本文件的方式写入/var/spool/at目录内,该任务便能等待atd这个服务的使用与执行了。

不过并不是所有用户都可以执行at计划任务,因为很多黑客就是通过计划任务搜集信息并定时发回黑客团体。

我们可以利用/etc/at.allow与/etc/at.deny这两个文件来实现对at的使用限制。

实际运行单一计划任务

at的命令:

at [-mldv] TIME
at -c 任务号码

当我们使用at时会进入一个at shell的环境让用户执行任务命令,此时建议最好使用绝对路径来执行命令,避免出现问题。

取消at:

atq  #查询目前主机上面有多少的at计划任务
atrm (jobnumber) #删除任务

3. 循环执行的计划任务:crond

用户限制
限制使用crontab的用户账号。通过/etc/cron.allow和/etc/deny。

当用户使用crontab这个命令来建立计划任务后,该项任务就会被记录到/var/spool/cron/中,而且是以账号来作为判断根据的。

cron执行的每一项任务都会被记录到/var/log/cron这个日志文件中,所以如果确认是否被木马植入,也可以查看/var/log/cron这个日志文件。

配置文件
cron这个服务的最低检测限制是【分钟】,所以【cron会每分钟去读取一次以下配置的内容】。

cron服务读取配置文件的位置:
1./etc/crontab
2./etc/cron.d/*
3./var/spool/cron/*
跟系统的运行有关系的两个配置是/etc/crontab和/etc/cron.d/*目录内的文件。与用户自己的任务有关系的配置是/var/spool/cron/*里面的文件。

如果你想自己开发新的软件,该软件要拥有自己的crontab定时命令时候,就可以将【分、时、日、月、周、身份、命令】的配置文件放置到/etc/cron.d/目录下。

除了自己指定分、时、日、月、周加上命令路径的crond配置之外,你也可以直接将命令放置到(或链接到)/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly中。

总结
1.个人化的操作使用【crontab -e】
2.系统维护管理使用【vim /etc/crontab】
3.自己开发软件使用【vim /etc/cron.d/newfile】
4.固定每个小时、每日、每周执行的特别任务:如果与系统有关,还是建议放到/etc/crontab中集中管理。如果想要偷懒或一定要在某个周期内执行的任务,也可以放在上面谈到的几个目录中,直接写入命令即可。

anacron
anacron是一个程序并非一个服务,anacron的配置文件在/etc/cron.hourly/0anacron中。因此每小时每执行一次,用于检测相关的计划任务有没有被执行,如果有就被执行。

所以在centOS启动约一小时后系统会有一小段时间的忙碌,而且硬盘会跑个不停,那是因为anacron正在执行过去/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/里面未执行的各项计划任务。

七、Linux进程与服务

1 进程与服务

程序:通常为二进制文件,一般放在物理磁盘中。
进程:程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说进程就是一个正在运行中的程序。
服务:常驻在内存的进程称为服务(daemon)。

2 任务管理

任务管理(job control)是用在bash环境下的,也就是说:当我们登录系统获取bash shell后,在单一终端下同时执行多个任务的操作管理。

执行任务管理的操作中,其实每个任务都是目前bash的子进程,即彼此之间是有相关性的,我们无法用任务管理的方式由tty1的环境去管理tty2的bash。

执行bash的任务管理必须要注意的限制:
1.这些任务所触发的进程必须来自你shell的子进程(只管理自己的bash)。
2.前台:可以控制与执行命令的这个环境称为前台的任务(foreground)。
3.后台:可以自动执行的任务,无法用[ctrl]+c终止它,可以使用bg、fg调用该命令。
3.后台中【执行】的进程不能等待terminal或shell的输入(input)。

2.1 job control的管理

在后台里面的任务状态可以分为【暂停(stop)】与【运行中(running)】。

2.1.1 直接将命令丢到后台中【执行】的&

实例:

# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432  <===[job number] PID

在该命令的最后面加上一个【&】代表将命令丢到后台中,此时bash会给予这个命令一个【任务号码(job number)】,就是那个[1],后面那个14432则是该命令所触发的【PID】。

[1]+ Done           tar -zpcf /tmp/etc.tar.gz /etc

这时候表示任务1完成了。

2.1.2 将【目前】的任务丢到后台中【暂停】:[ctrl]-z

实例:

# vim ~/。bashrc
# 在vim的一般模式下,按下[ctrl]-z组合键
[1]+  Stopped          vim ~/.bashrc

那个+表示最近一个被丢到后台的任务,且是目前后台默认会被使用的那个任务(与fg这个命令有关),而那个Stopped代表目前这个任务的状态。在默认情况下,使用[ctrl]-z丢到后台当中的任务都是【暂停】状态。

2.1.3 查看目前的后台任务状态:jobs
jobs [-lrs]
选项与参数:
-l:  除了列出job number与命令串外,同时列出PID与号码
-r:  仅列出正在后台run的任务
-s:  仅列出正在后台当中暂停的任务

实例:

# jobs -l
[1]- 14566 Stopped          vim ~/.bashrc
[2]+ 14567 Stopped         find / -print

目前有两个任务在后台当中,两个任务都是暂停的,而如果我仅输入fg时,那么那个[2]就会被拿到前台当中来处理。
其实+代表最近被放到后台的任务号码,-代表最近第二个被放置到后台中的任务号码。而第三个以后的任务,就不会有+、-符号存在了。

2.1.4 将后台任务拿到前台处理:fg
fg %jobnumber
2.1.5 让任务在后台下的状态变成运行中:bg
bg %jobnumber
2.1.6 管理后台当中的任务:kill
kill -signal %jobnumber
kill -l

2.2 脱机管理问题

要注意的是,我们在任务管理当中提到的【后台】指的是在终端模式下可以避免[ctrl]-c中断的一个情景,你可以说那个是bash的后台,并不是放到系统的后台中。所以,任务管理的后台依旧与终端有关。如果以远程连接的方式连接到Linux主机,并且以&方式放到后台,在任务尚未结束的情况下脱机了,任务会被中断。

可以使用nohup命令,在脱机或注销系统后,还能够让任务继续执行。

nohup [命令与参数]       <===在终端前台中任务。
nohup [命令与参数]  &    <===在终端后台中任务。

3 进程管理

3.1 查看进程

3.1.1 ps:将某个时间点的进程运行情况截取下来
ps -l 仅查看自己的bash的相关进程
3.1.2 ps aux:查看系统所有进程
ps aux
ps -lA
3.1.3 top:动态查看进程的变化
top [-d 数字] | top [-bnp]
选项与参数:
-d:  后面可以接秒数,就是整个进程界面更新的秒数
-b:  以批量的方式执行top
-n:     与-b搭配,意义是,需要执行几次top的输出结果
-p:  指定某些个PID来执行查看检测
3.1.4 ptree:查看进程相关性
pstree [-A|U] [-up]
选项与参数:
-A:  各进程树之间的连接以ASCII字符来连接
-U:  各进程树之间的连接以Unicode的字符来连接,在某些终端界面下可能会有错误
-p:  并同时列出每个进程的PID
-u: 并同时列出每个进程的所属账号名称

由pstree的输出我们也可以很清楚地知道,所有的进程都是依附在systemd这个进程下面的。这个进程的PID是一号,因为它是Linux内核所主动调用的第一个进程。

4 进程的执行顺序

Linux给予进程一个【优先级(priority,PRI)】,这个PRI值越低代表越优先的意思。不过这个PRI值是由内核动态调整的,用户无法直接调用PRI值。

如果要调整进程的优先级,就要通过nice值,nice值就是ps查看进程时的NI字段。一般来说,PRI与NI的相关性如下:

PRI(new) = PRI(old) + nice

当nice值为负值时,那么该进程就会降低PRI值,即会变得较优先被处理。

nice:新执行的命令即给予新的nice值

nice [-n 数字] command

例如:用root给一个nice值为-5,用于执行vim

nice -n -5 vim &

renice:已存在进程的nice重新调整

renice [number] PID

5 查看系统资源信息

5.1.1 free:查看内存使用情况
free [-b | -k | -m | -g | -h] [-t] [-s N -c N]
选项与参数:
-b:  直接输入free时,显示的单位是KBytes,我们可以使用b(Bytes)、m(MBytes)、K(KBytes)、g(GBytes)来显示单位,也可以直接让系统自己指定单位(-h)。
-t:  在输出最终结果,显示物理内存与swap的总量
-s:  可以让系统不断刷新显示数据,对于系统查看挺有效
-c:  与-s同时处理,让free列出几次的意思
5.1.2 uname:查看系统与内核相关信息
uname [-asrmpi]
5.1.3 uptime:查看系统启动时间与任务负载
uptime
5.1.4 netstat:追踪网络或socket文件
netstat - [atunlp]
5.1.5 dmesg:分析内核产生的信息
dmesg

不管是启动的时候还是系统运行过程中,只要是内核产生的信息,都会被记录在内存的某个保护区域中。dmesg这个命令就能够将该区域的信息读出来。因为信息实在太多了,所以执行时可以加入这个管道命令【dmesg | more】来使界面暂停。

5.1.6 vmstat:检测系统资源变化
vmstat [-a] [延迟 [总计检测次数]]    <===CPU/内存等信息
vmstat [-fs]                        <===内存相关
vmstat [-S 单位]                      <===设置显示数据的单位
vmstat [-d]                         <===与磁盘有关
vmstat [-p 分区]                      <===与磁盘有关

6 特殊文件与进程

6.1 具有SUID/SGID权限的命令执行状态

为啥执行了passwd后你就具有了root的权限呢?这是因为你在触发passwd后,会获得一个新的进程与PID,该PID产生时通过SUID来给予该PID特殊的权限设置。

6.2 /proc/*代表的意义

所谓的进程都是在内存当中,而内存当中的数据又是写入到/proc/*这个目录下。

查看:

ll /proc

目前主机上面的各个进程的PID都以目录的形式存在于/proc当中。

7 查询已使用文件或已执行进程使用的文件

7.1 fuser:借由文件(或文件系统)找出正在使用该文件的进程

fuser [-umv] [-k [i] [-signal]] file/dir

7.2 lsof:列出被进程所使用的文件名称

lsof [-aUu] [+d]

7.3 pidof:找出某个正在执行的进程的PID

pidof [-sx] program_name

八、SELinux

SELinux(Security Enhance Linux,安全强化的Linux):SELinux引入强制访问控制(Mandatory Access Control,MAC)方法,它可以针对特定的进程与特定的文件资源来管理权限。也就是说,即使你是root,那么在使用不同的进程时,你所获取的权限也并不一定是root,而是要根据当时该进程的设置而定。

在强制访问控制的设置下,我们的进程能够活动的空间就变小了。举例来说,WWW服务器软件的进程为httpd这个程序,而默认情况下,httpd仅能在/var/www/这个目录下面读写文件。如果httpd这个进程想要到其他目录去读写数据时,除了规则设置要开放外,目标目录也要设置为httpd可读取的类型(type)才行,限制非常多。

1.SELinux的运行模式

SELinux是通过MAC的方式来管理进程的,它控制的主体是进程,而目标是该进程能否读取的【文件资源】。
主题(Subject):进程
目标(Object):文件系统
策略(Policy):在目前centOS7.x里面仅提供三个主要策略:
1.targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略。
2.minimum:由target自定义而来,仅针对选择的进程来保护。
3.mls:完整的SELinux限制,限制方面比较严格。

除了策略指定之外,主体与目标的安全上下文必须一致才能够顺利读取。

安全上下文是放置在文件的inode内的,因此主体进程想要读取目标资源时,同样需要读取inode,这inode内就可以对比安全上下文以及rwx等权限值是否正确,而给予适当的读取权限依据。

查看文件的SELinux相关信息,举例

# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg

由上所示,安全上下文用冒号分为三个字段,这三个字段的意义为

Identify:role:type
身份识别:角色:类型

2.SELinux的3种模式:启动、关闭、查看

SELinux依据启动与否,共有3种模式,分别如下:
1.Enforcing:强制模式,代表SELinux运行中,且已经正确开始限制domain/type。
2.Permissive:宽容模式,代表SELinux运行中,不过仅会有警告信息并不会实际限制domain/type的读写。
3.Disabled:关闭模式,SELinux并没有实际运行。

2.1 获取当前SELinux模式:getforce

getforce

2.2 获取当前SELinux的策略(Policy):setstatus

sestatus [-vb]

2.3 切换SELinux模式:setenforce

setenforce [0|1]
选项与参数:
0:转成Permissive宽容模式
1:转成Enforcing强制模式

3.SELinux策略内的规则管理

3.1 SELinux各个规则的布尔值查询:getsebool

getsebool [-a] [规则的名称]

3.2 SELinux各个规则规范的主体进程能够读取的文件SELinux类型查询seinfo、sesearch

seinfo [-Atrub]
sesearch [-A] [-s 主体类型] [-t 目标类型] [-b 布尔值]

通过sesearch来找主体进程与文件的SELinux类型关系。

3.3 修改SELinux规则的布尔值:setsebool

setsebool [-P] 【规则名称】 [0|1]

4.SELinux安全上下文的修改

4.1 修改文件的SELinux类型:chcon

chcon [-R] [-t type] [-u user] [-r role] 文件
chcon [-R] --reference=范例文件 文件
选项与参数:-R: 连同目录下的子目录也同时修改。-t:   后面接安全上下文类型的栏位,例如httpd_sys_content_t。
-u:  后面接身份识别,例如system_u。
-r:  后面接角色,如system_r。
-v:  若有变化成功,请将变动的结果列出来。

4.2 让文件回复正确的SELinux类型:restorecon

restorecon [-Rv] 文件或目录

4.3 默认目录的安全上下文查询与修改:semanage

semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项与参数:
fcontext:    主要用于安全上下文方面的用途,-l为查询的意思。
-a:  增加的意思
-m:  修改的意思
-d:  删除的意思

九、认识与分析日志

9.1 CentOS7日志文件简易说明

日志文件权限通常设置为仅有root能够读取。

常见的几个日志文件有下面几个
1./var/log/boot.log:开机启动时候,系统内核会去检测与启动硬件,这个文件存储本次开机的启动信息。
2./var/log/cron:记录定时任务信息。
3./var/log/dmesg:记录系统在开机时内核检测过程所产生的各项信息。
4./var/log/maillog或/var/log/mail/*:记录邮件来往信息。
5./var/log/secure:只要涉及【需要输入账号密码】的软件,那么当登陆时(不管登陆正确或错误)都会被记录在此文件中。
6./var/log/wtmp、/var/log/faillog:记录正确登陆系统者的账号信息(wtmp)与错误登录时所使用的账户信息(faillog)。
7./var/log/httpd/*、/var/log/samba/*:不同网络服务会使用它们自己的日志文件来记录他们自己产生的各项信息。

9.2 rsyslogd

CentOS提供rsyslog.service这个服务来统一管理日志文件。不过要注意如果日志更新太频繁,导致日志文件的容量太大撑爆磁盘,因此我们可以通过logrotate(日志文件轮询)工具来自动化处理日志文件容量与更新问题。

rsyslogd针对各种服务与信息记录在某些文件的配置文件就是/etc/rsyslog.conf,这个文件规定了【(1)什么服务(2)的什么等级(3)需要被记录在哪里(设备或文件)】

日志文件如果不小心手动修改过,例如vim打开日志文件后:wq离开,那么rsyslogd会误判该文件已被修改过,将导致rsyslogd不在写入新内容到该文件,必须重启rsyslogd.service才行。可以考虑用chattr + a 文件名使得文件只能被增加,不能被删除。

9.3 logrotate

logrotate是挂在cron下执行的具体是在/etc/cron.daily/logrotate。
logrotate的配置文件记录【在什么状态下才将日志文件进行轮询】的设置。
1./etc/logrotate.conf
2./etc/logrotate.d/
其中logrotate.conf是主要的参数文件,至于logrotate.d则是一个目录,该目录里面的所有文件都会被主动读入/etc/logrotate.conf当中来使用。

logrotate [-vf] logfile
选项与参数:
-v:  启动显示模式,会显示logrotate运行的过程
-f:  不论是否符合配置文件的数据,强制每个日志文件都进行轮询的操作

9.4 logwatch

CentOS7.x上面默认的的logwatch所提供的分析工具,它会每天分析一次日志文件,并且将数据以email的格式寄送给root。

十、系统基础设置与备份策略

1.系统基本设置

1.1 网络设置:手动设置与DHCP自动获取

手动设置
1.IP
2.子网掩码(netmask)
3.网关(gateway)
4.DNS主机的IP

自动获取(DHCP协议自动获取)
修改主机名

hostnamectl [set-hostname 你的主机名]
1.2 日期与时间设置
timedatectl [command]
选项与参数:
list-timezones:列出系统上所有支持的时区名称
set-timezone:设置时区位置
set-time:设置时间
set-ntp:设置网络校时系统

手动网络校时:

ntpdate
1.3 语系设置
localectl

2.服务器硬件数据收集

2.1 查看硬件设备:dmidecode
dmidecode -t type
选项与参数:
1:详细的系统信息,含主板的型号与硬件的基础信息
4:CPU的相关信息,包括倍频、外频、内核数、内核线程等
9:系统的相关插槽格式,包括PCI、PCI-E等的插槽规格说明
2.2 硬件资源的收集与分析:gdisk,dmesg,vmstat,lspci,lsusb,iostat

系统硬件由操作系统内核管理。Linux内核在启动时就能够检测主机硬件并加载适当的模块来驱动硬件。而内核所检测到的各项硬件设备,后来都会被记录在/proc与/sys当中,包括/proc/cpuinfo、/proc/partition、/proc/interrupts等。

除了直接调出/proc下面的文件内容之外,其实Linux由提供几个简单的命令来将内核所检测到的硬件显示出来,常见的命令下面这些:
gdisk
dmesg
vmstat
lspci:列出整个PC系统的PCI接口设备。
lsusb:列出目前系统上面各个USB端口的状态,与连接的USB设备。
iostat:与vmstat类似,可实时列出整个CPU与接口设备的输入/输出状态。

2.3 了解磁盘的健康状态

smartd服务。SMART其实是【Self-Monitoring,Analysis and Reporting Technology System】的缩写,主要用来检测目前常见的ATA与SCSI接口的磁盘,只是,要被检测的磁盘也必须支持SMART协议才行。smartd提供一个命令名为smartctl。

3.备份要点

3.1 哪些Linux数据具有备份的意义

一类是系统基本设置信息,一类是类似网络服务的内容数据。
/etc 整个目录
/home/ 整个目录
/var/spool/mail/
/var/spoll/{at|cron}/
/boot/
/root/
/var/lib
/var/www或/srv/www整个目录
/var/lib/mysql整个目录

3.2 备份的种类、频率与工具的选择

备份种类
1.累计备份
2.差异备份

3.2.1 累计备份

累计备份:系统进行完一次完整备份后,经过一段时间的运行,比较系统与备份文件之间的差异,仅备份有差异的文件。而第二次累积备份则与第一次累积备份的数据比较,也是仅备份有差异的数据而已。

完整备份常用的工具:dd、cpio、xfsdump/xfsrestore等。

实例:

#用dd将/dev/sda备份到完全一摸一样的/dev/sdb硬盘中。
#由于dd是直接读取磁盘扇区,所以/dev/sdb这块磁盘可以不必格式化九完成和/dev/sda一样,非常方便
dd if=/devsda of=/dev/sdb#使用cpio来备份与还原整个系统,假设存储媒介为SATA磁带机
find / -print | cpio -covB > /dev/st0   <===备份到磁带机
cpio -iduv < /dev/st0    <===还原
3.2.2 差异备份

差异备份:每次的备份都是与原始的完整备份比较的结果。所以系统运行得越久,离完整备份时间越长,那么该次的差异备份数据可能会越大。

差异备份常用的工具与累积备份差不多。

此外,可以通过rsync进行镜像备份,这个rsync可以对两个目录进行镜像(mirror)

rsync -av 来源目录 目标目录
3.2.3 远程备份

如果管理两台以上的Linux主机时,互相将对方的重要数据保存一份在自己的系统中,通过rsync搭配sshd。

十一、软件安装:源代码与Tarball

file命令:查看文件,如果是二进制而且是可执行的,它就会显示执行文件类别,同时会说明是否使用动态函数库(shared libs),而如果是一般的脚本,它就会显示出text executables之类的字样。

程序代码文件其实就是一般的纯文本文件。要将这个文件【编译】成为操作系统看得懂的二进制程序。需要【编译器】来操作,经过编译器的【编译与链接】之后,就会产生一个可以执行的二进制程序。

1. 什么是make与configure

使用类似gcc的编译器来进行编译的过程并不简单,因为一个软件并不会仅有一个程序文件,而是有一堆程序代码文件。可以使用make这个命令的相关功能来进行编译过程的简化。

当使用make时,make会在当前的目录下查找Makefile(or makefile)这个文本文件,而Makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是否经过变动了,而自动更新执行文件。

通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能(因为不同版本的内核所使用的系统调用可能不同,而且每个软件所需要以来的函数库也不相同。所以同一软件在不同的平台上执行时,必须要重新编译),该检测程序检测完毕后,就会主动地建立这个Makefile的规则文件,通常这个检测程序的文件名为configure或config。

因此,下载源码后,先执行configure建立Makefile文件,然后make进行编译。

2.Tarball安装的基本步骤

Tarball是以tar这个命令打包与压缩的文件。

安装Tarball的步骤
1.获得原始文件:将tarball文件在/usr/local/src目录下解压缩
2.获取步骤流程:进入新建立的目录下面,去查看INSTALL与README等相关文件内容
3.依赖属性软件安装:根据INSTALL/README的内容查看并安装好一些依赖的软件
4.建立makefile:使用configure(或config)检测操作系统,并生成makefile这个文件
5.编译:用make这个程序,并使用该目录下的makefile作为它的参数配置文件,来进行make(编译或其他)的操作
6.安装:以make这个程序,并makefile这个参数配置文件,根据install这个目标(target)的指定来安装到正确的路径。

makefile制作出来后,里面会有相当多的目标(target),最常见的就是install与clean,通常【make clean】代表着将目标文件清除掉,【make】则是将源代码进行编译而已。注意,编译完成的可执行文件与相关的配置文件还在源代码所在的目录当中。因此,最后进行【make install】来将编译完成的所有东西都安装到正确的路径中,这样就可以使用该软件。

一般Tarball软件安装的建议事项
1.最好将Tarball的原始数据解压缩到/usr/local/src当中。
2.安装时,最好安装到/usr/local这个默认路径下
3.考虑未来的反安装步骤,最好可以将每个软件单独安装在/usr/local下面
4.为安装到单独目录的软件的man page加入man path查找

3.利用patch更新源代码

新旧版本之间的文件之间,其实只是修改了一些程序代码而已。那么我们当然可以通过diff对比出新旧版本之间的文字差异,然后再以相关的命令来将旧版的文件更新吗?当然可以,就是以patch这个命令。很多软件开发商在更新了源代码之后,几乎都会发布所谓的patch文件,也就是直接将源代码update的一个方式。

更新步骤
1.查看patch文件内容
2.patch -p 数字 < patch file
3.patch的功能主要是更新了源代码而已,因此还需要将软件编译才能使用

4.函数库管理

很多软件之间都会互相使用彼此提供的函数库来使用其特殊的功能。如C语言的stdio.h头文件在usr/include/stdio.h中,Linux默认将函数库放置在/lib与/lib64当中。函数库又依照是否被编译到程序内部而分为动态与静态函数库。

4.1 静态函数库特色

1.扩展名:通常为libxxx.a
2.编译操作:在编译时会直接整合到执行程序中。
3.独立执行的状态:编译成功的可执行文件可以独立运行,不需要向外部要求读取函数库的内容。
4.升级难:若函数库升级时,整个执行文件必须要重新编译才能将新版的函数库整合到程序当中。

4.2 动态函数库特色

1.扩展名:通常为libxxx.so
2.编译操作:动态函数库在编译时,在程序里面仅有一个【指针(Pointer)】的位置而已。也就是说,动态函数库的内容并没有被整合到执行文件当中,而是当执行文件要使用到函数库的功能时,程序才会去读取函数库来使用。
3.独立执行的状态:不能独立执行。可执行文件里仅有【指针】,亦即当要使用该动态函数库时,程序会主动去某个路径下读取,所以动态函数库不能随意移动或删除,否则会影响很多依赖的程序软件。
4.升级难度:容易。目前Linux发行版比较倾向使用动态函数库,因为Linux系统里面的软件依赖性太复杂了,如果使用太多静态函数库,那么升级某一个函数库时,就会对整个系统造成很大的冲击,因为其他依赖的执行文件也要同时重新编译。绝大多数函数库在/lib和/lib64目录中,内核函数库在/lib/modules里面。

4.3 把动态函数库从硬盘加载到内存缓存:ldconfig与/etc/ld.so.conf

Linux大多是将函数库做成动态函数库,有没有办法增强函数库的读取性能?我们知道内存的访问速度时硬盘的好几倍,所以,如果我们将常用到的动态函数库先加载到内存当中(缓存,cache),如此一来,当软件要使用动态函数库时,就不需要从头由硬盘里面读出。这时就需要ldconfig和/etc/ld.so.conf的协助了。

将动态函数库加载到高速缓存
1.在/etc/ld.so.conf写入【想要读入高速缓存当中的动态函数库所在的目录】,注意,是目录而不是文件。
2.接下来利用ldconfig这个执行文件将/etc/ld.so.conf的数据读入缓存中。
3.同时也将数据记录一份至/etc/ld.so.cache这个文件当中。

ldconfig [-f conf] [-C cache]
ldconfig [-p]

4.4 程序的动态函数库解析:ldd

如何判断某个可执行的二进制文件含有什么动态函数库?利用ldd就可以了。

ldd [-vdr] [filename]

4.5 校验软件正确性:MD5sum、sha1sum、sha256sum

目前有多种算法可以计算文件的校验值,我们选择使用较为广泛的MD5、SHA-1、SHA-256加密算法来处理。

应用:创建保存重要文件的校验值文件,下面是建议的重要文件列表:
/etc/passwd
/etc/shadow
/etc/group
/usr/bin/passwd
/sbin/rpcbind
/bin/login
/bin/ls
/bin/ps
/bin/ps
/bin/top
这几个文件最容易被修改,因为很多木马程序执行时,还是会有【PID】,为了怕被root查出来,所以他们都会修改这些检查调度的文件,如果你可以替这些文件建立校验数据库(就是使用MD5sum检查一次,将该文件校验值记录下来,然后常常以shell脚本方式由程序自行来检查校验表是否不同),那么对于文件系统会比较安全。

十二、软件安装:RPM、SRPM、YUM

Linux开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好,然后将这个软件的所有相关文件打包称为一个特殊格式的文件,在这个软件安装文件内还包括了预先检测系统与依赖软件的脚本,并提供记录该软件提供的所有文件信息等,最终将这个软件安装文件发布。

目前在Linux界软件安装方式最常见的有两种,分别是:
1.dpkg:Ubuntu使用
2.RPM:centos、fedora使用

1.什么是RPM与SRPM

RPM(RedHat Package Manager):是以一种数据库记录的方式将你所需要的软件安装到你的Linux系统的一套软件管理机制。它的最大特点是将你要安装的软件先编译过,并且打包称为RPM机制的文件,通过打包好的软件里面默认的数据库,记录这个软件要安装的时候必须具备的依赖属性软件。

优点:
1.由于已经编译完成并且打包完毕,所以软件传输与安装上很方便
2.由于软件的信息都已经记录在Linux主机的数据库上,很方便查询、升级与反安装

缺点:
由于里面的数据已经【编译完成】,所以,该软件安装文件几乎只能安装在默认的硬件与操作系统版本中。通常不同Linux发行版所发布的RPM文件,并不能用在其他的Linux发行版上。

SRPM:Source RPM的意思,也就是这个RPM文件里面含有源代码。特别注意,这个SRPM所提供的软件内容【并没有经过编译】,它提供的是源代码。通常SRPM的扩展名是***.src.rpm这种格式。不过,既然SRPM提供的是源代码,为什么不使用Tarball直接来安装?这是因为SRPM虽然内容是源代码,但是它也提供了参数配置文件(就是configure和makefile)。所以我们下载的是SRPM,那么要安装该软件时,必须:
1.先将软件以RPM管理的方式编译,此时SRPM会被编译称为RPM文件。
2.然后将编译完成的RPM文件安装到Linux系统中。

2.RPM属性依赖的解决方式:YUM在线升级

当客户端由升级、安装的需求时,YUM会向软件源要求更新软件列表,等到软件列表更新到本机的/var/cache/yum之后,然后更新时就会用这个本机软件源列表与本机的RPM数据库进行比较,这样就知道该下载什么软件。接下来YUM会跑到软件源服务器(YUM server)下载所需要的软件(因为有记录软件所在的地址),然后再通过RPM的机制开始安装软件。

3.RPM软件管理程序:rpm

一般来说,在安装RPM类型的文件时,会先去读取文件内记录的设置参数内容,然后将该数据用来对比Linux系统的环境,以找出是否由属性以来的软件尚未安装的问题。安装完毕后,该软件相关的信息就会被写入/var/lib/rpm目录下的数据库文件中。版本之间的比较就是来自于这个数据库,查询系统已安装的软件,也是从这里查询的。

3.1 RPM安装(install)

rpm -ivh package_name

3.2 RPM升级与更新(upgrade/freshen)

rpm -Uvh|-Fvh package_name

3.3 RPM查询(query)

rpm -qa

3.4 RPM验证与数字签名(Vertify/signature)

作用方式是【使用/var/lib/rpm】下面的数据库内容对比目前Linux系统的环境下的所有安装文件。

#列出目前系统上所有可能被修改过的文件。
rpm-Va

3.5 RPM反安装与重建数据库(erase/rebuilddb)

反安装就是将软件卸载,注意【卸载安装的过程一定要由最上层往下解除】

反安装

rpm-e 软件名称

由于RPM文件常常安装、删除、升级等,某些操作可能导致RPM数据库/var/lib/rpm/内的文件损坏,这时需要重建一下数据库。

重建数据库

rpm--rebuilddb

4.YUM在线升级功能

由于Linux发行版必须要先发布软件,然后将软件放置于YUM服务器上面,以提供客户端来安装与升级。CentOS在发布软件时已经制作出多个镜像站(mirror site)提供全世界的软件更新之用。

4.1 YUM查询

#列出YUM服务器上面提供的所有软件名称
yum list
#列出以pam开头的软件
yun list pam*
#列出目前服务器上可供本机进行升级的软件有哪些
yum list updates

4.2 YUM安装/升级

yum [install|update] 软件

4.2 YUM删除

yum remove 软件

4.3 YUM的配置文件

yum镜像地址所在文件:/etc/yum.repos.d/CentOS-Base.repo

5.管理的抉择:RPM还是Tarball

优先选原厂的RPM功能,某些特殊用途的软件不制作提供RPM文件,所以只能用Tarball安装。

6.基础服务安装示例

WWW网站服务器需要有WWW服务器软件+网页程序语言+数据库系统+程序语言与数据库的连接软件等,在CentOS上面,我们需要的软件有【httpd+php+mariadb-server+php-mysql】。

流程
1.安装:yum install (你的软件)
2.启动:systemctl start (你的软件)
3.开机启动:systemctl enable (你的软件)
4.防火墙:firewall-cmd --add-service="(你的服务)"; firewall-cmd --permanent --add-service=”(你的服务)“;
5.测试:用软件去查看你的服务正常与否

7.SRPM的使用:rpmbuild

编辑与打包

rpmbuild --rebuild

编辑、打包、并且安装

rpmbuild --recompile

SRPM的编译命令

rpmbuild -ba 文件名     <===编译并同时产生RPM与SRPM文件
rpmbuild -bb 文件名        <===仅编译成RPM文件

【Linux】Linux知识点汇总相关推荐

  1. linux的文件link占用空间的差别,Linux重要知识点汇总——磁盘与文件系统管理

    EXT2文件系统: 文件系统特性: 格式化(format):每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,以成为操作系统能够你用的文件系统格式 通常我 ...

  2. linux高可用小知识点汇总-行云管家

    不少运维小伙伴对于linux高可用相关知识不是很了解,今天我们小编就给大家汇总了一些,希望可以加深大家的了解.仅供参考哦! linux高可用小知识点汇总-行云管家 一.Linux是什么系统? [回答] ...

  3. Linux运维工程师面试知识点汇总(一)

    Linux运维工程师面试知识点汇总(一) 一.Linux命令知识点 1.查看/var/log/下的文件数 2.shell下随机密码生成(32位) 3.随机生成8位密码(大小写和数字混合) 4.随机生成 ...

  4. Linux知识点汇总二(NK)

    目录 42. Linux进程间的通信方式有哪些 43. Linux线程间的通信方式有哪些 44. Windows进程间的通信方式有哪些 45. Windows线程间的通信方式有哪些 46. 可以查看某 ...

  5. linux常用命令汇总

    linux常用命令汇总,以便需要时快速查询 中文释义 相应命令 备注 在文件中查找 grep error catalina.out 在catalina.out文件中查找error信息 重启nginx ...

  6. Linux视频教程系列汇总

    Linux视频教程系列汇总 该系列视频涉及Linux学习的方方面面,入门的.高级的.编程的.安全的,都有了,每一套都很完整. 由于文件比较大,全部使用FTP发布的,建议使用能重复连接的下载工具(如迅雷 ...

  7. 八大主流Linux桌面环境特性汇总报告

    八大主流Linux桌面环境特性汇总报告 分类: 业界观察 评论:0     来源:Be Geek Unity是由Ubuntu系统的开发公司Canonical所开发的,用于它们的旗舰发行版.它运行在Gn ...

  8. Linux常见命令汇总(不定期更新)

    Linux常见命令汇总 文件及目录相关命令 命令名称 释义 ls 查看目录下的内容 cd 目录跳转 pwd 打印工作目录 cp 拷贝 mv 移动文件及目录 rm 删除文件及目录 mkdir 创建目录 ...

  9. 史上最全的Linux常用命令汇总①收藏这一篇就够了!(超全,超详细)

    史上最全的Linux常用命令汇总①(超全面!超详细!)收藏这一篇就够了! Linux命令基础 Shell Linux命令分类 Linux命令行的格式 编辑Linux命令行的辅助操作 获取命令帮助的方法 ...

最新文章

  1. 对话BAT数据分析专家:数据分析比你想象的更强大
  2. 架构师之路 — API 经济 — RESTful API
  3. Altium Designer圆形、椭圆形铺铜
  4. 捉虫记 NullPointerException
  5. 数据库知识点2——关系模型之基本概念
  6. mysql snmp agent_WebNMS SNMP Micro Agent for MySQL - MySQL Management Console
  7. 搭建认证服务器 - Spring Security Oauth2.0 集成 Jwt 之 【授权码认证流程】 总结
  8. css动画(transition/transform/animation)
  9. 【渝粤教育】国家开放大学2018年春季 7407-21T药物治疗学(本) 参考试题
  10. Codeforces 923 B. Producing Snow
  11. Go中对两个 nil 进行比较的结果是什么?
  12. Python (schedule库)简单使用
  13. 解决npm npm does not support Node.js
  14. 微软官方在线培训课程汇总2011版
  15. 侠客工具盒 v5.0 build 0313 bt
  16. 2009年10月 档案_39健康博客_benwen520dan
  17. 二项式定理与多变量函数的泰勒展开_拔剑-浆糊的传说_新浪博客
  18. idea 查看源码 /* compiled code*/
  19. 《安富莱嵌入式周报》第280期:支持在线仿真编程的网页版电子开发,CAN总线防攻击实现,BigFAT 规范打破了 FAT 每个文件 4GB 的限制
  20. <STM32学习>--跑马灯实验

热门文章

  1. 最大网络流算法之dinic算法
  2. 去哪儿的用户画像构建策略及应用实践
  3. 计算机注销命令,电脑的注销命令是什么?
  4. 微信迎来最新改版,做这几款微信插件提高用户体验!
  5. 传智播客成都中心“基础加强班”优惠活动最后一期,立马围观。
  6. JavaCV开发详解之36:使用delogo滤镜实现去除和屏蔽视频水印
  7. 大创项目日志(1) 基于Python的语言特征提取
  8. wikioi 1550 不明飞行物
  9. !! MACD战法总结
  10. MADDPG论文中文翻译