2020年8月22日,开始学习liunx系统的一天,liunx系统的内容有很多,大致可以分为五个阶段:
第一个阶段:熟练使用 Linux 命令行
第二个阶段:通过系统调用或者 glibc,学会自己进行程序设计
第三个阶段:了解 Linux 内核机制
第四个阶段:阅读 Linux 内核代码,聚焦核心逻辑和场景
第五个阶段:实验定制化 Linux 组件
学习 Linux 的第一步,要先从 Windows 的思维习惯,切换成 Linux 的“命令行 + 文件”使用模式。
在 Linux 中,无论我们做什么事情,都会有相应的命令工具。因为命令数量众多,所以想要用好liunx,学会liunx的命令使用必不可少,也是绕不过的坎,在这里我使用《liunx就该这么学》 来学习liunx系统,在我跟进的课程中推荐阅读《鸟哥的 Linux 私房菜》和《Linux 系统管理技术手册》,但我认为这些书都比较厚,简直就是”入门都放弃"的最佳书籍了。 所以我最终选择了《liunx就该这么学》,它有免费的电子书籍与配套的视频讲解(链接https://www.linuxprobe.com/chapter00.html)。
liunx系统的内核负责完成对硬件资源的分配、调度等管理任务。内核对于liunx系统是十分重要的,一般不建议取用户取直接修改内核参数,而是让用户通过基于系统调用接口开发出来的服务或程序来管理计算机。
shell是一个命令行工具,shell(也称终端或壳)充当的是人与内核之间的桥梁,用户将一些命令行”告诉“shell, shell会通过系统接口调用相应的程序与服务取完成这些命令。主流的liunx系统使用Bash解释器作为命令行终端,主要有一下4个优势:
1.通过上下方向键查看之前的命令
2.可以用TAB键补全命令
3.具有强大的批处理脚本
4.具有实用的环境变量功能
常见的linux命令格式:
命令名称 [命令参数][命令对象]
命令名称、命令参数、命令对象之间要用空格隔开
命令对象一般是指要处理的文件、目录、用户等资源,而命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用–与-作为前缀。
例如: man --help man -help
man命令中常用按键以及用途
man命令用于查看命令的详细文档
按键 | 用处 |
---|---|
空格键 | 向下翻一页 |
PaGe down | 向下翻一页 |
PaGe up | 向上翻一页 |
home | 直接前往首页 |
end | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如“/linux” |
? | 从下至上搜索某个关键词,如“?linux” |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
q | 退出帮助文档 |
echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。
输出字符串到屏幕终端:
提取变量SHELL的值,并将其输出到屏幕上:
date命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。
参数 | 作用 |
---|---|
%t | 跳格[Tab键] |
%H | 小时(00~23) |
%I | 小时(00~12) |
%M | 分钟(00~59) |
%S | 秒(00~59) |
%j | 今年中的第几天 |
date -s 修改系统时间
reboot命令用于重启系统,其格式为reboot。
poweroff命令用于关闭系统,其格式为poweroff。
wget命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。
如果某些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台执行
参数 | 作用 |
---|---|
-b | 后台下载模式 |
-P | 下载到指定目录 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面内所有资源,包括图片、视频等 |
-r | 递归下载 |
ps命令用于查看系统中的进程状态,格式为“ps [参数]”。
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
linux 运行这许多程序,它们有五种状态运行、中断、僵死、停止、不可中断;
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
T(停止):进程收到停止信号后停止运行。
top命令用于动态地监视进程活动与系统负载等信息,其格式为top。
pidof命令用于查询某个指定服务进程的PID值,格式为“pidof [参数] [服务名称]”。
kill命令用于终止某个指定PID的服务进程,格式为“kill [参数] [进程PID]”。
kill 2156 : 强制终止PID为2156的服务进程
killall命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [服务名称]”。
通常来讲,复杂软件的服务程序会有多个进程协同为用户提供服务,如果逐个去结束这些进程会比较麻烦,此时可以使用killall命令来批量结束某个服务程序带有的全部进程。
如果某些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台执行
该小节介绍网卡网络、系统内核、系统负载、内存使用情况、当前启用终端数量、历史登录记录、命令执行记录以及救援诊断等相关命令的使用方法。
ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”。
使用ifconfig命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet参数后面的IP地址、ether参数后面的网卡物理地址(又称为MAC地址),以及RX、TX的接收数据包与发送数据包的个数及累计流量:
uname命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
在使用uname命令时,一般会固定搭配上-a参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
uptime用于查看系统的负载信息,格式为uptime。
uptime命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。
平均负载: 指在最近的 1分钟、5分钟、 15分钟的压力情况, 值越小越好,在日常使用不要长期超过1.
free用于显示当前系统中内存的使用量信息,格式为“free [-h]”。
who用于查看当前登入主机的用户终端信息,格式为“who [参数]”。
last命令用于查看所有系统的登录记录,格式为“last [参数]”。
last命令查看的日志, 而日志容易被篡改,所以不要单纯地以该命令的输出判断系统是否被入侵了。
history命令用于显示历史执行过的命令,格式为“history [-c]”。
可以使用![数字] 来使用之前的命令
history -c 清空历史记录
history命令会展现1000条历史记录,可以进/etc/profile文件修改HISTISIZE变量值改变记录条数。
命令记录存储在当前用户目录下的.bash_history文件中, 可以用 cat ~.bash_history 查看。
sosreport命令用于收集系统配置及架构信息并输出诊断文档,格式为sosreport。
工作目录指的是用户当前在系统中所处的位置。
pwd命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”。
cd - :返回上一次的目录
ls命令用于显示目录中的文件信息,格式为“ls [选项] [文件] ”。
Linux系统中“一切都是文件”,而对服务程序进行配置自然也就是编辑程序的配置文件。
cat命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”
cat一般用于较小文件的查看
cat -n: 查看是显示行数
more命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。
head命令用于查看纯文本文档的前N行,格式为“head [选项] [文件]”。
head -n 20 [文件] : 查看文件的前二十行的内容
tail命令用于查看纯文本文档的后N行或持续刷新内容,格式为“tail [选项] [文件]”。
tail -n 20 文件名:查看文件的后二十行的内容
tail -f 文件名: 持续刷新这个文件的内容
tr命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。
cat anaconda-ks.cfg | tr [a-z] [A-Z]:将文件中所有小写字母变为大写字母
wc命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
stat命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。
Access:访问时间
Modify:修改时间
Change:属性改变时间
cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。
cut -d: -f1 /etc/passwd: 提取出用户名;
”-d: “ 设定分隔符为 “:”;
“-f1” 设定为第一列的内容
diff命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。
diff --brief命令显示比较后的结果,判断文件是否相同。
带有-c参数的diff命令来描述文件内容具体的不同。
touch命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。
touch 文件名: 创建一个空的文件
参数 | 作用 |
---|---|
-a | 仅修改“读取时间”(atime) |
-m | 仅修改“修改时间”(mtime) |
-d | 同时修改atime与mtime |
mkdir命令用于创建空白的目录,格式为“mkdir [选项] 目录”。
mkdir 目录名 : 创建一个空目录
mkdir -p 路径: 递归创建目录
cp命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。
在linux中复制操作分为3中情况:
如果目标文件是目录,则会把源文件复制到目录中
如果目标文件是普通文件,则会询问是否要覆盖它
如果目标文件不存在,则执行正常的复制操作
参数 | 作用 |
---|---|
-p | 保留原始文件的属性 |
-d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
-r | 递归持续复制(用于目录) |
-i | 若目标文件存在则询问是否覆盖 |
-a | 相当于-pdr(p、d、r为上述参数) |
rm命令用于删除文件或目录,格式为“rm [选项] 文件”。
-f强制删除,不询问
-r删除目录
dd命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]”。
参数 | 作用 |
---|---|
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个“块”的大小 |
count | 设置要复制“块”的个数 |
bs 与 count 的关系为: 总大小 = bs * count;
file命令用于查看文件的类型,格式为“file 文件名”。
tar命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。
tar -czvf [压缩包名称.tar.gz] [要打包的目录] : 压缩文件放在当前目录下
tar -xzvf [压缩包名称.tar.gz] : 解压文件到当前目录下
grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [选项] [文件]”。
使用正则表达式搜索;
-n 显示搜索到信息的行号;
-v 参数用于反选信息(即没有包含关键词的所有信息行;
find命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。
寻找条件有:文件名、大小、修改时间、权限等信息。
参数 | 作用 |
---|---|
-name | 匹配名称 |
-perm | 匹配权限(mode为完全匹配,-mode为包含即可) |
-user | 匹配所有者 |
-group | 匹配所有组 |
-mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) |
-atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所有组的文件 |
-newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 |
–type b/d/c/p/l/f | 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
-size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
-prune | 忽略某个目录 |
-exec …… {}; | 后面可跟用于进一步处理搜索结果的命令(下文会有演示) |
文件读写操作有关的重定向技术的5种模
1.标准覆盖输出重定向,
2.标准追加输出重定向,
3.错误覆盖输出重定向,
4.错误追加输出重定向以及输入重定向,
输入重定向 : 指把文件导入到命令中
输出重定向: 指把原本要输出到屏幕的数据信息写入到指定文件中
输出重定向又可分为: 标准输出重定向和错误输出重定向
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
输入重定向:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1或命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
“>” 当用标准输出时,如果命令出现了错误信息那么会打印到屏幕上; 使用 “2>"也是一样的
管道命令符的作用也可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入”。
通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
4个最常用的转义字符如下所示:
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(’’):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
alias命令: 设置命令的别名;
unalias命令: 取消别名
前文中曾经讲到,在Linux系统中一切都是文件,Linux命令也不例外。那么,在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤:
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。我们之前在使用rm命令删除文件时,Linux系统都会要求我们再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,接下来我们把它取消掉:
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
可以使用env命令来查看到Linux系统中所有的环境变量;
比较重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。不同用户的环境变量不共用
“在Linux系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数”
Vim中常用的命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
yy | 复制光标所在整行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
末行模式中可用的命令
命令 | 作用 |
---|---|
:w | 保存 |
:wq! | 强制保存退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
: s/one/two | 将当前光标所在行的第一个one替换成two |
: s/one/two/g | 将当前光标所在行的所有one替换成two |
:%s/one/two/g | 将全文中的所有one替换成two |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
使用a、i、o三个键从命令模式切换到输入模式。
a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光标的下面再创建一个空行.
用文档编辑器完成几个任务:
为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有IP地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问。
hostname :查看主机名称
/etc/hostname: 主机名放在这个文件下, 修改这个文件的内容就可以修改主机名。
/etc/sysconfig/network-scripts : 该目录下有网卡的配置文件, 配置文件名为网卡名称;
/etc/yum.repos.d/: 改目录存放yum软件仓库的配置文件
Shell脚本命令的工作方式有两种:交互式和批处理。
交互式(Interactive):用户每输入一条命令就立即执行。
交互式(Interactive):用户每输入一条命令就立即执行。
脚本第一行需要声明使用那个解释器, “#! /bin/bash ” 形如这样的指令
#: 注释代码
例如$0
对应的是当前Shell脚本程序的名称,$#
对应的是总共有几个参数,$*
对应的是所有位置的参数值,$?
对应的是显示上一次命令的执行返回值,而$1
、$2
、$3
……则分别对应着第N个位置的参数值
条件测试语句(选择语句): 格式 : [ 条件表达式 ](两边都有一个空格)
条件成立则返回数字0,否则便返回其他随机数值。
条件测试语句可以分为4种:
文件测试语句; 逻辑测试语句; 整数值比较语句; 字符串比较语句。
文件测试所用的参数
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
-d :如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在;
-f :如果返回值为0,则代表文件存在,且为一般文件;
在Shell终端中逻辑“与”的运算符号是&&,表示当前面的命令执行成功后才会执行它后面的命令;
逻辑“或”它在Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令;
逻辑语句是“非”,在Linux系统中的运算符号是一个叹号!,它表示把条件测试中的判断结果取相反值;
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作。
可用的整数比较运算符
操作符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
常见的字符串比较运算符
操作符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
-z : 通过判断String变量是否为空值,进而判断是否定义了这个变量;
单分支选择语句
if [] //条件测试操作
then //语句执行
fi //结束
if []
then
else
fi
多分支选择语句
if []
then
elif
then
else
if
ping 命令:-c参数来规定尝试的次数,-i参数定义每个数据包的发送间隔,以及使用-W参数定义等待超时时间。
for 'name' in 'list'
do
//操作
done
while 条件测试操作
do
//操作
done
case ' ' in
,,
,,
*)
esac
Linux可以在无需人为介入的情况下,在指定的时间段自动启用或停止某些服务或命令,从而实现运维的自动化。
计划任务分为一次性计划任务与长期性计划任务;
一次性计划任务只执行一次,一般用于满足临时的工作需求。
at命令:
at -l:查看已设置好但还未执行的一次性计划任务
atrm 任务序号:删除设置好但还未执行的一次性计划任务
长期性计划任务:希望Linux系统能够周期性地、有规律地执行某些具体的任务;
crond命令
crontab -e:创建、编辑计划任务
crontab -l:查看当前计划任务
crontab -r:删除某条计划任务
另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务。
crond服务设置任务的参数格式:“分、时、日、月、星期 命令”
字段 | 说明 |
---|---|
分钟 | 取值为0~59的整数 |
小时 | 取值为0~23的任意整数 |
日期 | 取值为1~31的任意整数 |
月份 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。
用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。
用除号(/)表示执行任务的间隔时间(例如“/2”表示每隔2分钟执行一次任务)。
尤其需要注意的是,在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写。
**计划任务中的“分”字段必须有数值,绝对不能为空或是号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。**
root管理员权限:添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备。
用户的身份号码即UID(User IDentification)的数值为0的用户为管理员用户
管理员UID为0:系统的管理员用户。
系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。
groupadd命令用于创建用户组,格式为“groupadd [选项] 群组名”。
usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。
Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”。
普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码(且不需要验证密码)。
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 允许通过标准输入修改用户密码,如echo “NewPassWord” |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
userdel命令用于删除用户,格式为“userdel [选项] 用户名”。
可以通过userdel命令删除用户的所有信息。
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
文件的属性:
-:普通文件。
d:目录文件。
l:链接文件。
b:块设备文件。
c:字符设备文件。
p:管道文件。
普通文件的权限:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
用数字表示文件权限:
每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
被赋予SUID权限的文件可以临时需要权限。
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。
chown可以设置文件或目录的所有者和所属组,其格式为“chown [参数] 所有者:所属组 文件或目录名称”
当chmod命令 与 chown 命令时修改目录时: 需要加参数 ‘-R’;
保护位: 被设定了这个权限的目录,可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
对其他目录来设置SBIT特殊权限位,用chmod命令就可以了。对应的参数o+t代表设置SBIT保护位权限。
隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”,执行该命令需要管理员权限。
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。
希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。
如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。
使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的修改。
针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数。如果想要删除某个文件的ACL,则可以使用-b参数。
常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。
su命令: 切换用户,su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”。
sudo服务中的可用参数以及作用
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或UID值 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
总结来说,sudo命令具有如下功能:
限制用户执行指定的命令:
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
使用visudo命令配置sudo命令的配置文件时,其操作方法与Vim编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在sudo命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,一切皆是文件。
Linux目录结构:
Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途。Linux文件名区分大小写
FHS标准:
Linux系统中常见的目录名称以及相应内容
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户主目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
在Linux系统中一切都是文件,硬件设备也不例外。
硬件设备的名称又udev设备管理器规范,udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;
Linux系统中常见的硬件设备的文件名称如表:
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-p] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
目前IDE设备很少使用了, 一般的硬盘设备都是以“/dev/sd” 开头的。 而一太主机有多块硬盘,系统采用a~p来代表16块不同的硬盘(默认从a开始分配)。
“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。
Linux系统支持数十种的文件系统,常见的文件系统:
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
硬盘在使用之前一定要格式化,
Linux系统中添加硬件设备,在拿到一块全新的硬盘存储设备后要先分区,然后格式化,最后还需要挂载才可以正常使用。
mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。
mount命令中的参数以及作用
参数 | 作用 |
---|---|
-a | 挂载所有在/etc/fstab中定义的文件系统 |
-t | 指定文件系统的类型 |
按照上面的方法执行mount命令后就能立即使用文件系统了,系统在重启后挂载就会失效,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见表6-4)写入到/etc/fstab文件中。
用于挂载信息的指定填写格式中,各字段所表示的意义:
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。
disk命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”;这是一个交互式命令
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
mkfs命令 : 格式化分区 ,mkks 设备文件名
因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果
[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。
df -h命令:查看挂载状态和硬盘使用量信息。
du命令:查看文件大小,其格式为“du [选项] [文件]”
使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小。
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
mkswap:SWAP分区专用的格式化命令
swapon命令把准备好的SWAP分区设备正式挂载到系统中。
为了能够让新的交换分区设备在重启后依然生效,可以将相关信息写入到配置文件/etc/fstab中,
Glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库。Glibc 为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。