#### 第13章:
### Linux
Linux是从Unix演变而来的操作系统,由于其优秀的性能和设计,适合做服务器的操作系统。Linux 系统的基础是内核、C库、工具集和系统的基本工具。
`操作系统`是指在整个系统中负责完成最基本功能和系统管理的那些部分。这些部分包括内核、设备驱动器、启动引导程序、命令行shell或者其他种类的用户界面、基本的文件管理工具和系统工具。`系统`包含了操作系统和运行在它之上的应用程序。
#### 13.1 内核
用户界面是操作系统的外在表象,内核才是操作系统的内在核心。系统其他部分必须依靠内核这部分软件提供的服务,像`管理硬件设备`,`分配系统资源`等。内核有时候称为`管理者`、或者是`操作系统核心`。
内核通常由负责中断的`中断服务程序`,负责管理多个进程从而分享处理器时间的`调度程序`,负责管理进程地址空间的`内存管理程序`,`网络、进程间通信`等系统服务程序共同组成。 对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和受保护的内存空间,统称为`内核空间`。相对的,应用程序在`用户空间`执行,它们只能看到允许它们使用的部分系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能直接访问内核划给别人的内存范围。
在系统中运行的应用程序通过系统调用来与内核通信。应用程序通常调用库函数(比如C库函数)再由库函数通过系统调用界面,让内核完成各种不同任务。
当一个应用程序被称为通过系统调用在`内核空间运行`,而内核被称为运行于`进程上下文中`。这种交互关系------应用程序通过系统调用界面陷入内核------是应用程完成其工作的基本行为方式。
内核还要负责管理系统的硬件设备。现有的几乎所有的体系结构,包括Linux支持的体系结构,都提供了中断机制。当硬件设备想和系统通信的时候,它首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。中断通常对应一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。举个例子:当你敲击键盘的时候,键盘控制器发送一个中断信号告知系统,键盘缓冲区有数据到来。内核注意到这个中断对应的中断号,调用相应的中断服务程序。该服务程序处理键盘数据后通知键盘控制器可以继续输入数据了。为了保证同步,内核可以停止中断---既可以停止所有的中断也可以有选择地停止某个中断号对应的中断。
:-: ![](https://img.kancloud.cn/dd/f5/ddf5ea82adf084ac11e81268c64f0c18_500x470.png)
应用程序、内核、硬件关系
每个处理器在任何指定时间点上的活动必然概括为下列三者之一:
1. 运行于用户空间,执行用户进程。
2. 运行于内核空间,处于进程上下文,代表某个特定的进程执行。
3. 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
##### 单内核与微内核设计之比较
`单内核`就是把它从整体上作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。因此,这样的内核通常以单个静态二进制文件的形式存放于磁盘中。所有内核服务都在这样的一个大内核地址空间上运行。
`微内核`并不作为一个单独的大过程来实现。微内核的功能被划分为多个独立的过程。每个过程都叫做一个服务器。理想情况下,只有强烈要求特权服务的服务器才运行在特权模式下,其他服务器都运行在用户空间。
Linux内核与传统Unix内核之间存在一些限制的差异:
1. Linux支持动态加载内核模块。尽管Linux内核也是单内核,可是允许在需要的时候动态地卸除核加载部分内核代码。
2. Linux支持对称多处理机制,尽管许多Unix地变体也支持,但传统的Unix并不支持这种机制。
3. Linux内核可以抢占。与传统的Unix变体不同,Linux内核具有允许在内核运行的任务优先执行的能力。
4. Linux对线程支持的实现比较有意思:内核并不区分线程和其他的一般进程。对于内核来说,所有的进程都一样-------只不过是其中的一些共享资源而已。
5. Linux忽略一些被认为是设计得很拙劣的Unix特性,像STREAMS,还忽略了那些难以实现的过时标准。
6. Linux体现了自由这个词的精髓。
#### 13.2 Linux 进程启停
##### CentOS
CentOS系统是RHEL系统二次编译后的一种Linux系统。
##### RPM(红帽软件包管理器)
RPM机制会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系。
##### Yum软件仓库
尽管RPM能够帮助用户查询软件相关的依赖关系,但问题还是要运维人员自己解决,而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件会是非常痛苦的。Yum软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum软件仓库可以根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包安装到系统。
Yum软件仓库中的RPM软件包可以是由红帽管方发布的,也可以是第三方发布的,当然也可以是自己编写的。
~~~
yum repolist all 列出所有仓库
yum list all 列出仓库中所有的软件包
yum info 软件包名称 查看软件包信息
yum install 软件包名称 安装软件包
yum reinstall 软件包名称 重新安装软件包
yum update 软件包名称 升级软件包
yum remove 软件包名称 移除软件包
yum clean all 清除所有仓库缓存
yum check-update 检查可更新的软件包
yum groupinstall 软件包组 安装指定的软件包组
yum groupremove 软件包组 移除指定的软件包组
yum groupinfo 软件包组 查询指定的软件包组信息
~~~
##### systemd 初始化进程
RHEL7系统选择systemd初始化进程服务已经是一个既定事实,因此也没有了“运行级别”这个概念,Linux系统在启动时要进行大量的初始化工作,比如挂在文件系统和交换分区、启动各类进程服务等,这些都可以看作是一个一个的单元,systemd用目标(target)代替了System V init 中运行级别的概念。
RHEL7系统中是使用systemctl命令来管理服务器的。
~~~
systemctl start foo.service 启动服务
systemctl restart foo.service 重启服务
systemctl stop foo.service 停止服务
systemctl reload foo.service 重新加载配置文件(不终止服务)
systemctl status foo.service 查看服务状态
~~~
systemctl 设置开机启动、不启动、查看各级别下服务启动状态等常用命令
~~~
systemctl enable foo.service 开机自动启动
systemctl disable foo.service 开机不自动启动
systemctl is-enabled foo.service 查看特定服务是否为开机自动东启动
systemctl list-unit-files --type=service 查看各个级别下服务的启动与禁用状况
~~~
将某程序设为服务,例如Nexus.service
进入 /usr/lib/systemd/system, 新建nexus.service文件,写入如下内容:
~~~
[Unit]
Description=Nexus
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_144"
ExecStart=/usr/local/nexus/nexus-3.7.1-02/bin/nexus start
ExecStop=/usr/local/nexus/nexus-3.7.1-02/bin/nexus stop
[Install]
~~~
保存退出,
输入
~~~
systemctl reload *.service #重新加载服务配置文件
~~~
然后就可以启动服务了,
~~~
systemctl start nexus.service
~~~
设置为开机服务
~~~
systemctl enable nexus.service
~~~
#### 13.3 Linux 常用命令
#### 13.3.1 基础命令
##### echo 命令
echo 命令用于在终端输出字符串或变量提取后的值,格式为"echo \[字符串|$变量\]"。
~~~
[root@qidian ~]# echo qidian.com
~~~
终端屏幕会输出
~~~
qidian.com
~~~
用$变量的方式提取变量SHELL的值,并输出到屏幕上:
~~~
[root@qidian.com]# echo $SHELL
/bin/bash
~~~
##### date 命令
date命令用于显示及设置系统的时间或日期,格式为"date \[选项\] \[指定格式\]"
~~~
[root@qidian ~]# date
Mon Aug 24 16:11:23 CST 2017
~~~
按照“年-月-日 小时:分:秒” 的格式查看当前系统的date命令
~~~
[root@qidian ~]# date "+%Y-%m-%d %H:%M:%S"
2017-08-24 16:29:31
~~~
将系统的当前时间设置为2017年9月1日9点20分的date命令
~~~
[root@qidian ~]# date -s "20170901 9:20:00"
Fri Sep 1 CST 09:20:00 2017
~~~
date可以直接查看当前时间
~~~
[root@qidian ~]# date
Fri Sep 1 08:30:01
~~~
date命令中的参数%j可以来查看今天是当年中的第几天
~~~
[root@qidian ~]# date "+j%"
244
~~~
##### reboot 命令
reboot用于重启系统,只能root管理员可以使用。
~~~
[root@qidian ~]# reboot
~~~
##### poweroff 命令
poweroff用于关闭系统,只能管理员可以使用。
~~~
[root@qidian ~]# poweroff
~~~
##### wget 命令
wget命令用于在终端中下载网络文件,格式为"wget\[参数\] 下载地址 ",如果没有wget命令,需要先通过Yum仓库下载wgetRPM软件。
wget 参数
~~~
-b 后台下载
-P 下载到指定目录
-t 最大尝试次数
-c 断点续传
-p 下载页面内所有资源,包括图片、视频等
-r 递归下载
~~~
#### 13.3.2 进程命令
##### ps 命令
ps 命令用于查看系统中的进程状态,格式为"ps \[参数\]"。
~~~
-a 显示所有进程(包括其他用户的进程)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程进程
~~~
Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死、停止。
1. **R(运行)**:进程正在运行或在运行队列中等待。
2. **S(中断)**:进程处于休眠种,当某个条件形成后或者接收到信号时,则脱离该状态。
3. **D(不可中断)**:进程不响应系统异步信号,即使用kill命令也不能将其中断。
4. **Z(僵死)**:进程已终止,但进程描述符依然存在,直到父进程调用writ4()系统函数后将进程释放。
5. **T(停止)**:进程收到停止信号后停止运行。
ps aux 命令输出
~~~
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4772 564 ? S Sep22 0:03 init [3]
root 2 0.0 0.0 0 0 ? S Sep22 0:03 [migration/0]
root 3 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S Sep22 0:02 [migration/1]
root 5 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/1]
root 6 0.0 0.0 0 0 ? Ss+ Sep22 0:02 [migration/2]
root 7 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/2]
root 8 0.0 0.0 0 0 ? S Sep22 0:00 [migration/3]
root 9 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/3]
root 10 0.0 0.0 0 0 ? S< Sep22 0:00 [migration/4]
~~~
USER 用户
PID 进程id
%CPU 运算器占用率
%MEM 内存占用率
VSZ 虚拟内存使用量(单位KB)
RSS 占用的固定内存量(单位KB)
TTY 所在终端
STAT 进程状态
START 被启动的时间
TIME 实际使用CPU的时间
COMMAND 命令名称与参数(运行的程序)
##### top 命令
top命令用于动态地监视进程活动与系统负载等信息。top能动态查看到系统运维状态。
![](https://img-blog.csdn.net/2018080815173689?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lqY2xzeA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
top命令执行结果的前5行为系统整体的统计信息。
第1行:系统时间、运行时间、终端登录数、系统负载(三个数字分别是1分钟、5分钟、15分钟的平均值,数字越小负载越低)
第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。
第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
##### pidof 命令
pidof 命令用于查询某个指定服务进程的PID值,格式“pidof\[参数\]\[服务名称\] ”。
~~~
[root@qidian ~]# pidof sshd
2156
~~~
##### kill 命令
kill 命令用于终止某个指定PID的服务进程,格式"kill \[参数\] \[服务名称 \]"
~~~
[root@qidian ~]# kill 2156
~~~
杀死pid 为2156 的sshd进程
##### killall 命令
killall命令用于终止某指定名称的服务所对应的全部进程。格式"killall \[参数\] \[进程名称\]"。
通俗地讲,复杂软件的服务程序会有多个进程协同为用户提供服务,如果逐个去结束这些进程会比较麻烦,可以使用killall命令来批量结束某个服务程序带有的全部进程。
~~~
[root@qidian ~]# pidof httpd
13581 13580 13579 13578 13577 13576
[root@qidian ~]# killall httpd
[root@qidian ~]# pidof httpd
[root@qidian ~]#
~~~
##### ifconfig 命令
ifconfig 命令用于获取网卡配置与网络状态等信息。
:-: ![](https://img.kancloud.cn/70/46/70468153cd995c5933eccf59a3d590e1_515x278.png)
##### uname 命令
uname 命令用于查看系统内核与系统版本等信息。
:-: ![](https://img.kancloud.cn/0c/7d/0c7daa8c3e9e57e930f7b53c2ac141c0_801x31.png)
##### uptime 命令
uptime 命令用于查看系统的负载信息。它可以显示当前系统的时间、系统已运行的时间、启用终端数量以及平均负载值等信息。
:-: ![](https://img.kancloud.cn/ef/18/ef188fbf09a2deb844122dfec343a1ca_493x30.png)
##### free 命令
free 命令用于显示当前系统中内存的使用量信息。
~~~
[root@qidian ~]# free -h
~~~
:-: ![](https://img.kancloud.cn/fe/f1/fef1b885749c991c9941ab7968b99764_902x101.png)
total 内存总量
used 已用量
free 可用量
shared 进程共享的内存量
buffers 磁盘缓存的内存量
cached 缓存的内存量
##### who 命令
who 用于查看当前登入主机的用户端信息。
##### last 命令
last 命令用于查看所有系统的登录信息。
##### history 命令
history命令用于显示历史执行过的命令。
~~~
[root@qidian ~]# history
1 cat .bash_history
2 echo "" > .bash_history
3 ls
4 man ls
5 date
6 logout
7 history
~~~
如果像快速使用过去使用过的命令。
~~~
[root@qidian ~]# !5
~~~
这样就会执行上面个的date命令。
##### sosreport 命令
sosreport命令用于收集系统配置及架构信息并输出诊断文档。
#### 13.3.3 文件目录控制命令
##### pwd 命令
pwd命令用于显示用户当前所处的工作目录。
~~~
[root@qidian ~]# pwd
/etc
~~~
##### cd 命令
cd 命令用于切换工作路径,格式为"cd \[目录\]"。
~~~
[root@qidian ~]# cd /etc
[root@qidian etc]# cd /bin
[root@qidian bin]# cd - //这是切到上一次的目录
[root@qidian etc]#
[root@qidian etc]# cd ~ //这是切到家目录
[root@qidian ~]#
~~~
##### ls 命令
ls 命令用于显示沐目录中的文件信息,格式"ls\[选项\] \[文件\]"。建议使用 ls -liaF。
~~~
[root@qidian ~]# ls -al
~~~
:-: ![](https://img.kancloud.cn/3f/65/3f65c8d043aee999a9151f582a7fa6aa_523x97.png)
##### cat 命令
cat 命令用于查看纯文本文件(内容较少的)。格式为"cat \[选项\] \[文件\]"。
如果需要显示行号,在cat 命令后面追加一个-n参数:
~~~
[root@qidian ~]# cat -n test.txt
1 a
2 aa
3 aaa
4 aaaa
5 aaaaa
6
7 aaaaaa
~~~
##### more 命令
more 命令用于查看纯文本文件(内容较多的),格式为"more \[选项\]文件"。其中空格和回车键用于向下翻页。
~~~
[root@VM-0-8-centos wwwroot]# more test.c
~~~
:-: ![](https://img.kancloud.cn/cd/1e/cd1e766c460eb7f3b610b0fd435ace26_331x302.png)
##### head 命令
head 命令用于查看纯文本文档的前N行,格式为"head \[选项\] \[文件\]"。
~~~
[root@qidian ~]# head -n 5 test.php
<?php
/*
这是一个php文件
*/
~~~
##### tail 命令
tail 命令用于查看纯文本文档的后N行或持续刷新内容,格式为"tail\[选项\]\[文件\]"。
~~~
[root@qidian ~]# tail -n 5 test.php
......
~~~
想要查看一个文件实时的插入变化用-f,对于查看日志文件是非常有用的。
~~~
[root@qidian ~]# tail -f testLog.php
......
~~~
##### tr 命令
tr 命令用于替换文本文件中的字符,格式"tr \[原始字符\]\[目标字符\]"。
~~~
[root@qidian ~]# cat test.php | tr [a-z] [A-Z]
~~~
##### wc 命令
wc 命令用于统计指定文本的行数、字数、字节数,格式为"wc \[参数\] 文本"。
~~~
[root@VM-0-8-centos wwwroot]# wc -l test.c
19 test.c
~~~
:-: ![](https://img.kancloud.cn/0b/01/0b0100ab4e5ac696be77e2f763405379_331x33.png)
1. \-l 用于统计行数
2. \-w 用于统计单词书
3. \-c 用于显示字节数
##### stat 命令
stat 命令用于查看文件的具体存储信息和时间等信息。格式"stat 文件名称"。
~~~
[root@VM-0-8-centos wwwroot]# stat test.c
File: ‘test.c’
Size: 306 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 917574 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-02-09 19:02:15.906107070 +0800
Modify: 2021-02-09 19:02:15.906107070 +0800
Change: 2021-02-09 19:02:15.911107052 +0800
Birth: -
~~~
:-: ![](https://img.kancloud.cn/dc/c6/dcc61dcb683d17092b28b15596b03d65_511x133.png)
##### cut 命令
cut 命令用于按"列"提取文本字符,格式为"cut\[参数\] 文本"。-f设置需要查看的列数,-d设置间隔符号。
~~~
[root@qidian ~]# head -n 2/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@qidian ~]#cut -d: -f1 /etc/passwd
root
bin
deamon
adm
lp
.......
~~~
##### diff 命令
diff 命令用于比较多个文本的差异,格式为"diff\[参数\] 文件"。-c 可以显示文件具体不同。
~~~
[root@qidian ~]# diff --brief diff_A.txt diff_B.txt
Files diff_A.txt and diff_B.txt differ
~~~
#### 13.3.4 文件目录管理命令
##### touch 命令
touch 命令用于创建空白文件设置文件时间,格式"touch \[选项\]\[文件\]"。
~~~
[root@qidian ~]# touch a.txt
[root@qidian ~]# ls
a.txt
~~~
##### mkdir 命令
mkdir 命令用于创建空白的目录,格式为"mkdir \[选项\] 目录"。
~~~
[root@qidian ~]# mkdir tt
[root@qidian ~]# cd tt
[root@qidian tt]# mkdir -p a/b/c
[root@qidian tt]# cd a
[root@qidian a]# cd b
[root@qidian b]#
~~~
##### cp 命令
cp命令用于复制文件或目录,格式"cp \[选项\] 源文件 目标文件"。
~~~
[root@qidian ~]# touch a.txt
[root@qidian ~]# cp a.txt b.txt
[root@qidian ~]# ls
a.txt b.txt
~~~
##### mv 命令
mv 命令用于剪切文件或将文件重命名。经常用于移动文件,格式"mv \[选项\] 源文件 \[目标路径|目标文件名\]"。
~~~
[root@qidian ~]# mv a.txt x.txt
[root@qidian ~]# ls
x.txt b.txt
~~~
##### rm 命令
rm 命令用于删除文件或目录,格式"mv \[选项\] 文件"。
~~~
[root@qidian ~]# rm x.txt
[root@qidian ~]# ls
b.txt
~~~
删除本文件夹下所有文件
~~~
[root@qidian ~]# rm ./*
~~~
##### dd 命令
dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式"dd \[参数\]"。
1. if 输入的文件名称
2. of输出的文件名称
3. bs设置每个"块"的大小
4. count设置要复制"块"的个数
~~~
[root@qidian ~]#dd if=/dev/zero of=560_file count=1 bs=560M
1+0 records in
1+0 records out
587202560 bytes (587 MB) copied ,27.1755 s, 21.6MB/s
~~~
##### file 命令
file 命令用于查看文件的类型,格式为"file 文件名"。
~~~
[root@qidian ~]# file anaconda-ks.cfg
anaconda-ks.cfg:ASCII text
[root@qidian ~]# file /dev/sda
/dev/sda:block special
~~~
#### 13.3.5 打包压缩与搜索命令
##### tar 命令
tar 命令用于对文件进行打包压缩或解压,格式为"tar \[选项\] \[文件\]"。
1. \-c 创建压缩文件
2. \-x 解开压缩文件
3. \-t 查看压缩包文件有哪些文件
4. \-z 用Gizp压缩或解压
5. \-j 用bzip2压缩或解压
6. \-v 显示压缩或解压的过程
7. \-f 目标文件名
8. \-p 保留原始的权限与属性
9. \-P 使用绝对路径来压缩
10. \-C 指定压缩到的目录
~~~
[root@qidian ~]# tar -czvf etc.tar.gz /etc //打包文件为etc.tar.gz
[root@qidian ~]# tar -xzvf etc.tar.gz -C /root/etc //解压etc.tar.gz 到/root/etc(先要创建此目录)
~~~
##### grep 命令
grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为"grep \[选项\]\[文件\]"。可以使用正则匹配或者通配符。
~~~
[root@qidian ~]# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/login
.....
~~~
匹配进程
~~~
[root@qidian ~]# ps aux | grep php-fpm
[root@qidian ~]# ps aux | grep php*
~~~
匹配文件名
~~~
[root@qidian ~]# ls -liaf | grep php*
~~~
##### find 命令
find 命令用于按照指定条件来查找文件,格式"find \[查找路径\] 寻找条件操作"。
1. \-name 匹配名称
2. \-prem 匹配权限(mode为完全匹配,-mode为包含即可)
3. \-user 匹配所有者
4. \-group 匹配所有者组
5. \-mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
6. \-atime -n +n 匹配访问文件的时间(-n指n天以内, +n指n天以前)
7. \-ctime -n +n 匹配修改文件权限的时间 (-n指n天以内, +n指n天以前)
8. \-nouser 匹配无所有者的文件
9. \-nogroup 匹配无所有组的文件
10. newer f1 !f2 匹配比文件f1新但比f2旧的文件
11. \--type b/d/c/p/l/f 匹配文件类型(后面的字符参数一次表示块设备、目录、字符设备、管道、链接文件、文本文件)。
12. \-size 匹配文件的大小(+50KB为查找超过50Kb的文件,而-50Kb为查找小于50KB的文件)
13. \-prune 忽略某个目录
14. \-exec ·······{}\\; 后面可跟用于进一步处理搜索结果的命令。
~~~
[root@VM-0-8-centos wwwroot]# find / -name index.php
/data/wwwroot/index.php
~~~
#### 13.3.6 管道符、重定向与环境变量
##### 输入重定向
1. 命令 < 文件 将文件作为命令的标准输入
2. 命令 << 分节符 从标准输入中读入,直到遇见分节符才停止。
3. 命令 文件 2 将文件1作为命令的标准输入并将标准输出到文件2
##### 输出重定向
1. 命令 > 文件 将标准输出重定向到一个文件中(清空原有文件数据)
2. 命令 2> 文件 将错误输出重定向到一个文件中 (清空原有文件的数据)
3. 命令 >> 文件 将标准输出重定向到一个文件中 (追加到原有内容的后面)
4. 命令 2>> 文件 将错误输出重定向到一个文件中 (追加到原有内容的后面)
5. 命令 >> 文件 2>&1或
命令 &>> 文件 将标准输出与错误输出共同写到文件中(追加到原有内容后面)
##### 管道符 |
管道符的作用“把前一个命令原本要输出到屏幕的标准正常数据作为是后一个命令的标准输入”。
~~~
[root@qidian ~]#ls | grep index.php //这是将ls输出的数据作为grep的标准输入命令
~~~
##### 环境变量
在Linux中,变量名称一般都是大写的,这是一种约定俗成的规范。
重要环境变量:
1. HOME 用户的主目录(家目录)
2. SHELL 用户在使用的Shell解释器名称
3. HISTSIZE 输出的历史命令记录条数
4. HISTFILESIZE 保存的历史命令记录条数
5. MAIL 邮件保存路径
6. LANG 系统语言、语系名称
7. RANDOM 生成一个随机数字
8. PS1 Bash解释器的提示符
9. PATH 定义解释器搜索用户执行命令的路径
10. EDITOR 用户默认的文本编辑器
~~~
[root@qidian ~]# echo $HOME
/root
~~~
设置变量,并且通过`$`读取。
~~~
[root@qidian ~]# WORKDIR=/home/workdir
[root@qidian ~]# cd $WORKDIR
[root@qidian workdir]# pwd
/home/workdir
~~~
#### 13.4 vim编辑器
vim是Linux最常用且强大的编辑器。vim有三种模式,输入模式、命令模式、末行模式。
命令模式转输入模式通过a、i、o等键,输入模式转命令模式通过Esc键。
命令模式转末行模式通过:键,末行模式转命令模式通过Esc键。
~~~
[root@qidian ~]# vim test.php
~~~
常用命令:
1. dd 删除(剪切)光标所在行
2. 5dd 删除(剪切)从光标处开始的5行
3. yy 复制光标所在行
4. 5yy 复制从光标处开始的5行
5. n 显示搜索命令定位的到下一个字符串
6. N 显示搜索命令定位到的上一个字符串
7. u 撤销上一步的操作
8. p 将之前删除(dd)或复制(yy)过的数据粘贴到光标处
末行模式的可用命令:
1. :w 保存
2. :q 退出
3. :q! 强制退出(放弃对文档的修改)
4. wq! 强制保存退出
5. set nu 显示行号
6. set nonu 不显示行号
7. :命令 执行该命令
8. :整数 跳转到该行
9. :s/one/two 将当前光标所在行的第一个one替换成two
10. :s/one/two/g 将当前光标所在行的所有one替换成two
11. %s/one/two/g 将全文中的所有one替换成two
12. ?字符串 从下至上搜索字符串
13. /字符串 从上至下搜索字符串
#### 13.5 Shell 脚本
编写shell脚本,可以让系统运行多条命令。
~~~
[root@qidian ~]# vim test.sh
#!/bin/bash #这是第一行,必须要指明用哪个bash解释器
pwd
ls
~~~
运行时
~~~
[root@qidian ~]# test.sh
/root
test.sh a.txt b.txt
~~~
##### 接收用户的参数
为了让Shell脚本程序更好地满足用户地一些实时需求,以便灵活完成工作,必须要让脚本程序能够像之前执行命令那样,接收用户输入的参数。所以Linux脚本语言早已内设了用于接收参数地变量,变量之间可以使用空格间隔。`$0`对应当前Shell脚本程序的名称,`$#`对应的是总共有几个参数,`$*`对应的是所有位置的参数值,`$?`对应的是显示上一次命令的执行返回值。`$1`、`$2`、`$3`······对应的是第N个位置的参数值
~~~
[root@qidian ~]# ./example.sh one two three four five six
~~~
例如:
~~~
[root@qidian ~]# vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第五个参数为$5"
[root@qidian ~]#sh example.sh one two three four five six
当前脚本名称为 example.sh
总共有6个参数,分别是one two three four five six
第一个参数为one,第五个参数为five
~~~
##### 判断用户的参数
文件测试所用的参数
1. \-d 测试文件是否是目录类型
2. \-e 测试文件是否存在
3. \-f 判断是否为一般文件
4. \-r 测试当前用户是否有权限读取
5. \-w 测试当前用户是否有写入权限
6. \-x 测试当前用户是否有执行权限
使用文件测试语句判断/etc/fstab是否为一般文件,如果返回值为0,则代表文件存在,且为一般文件。
~~~
[root@qidian ~]# [ -d /etc/fstab ]
[root@qidian ~]# echo $?
0
~~~
##### 或||,与&&,非!
~~~
[root@qidian ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
~~~
##### 可用的整数比较符
1. \-eq 是否等于
2. \-ne 是否不等于
3. \-gt 是否大于
4. \-lt 是否小于
5. \-le 是否等于或小于
6. \-ge 是否大于或等于
~~~
[root@qidian ~]# [ 10 -gt 10 ]
[root@qidian ~]# echo $?
1
[root@qidian ~]# [ 10 -eq 10 ]
[root@qidian ~]# echo $?
0
~~~
##### 常见字符串比较运算符
1. \= 字符串内容是否相同
2. != 字符串内容是否不同
3. \-z 判断字符串内容是否为空
~~~
[root@qidian ~]# [ -z $String ]
[root@qidian ~]# echo $?
0
~~~
##### if 条件测试语句
一个判断条件格式:
~~~
if [条件判断]
then
//code
fi
~~~
例子:目录不存在创建该目录。
~~~
[root@qidian ~]# vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
~~~
一个判断条件一个else格式:
~~~
if [条件判断]
then
//code
else
//code
fi
~~~
例子:能够ping通,提示服务器正常工作,不行就报警服务器出现问题。
~~~
[root@qidian ~]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is On-line"
else
echo "host $1 is Off-line"
fi
~~~
多个判断条件格式:
~~~
if [条件判断]
then
//code
elif [条件判断]
then
//code
else
/code
fi
~~~
##### for 条件循环语句
格式:
~~~
for 变量名 in 取值列表
do
//code
done
~~~
例子:从文件取列表进行循环
~~~
[root@qidian ~]# vim num.txt
1
2
3
4
[root@qidian ~]# vim Example.sh
#!/bin/bash
for NUM in `cat num.txt`
do
echo $NUM
done
[root@qidian ~]# sh Example.sh
1
2
3
4
~~~
:-: ![](https://img.kancloud.cn/f8/69/f8699282d410ac88341b41c476c9dfb0_308x77.png)
##### while 条件循环语句
格式:
~~~
while [条件判断]
do
//code
done
~~~
##### case 条件测试语句
格式:
~~~
case 变量值 in
模式1)
//code;;
模式2)
//code;;
·······
*)
//code;;
esac
~~~
~~~
[root@qidian ~]# vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "你输入的是 字母。"
;;
[0-9])
echo "你输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
~~~
#### 13.6 计划任务服务程序
计划任务分为`一次性计划任务`与`长期性计划任务`。
##### at命令
at 命令用于设定一次性任务
~~~
[root@qidian ~]# at 23:00
at > systemctl restart httpd
at > 此处同时按下ctrl + D 结束编写一次性计划任务
~~~
或者
~~~
[root@qidian ~]# echo "systemctl restart httpd" | at 23:00
~~~
at -l 查看所有计划任务
~~~
[root@qidian ~]# at -l
3 mon Apr 27 23:30:00 2017 a root
4 mon Apr 27 23:30:00 2017 a root
~~~
atrm 用于删除一次性计划任务
~~~
[root@qidian ~]# atrm 3
[root@qidian ~]# at -l
4 mon Apr 27 23:30:00 2017 a root
~~~
##### crond 命令
crond 命令用于周期性、有规律地执行某些具体地计划任务。
1. crontab -e 创建、编辑计划任务
2. crontab -l 查看当前计划任务
3. crontab -r 删除某条计划任务
4. crontab -u 编辑他人计划任务(root用户权限)
计划任务存放的目录:
* /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。
* /etc/crontab 这个文件负责调度各种管理和维护任务。
* /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
* 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
crond 设置任务的参数字段说明 (以空格分隔字段,逗号","挑选字段,减号"-"连续字段,除号"/"表示每多久执行一次)
1)分 0-59整数
2)时 0-23整数
3)日 1-31整数
4)月 1-12整数
5)星期 0-7整数, 0和7为星期天
6)命令 要执行的命令或脚本
#### 13.7 用户身份与文件权限
在RHEL 7中用户身份有以下:
1. 管理员UID为0:系统管理员(通常是root)。
2. 系统用户UID为1-999:Linux系统为了避免因为某个服务程序出现被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏的范围。
3. 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
为了方便管理同一组的用户,Linux系统还引入了用户组的概念。一个用户有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
##### useradd 命令
useradd 命令用于创建新的用户,格式为"useradd \[选项\] 用户名"。用该命令创建用户账户时,默认的用户家目录在/home目录中。默认的Shell解释器为/bin/bash,而且会创建一个和该用于同名的基本用户组。
| 参数 | 作用 |
| --- | --- |
| \-d | 指定用户的家目录(默认为/home/username) |
| \-e | 账户的到期时间,格式为YYYY-MM-DD |
| \-u | 指定该用户默认UID |
| \-g | 指定一个初始的用户基本组(必须已存在) |
| \-G | 指定一个或多个扩展用户组 |
| \-N | 不创建与用户同名的基本用户组 |
| \-s | 指定该用户的默认Shell解释器 |
创建一个用户,指定解释器为nologin(表示不能登录系统)。
~~~
[root@qidian ~]# useradd -d /home/qdian -u 1111 -s /sbin/nogin oneone
[root@qidian ~]# id oneone
uid=1111(oneone) gid=1111(oneone) groups=1111(oneone)
~~~
##### groupadd 命令
groupadd 命令用于创建用户组,格式为"groupadd \[选项\] 群组名"。
~~~
[root@qidian ~]# groupadd tom
~~~
##### usermod 命令
usermod命令用于修改用户的属性,格式为"usermod \[选项\] 用户名"。linux系统中所有一切都是文件,因此创建用户就是修改文件的过程。用户的信息保存在/etc/passwd文件中。
| 参数 | 作用 |
| --- | --- |
| \-c | 填写用户账户的备注信息 |
| \-d -m | 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
| \-e | 账户的到期时间,YYYY-MM-DD |
| \-g | 变更所属用户组 |
| \-G | 变更扩展用户组 |
| \-L | 锁定用户禁止其登录系统 |
| \-U | 解锁用户,允许其登录系统 |
| \-s | 变更默认终端 |
| \-u | 修改用户的UID |
添加用户到root组。
~~~
[root@qidian ~]# usermod -G root oneone
[root@qidian ~]# id oneone
uid=1111(oneone) gid=1111(oneone) groups=1111(oneone),0(root)
~~~
##### passwd 命令
passwd 命令用于修改用户密码、过期时间、认证信息等,格式"passwd \[选项\] 用户名"。普通用只能修改自身的系统密码,root用户可以修改任何用户的系统密码且不需要验证。
| 参数 | 作用 |
| --- | --- |
| \-l | 锁定用户,禁止登录 |
| \-u | 接触锁定,允许用户登录 |
| \--stdin | 允许通过标准输入修改用户密码,如 echo "123456| passwd --stdin oneone" |
| \-d | 使该用户可以用空密码登录系统 |
| \-e | 强制用户在下次登陆时修改密码 |
| \-S | 显示用户的密码是否被锁定,以及密码采用的加密算法名称 |
##### userdel 命令
userdel 命令用于删除用户,格式为"userdel \[选项\] 用户名"。
| 参数 | 作用 |
| --- | --- |
| \-f | 强制删除用户 |
| \-r | 同时删除用户及用户家目录 |
##### 用户权限及归属
Linux用不同的字符区分不同的文件类型:
* \-: 普通文件
* d: 目录文件
* l: 链接文件
* b: 块设备文件
* c: 字符设备文件
* p: 管道文件
在Linux中,有5种权限,分别是,r、w、x、s、t。
* 可读权限:r(4)
* 可写权限:w(2)
* 可执行权限:x(1)
* Setuid:s(Set User ID)
* Setgid:s(Set Group ID)
* 粘滞位:t
例如:dr-xr-xr-x. 2 root root 12288 Nov 2 2012 .
说明这个是一个文件夹 拥有者是root,群组是root。拥有者、群组、其他组的权限分别是555。都是有读和执行权限。因为没有w(2)。文件最后修改时间是Nov 2 2012 文件大小是12288。
##### 文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx已无法满足我们对安全和灵活性的需求。
##### SUID
SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限。
##### SGID
SGID有两种主要功能:
* 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)。
* 在某个目录中创建的文件自动集成该目录的用户组(只可以对目录设进行设置)。
##### chmod 命令
改变文件或者目录的权限
~~~
[root@qidian ~]# chmod 760 dir
[root@qidian ~]# ls -l dir
drwxrw----. 1 root root 15 Feb 11:50 dir
~~~
##### chown 命令
改变文件所有者和所属组
~~~
[root@qidian ~]# chown oneone:oneone dir
[root@qidian ~]# ls -l dir
drwxrw----. 1 oneone oneone 15 Feb 11:50 dir
~~~
##### SBIT
SBIT 特殊权限为可确保用户只能删除自己的文件。通过chmod o+t 添加SBIT粘滞位。
~~~
[root@qidian ~]# chmod -R o+t dir
~~~
#### 文件的隐藏属性
在默认的情况不能被直接被用户发觉。
##### chattr 命令
chattr 命令拥有设置文件的隐藏权限。格式"chattr +\[参数\] 文件"。
| 参数 | 作用 |
| --- | --- |
| i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
| a | 允许追加内容,不可覆盖或删除 |
| S | 文件变更后立即同步到磁盘 |
| s | 立即删除,不可恢复 |
| A | 不可修改最后访问时间 |
| b | 不再修改存取时间 |
| D | 检查压缩文件中的错误 |
| d | 使用dump命令备份时被忽略 |
| c | 默认进行压缩 |
| u | 当删除后依然保存留在硬盘的数据,方便日后恢复 |
| t | 让文件系统支持尾部合并 |
| X | 可以直接访问压缩文件的内容 |
~~~
[root@qidian ~]# chattr +a test.txt
[root@qidian ~]# rm test.txt
rm:cannot remove "test.txt" : Operation not permitted
~~~
##### lsattr 命令
lsasttr 命令拥有显示文件的隐藏权限,格式为"lsattr \[参数\] 文件"。
~~~
[root@qidian ~]# lsattr test.txt
-----a---------- test.txt
~~~
#### 文件访问控制列表
文件访问控制列表ACL用于对某一个指定用户进行权限控制。
##### setfacl 命令
setfacl 命令用于管理文件的ACL规则,格式"setfacl \[参数\] 文件名称"。
##### getfacl 命令
getfacl 命令用于显示文件上设置的ACL信息,格式为"getfacl \[参数\] 文件名称"
#### su 命令与 sudo 服务
##### su 命令
su 命令用于切换用户,使得当前用户在不登录的情况下,顺畅地切换到其他用户。(-) 号代表彻底切换到某个用户。
~~~
[root@qidian ~]# su - oneone
[oneone@qidian ~]#
~~~
##### sudo 命令
sudo 命令把特定命令的执行权限赋予给指定用户,保证能够为完成工作又不泄露root管理员密码。只有管理员可以用visudo 编辑其配置文件。
sudo命令可以:
* 限制用户执行指定的命令。
* 记录用户执行的每一条命令。
* 配置文件/etc/sudoers(用来提供集中的用户管理、权限与主机等参数)。
* 验证密码后5分钟内(默认值)无需再让用户验证密码。
| 参数 | 作用 |
| --- | --- |
| \-h | 列出帮助信息 |
| \-l | 列出当前用户可执行的命令 |
| \-u 用户名或者UID | 以指定的用户身份执行命令 |
| \-k | 清空密码有效时间 |
| \-b | 在后台执行 |
| \-p | 更改询问密码的提示语 |
~~~
[root@qidian ~]# visudo //99行之后
root ALL=(ALL) ALL
oneone ALL=(ALL) ALL //让oneone用户可以使用所有命令,允许使用的主机是全部以所有身份
~~~
#### 13\. 8 Linux 其他
对于Linux的其他技术,有需要的同学可以查阅资料自行学习。下面类举部分:
##### RAID
RAID技术通过把多个硬盘设备组合成一个容量更大、安全性好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。(对于运维同学需要学习)。
##### LVM(逻辑卷管理器)
硬盘分好区或者部署为RAID磁盘阵列之后,再像改变磁盘分区就不大容易了,这时候就需要LVM允许用户对磁盘资源进行动态调整。
##### firewalld 防火墙
firewalld服务(Linux系统的动态防火墙管理器)是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和GUI(图形界面)的两种管理方式。它可以事先配置好策略,根据不同的场景切换策略。
##### SSHD 服务
SSH是一种能够以安全方式提供远程登录的协议,也是目前远程管理Linux的首选方式。以前用FTP或者Telnet进行远程登录,他们用明文的形式再网络中传输账号密码和数据信息,因此很不安全。想要使用SSH协议远程管理Linux系统就需要部署配置sshd服务程序。
##### SELinux 安全子系统
是一个强制访问控制的安全子系统。
##### 虚拟主机
虚拟主机功能可以把一台处于运行状态的物理服务器分割成多个"虚拟的服务器"。
##### vsftpd 服务
vsftpd 服务基于`文件传输协议FTP`。FTP是一种再互联网中进行文件传输的协议,基于C/S模式。
##### 使用Samba 或 NFS 实现文件共享
Samba主要实现windows与Linux之间的文件共享服务。
NFS主要用于Linux之间的文件共享服务。NFS可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机基于TCP/IP协议,像使用本地主机上的资源那样读写远程Linux系统上的共享文件。
#### DNS 域名解析服务
bind服务程序是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。
#### 动态主机配置协议
DHCP动态主机配置协议是一种基于UDP协议且仅限于在局域网内部使用的网络协议,主要用于大型的局域网环境或者存在较多办公设备的局域网环境中,其主要用途是为局域网内部的设备或网络供应商自动分配IP地址等参数。
#### 邮件系统
使用Postfix 与Dovecot部署邮件系统。
##### 代理缓存服务
使用Squid代理服务程序作Web网站的前置缓存服务。Squid服务程序会按照收到的用户请求向网站源服务器请求页面、图片等所需数据,并将服务器返回的数据存储在运行的Squid服务程序的服务器上。当再有用户再请求相同的数据时,则可以直接将存储服务器本地的数据交付给用户,这样不仅减少了用户的等待时间,还缓解了网站服务器的负载压力。
ACL访问控制
Squid服务程序的访问控制列表功能可以根据策略条件来缓存数据或限制用户的访问。
比如分时段禁止员工逛淘宝、打开网页游戏。
······