两个分区表形式

MBR:最大支持2.1T硬盘,最多支持4个分区
GPT分区表:GPT支持9.4ZB硬盘,理论上分区没有限制。windows限制128个分区。

分区类型MBR

  • 主分区最多只能有4个
  • 扩展分区
    • 最多只能有1个
    • 主分区加扩展分区最多有4个
    • 不能写入数据,只能包含逻辑分区。
  • 逻辑分区

每个硬盘必须有一个主分区

格式化

格式化并不完全是为了清空数据。又称逻辑格式化,它是指根据用户选定的文件系统(win:NFS,Linux:EXT4),在磁盘的特定区域写入特定数据,在分区中划出一片用于存放文件分配表,目录表等用于文件管理的磁盘空间。

设备文件名和挂载点

尚硅谷Linux基础笔记 - 图1

设备文件名/dev/

/dev文件夹中放了所有设备的文件,分区的设备也在/dev文件夹中!

  1. /dev/hda1 (IDE硬盘接口)
  2. /dev/sda1(SCSI,SATA硬盘接口,USB接口)

hda1,sda1的a是指第一个硬盘。后面的数字是指分区,分区1就是1。但是只有四个分区,1-4一定是主分区,逻辑分区是从5开始。

/dev/sdb3 : SATA接口的第二块硬盘的第三个分区

/dev/sdc7 : SATA接口的第三块硬盘的逻辑分区

挂载点

在Windows中,我们会看到C,D,E,F盘,但是linux并没有这种盘符来命名你的盘。Linux使用已经存在的空目录作为挂载点。你可以把空目录作为盘符来理解,但是你不能这么说,他就叫挂载点。

理论上所有的空目录都可以,新建目录可以当作挂载点,除了/bin/,/lib/,/etc/

挂载

  • 必须分区
    • / (根目录)
    • swap分区 (虚拟内存)
      • 如果真实内存小于4GB,swap位内存的两倍
      • 如果真实内存大于4GB,swap和内存一致
      • 实验环境,不大于2GB
  • 推荐分区
    • /boot (启动分区,1GB)
  • 常用分区
    • /home (用于文件服务器)
    • /www (用户web服务器)

swap只能用于根分区的内存。

例子:我有1T硬盘,我的linux用来运维web服务器。

分根目录 / 200G,分给启动分区 /boot 100G,剩下的全部给 /www web服务器。

初学者管理建议

1.学习时把虚拟机当成服务器来操作

尽量不要有,一个虚拟机而已,没了就没了。这种心态。

2.严格区分大小写

Linux是严格区分大小写的,和win不一样。比如有些命令参数有-v-V 。文件夹也可以同时存在aaaAAA

3.Linux一些皆文件

硬件,命令等都是文件。虽然他们之间名称不一样,但是都为文件。设备文件在/dev目录。命令文件在/bin 目录。注意:有些设置想要永久生效,得看有没有在配置文件中写入,比如setenforce 0 为临时设置,vim /etc/selinux/config 为永久设置。

4.Linux不靠扩展名区分文件类型

win有扩展名,例如 .txt .zip。但是linux不靠扩展名区分文件类型。比如在linux创建目录文件 test ,你依然可以使用vim,给他编辑文字。但是还是有特殊文件建议要求扩展名,比如压缩包:.gz .bz2 .zip .tar.gz .tgz .rmp。写压缩包扩展名,不是为了让linux看,是为了让管理员们看。

5.Linux中所有的存储设备都必须在挂载之后才能使用

Linux中所有的存储设备都有自己的设备文件名,这些设备文件名必须挂载之后才能使用。包括,硬盘,光盘,U盘。

6.windows下的程序不能直接在linux使用

服务器目录管理建议

一级目录

目录名 目录的作用
/bin/ 存放系统命令的目录,/usr/bin目录的软链接
/sbin 是系统管理员专用的二进制代码存放目录,主要用于系统管理
/boot 保存系统启动文件的目录
/dev 保存硬盘设备的目录
/etc/ 配置文件保存位置,linux大多配置文件在该目录下
/home 家目录,普通用户的默认登录和保存数据的目录。每当有一个用户就会在下一级多一个同名目录,例如user1 /home/user1
/lib/ 保存系统的函数文件。.so+数字 就是函数文件
/media 挂载光盘的空目录
/misc 挂在共享目录,U盘的空目录
/mnt 挂载目录。
/opt 第三方软件的保存位置。不过建议还是放在/usr/local中。/opt可以当做上传文件目录
/proc 内存挂载点,会有些linux系统文件,最好别碰
/root 超级用户的家目录
/srv 服务数据目录
/tmp 临时文件目录,所有用户都可以访问进入。
/var 目录主要针对常态性变动的文件,包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件
/usr usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到/usr, 系统安装完时,这个目录会占用最多的硬盘容量

二级目录

目录 目录的作用
/usr/local 手工安装的软件保存位置,建议将文件安装在这里
/usr/share 应用程序的资源文件保存位置,帮助文档,说明文档和字体目录等
/usr/src 源码包保存位置。不过更建议将源码包放在/usr/local/src目录中
/usr/src/kernels 内核源码保存位置
/var/www/html RPM包安装Apache的网页主目录
/var/lib 程序运行需要调用或改变的数据保存位置。如Mysql的数据库保存在/var/lib/mysql
/var/log 系统日志保存位置
/var/run 一些服务和程序运行后,它们的PID保存位置。
/var/spool 放置队列数据的
/var/spool/mail 新收到的邮件队列保存位置。系统收到的邮件保存在这里
/var/spool/cron 系统定时任务队列保存位置。系统的计划任务保存在这里

服务器建议

远程服务器关机及重启时的注意事项

  1. 远程服务不能关机,只能重启,原因自己理解。
  2. 远程服务在重启前,必须中止正在执行的服务。
    • 因为服务器很多人在访问,几乎硬盘一直在运转,如果在进行某个操作你突然关机,非常大概率会出现数据错误,并且可能会损害硬盘。
  3. 重启命令建议选择shutdown -r no
    • 并且重启前,执行几次sync 这条命令是数据同步命令,可以让暂时保存在内存中的数据同步在硬盘上。
  4. 不要再服务器访问高峰进行高负载命令
    • 备份/杀毒/解压缩大文件等操作会大量占用资源,导致卡顿。并且在流量高峰期,即使无任何操作,服务器也会特别卡。如果此时进行高负载命令,比如备份。非常有可能导致死机/更严重的卡顿。
  5. 远程配置防火墙时不要把自己踢出服务器
    • 防火墙简单来说就是根据数据包自身的参数来判断是否运去数据包通过的网络设备。
  6. 使用复杂的密码,并且定期更换
  7. 合理分配权限
  8. 定期备份重要的数据和日志
    • 备份的基本原则:不要把鸡蛋放在同一个篮子里

Linux常用命令

ls

查看目录中的文件

-a        显示所有文件
-d        显示目录信息
-h        按照我们习惯显示文件大小
-i        显示文件的i节点
-l        长格式显示

尚硅谷Linux基础笔记 - 图2

权限:

引用计数:如果是文件,代表文件的硬链接的个数。如果是目录代表该目录下有多少个一级子目录。

所有者: 这个文件属于哪个用户,默认所有者是文件的建立用户。

所属组: 文件所属的用户组

大小: 默认是字节

文件修改时间:注意是修改时间,不是创造时间

cd

进入目录

特殊符号 作用
~ 代表用户的家目录
- 代表上次所在的目录
. 代表当前目录
.. 代表上级目录

mkdir/rmdir

目录的创建与删除

mkdir -p 目录名
rmdir -p 目录名(但是不能删除空目录) 尽量别用

文件操作命令

touch

新建文件/修改文件时间

如果没有新文件touch abc 创建文件夹

如果有新文件,则是修改文件的访问时间。类似摸了他一下。

stat

查看文件的基本信息。Linux没有创建时间

[root@localhost ~]# stat anaconda-ks.cfg 
  文件:"anaconda-ks.cfg"
  大小:1301          块:8          IO 块:4096   普通文件(regular file)
设备:fd00h/64768d    Inode:33574979    硬链接(Link):1
权限:(0600/-rw-------)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问(Access):2021-09-12 14:21:44.558947606 +0800
最近更改(Modify):2021-09-12 14:21:44.560949196 +0800
最近改动(Change):2021-09-12 14:21:44.560949196 +0800
创建时间:-

cat

查看文件的内容。不太适合大文件,因为一次从头显示到尾。

-A        列出所有的隐藏符号,类似-vET的整合
-E        列出每行结尾的回车符$
-n        显示行号
-T        把Tab键用^I显示出来
-v        列出特殊字符

查看文件命令

more

分屏显示

  • 空格:向下翻页
  • b:向上翻页
  • 回车键:向下滚动一行
  • /字符串:搜索指定的字符串
  • q:退出

less

和more很像,不过less是分行

操作也差不多,不过less多一个 ↑↓,一次移动一行

head/tail

显示文件头/显示文件尾部

head/tail 文件名        #默认显示文件的前10行
head/tail -20 文件名        #显示文件头/尾20行
head/tail -f 文件名        #持续查看/监听文件,常用来查看文件变化时使用

ln连接

连接中还分了软链接和硬链接

硬链接

**ln 文件名 文件位置/文件名**

比较类似,创建一个一模一样的文件,并且他俩的数据,数值如何修改,都会一样(同步)。

俩文件一样,就名称不一样。

  • 源文件和硬链接文件拥有相同的Inode和Block
  • 修改任意一个文件,另一个都改变。
  • 删除任意一个,另一个都能使用
  • 硬链接标记不清,很难确认硬链接的文件位置,不建议使用
  • 硬链接不能链接目录
  • 硬链接不能跨分区

软链接

完全可以理解为linux的快捷方式。

**ln -s 文件名 文件位置/文件名**

  • 软链接和源文件拥有不同的Inode和Block
  • 两个文件修改任意一个,另一个都会改变
  • 删除软链接,源文件不受影响。但删除源文件,软链接失效无法使用
  • 软链接没有实际数据,只保存源文件的inode,不论源文件多大,软链接大小不变。
  • 软链接的权限最大是lrwxrwxrwx,但是由于没有实际数据,最终访问时需要参考源文件权限
  • 软链接可以链接目录
  • 软链接可以跨分区
  • 软链接特征明显,建议使用软链接

目录与文件都可操作的命令

rm

删除文件

-f        强制删除
-i        交互删除,删除之前会询问
-r        递归删除,可以用来删除目录

关于删除:

rmdir太笨重,不好用。使用rm -rf 指令最好,删除快。但是linux没有回收站,使用

extundelete,可以找回删除的文件。

cp

复制命令。

-a        相当于-dpr
-d        如果源文件为软链接,则复制出的目标文件也为软链接
-i        交互复制,如果文件已存在会询问你是否覆盖
-p        复制后目标文件保留源文件的属性(所有组,所属组,权限,时间)
-r        递归复制,常用来复制目录

如果需要复制的文件完全一模一样,cp -a 文件 文件位置

cp abc /opt #复制abc到 opt目录下

mv

剪切/重命名/移动

-f        强制覆盖
-i        交互移动,如果文件已存在则询问用户是否覆盖
-v        显示详细信息

权限

权限介绍

通过ls -l 查看文件权限时,前面会有10位字母。第1位表示文件名称,之后9个分成3组,分别代表:所有者权限u,所属组权限g,其他人的权限o。所有者权限>所有组权限

r:read 读

w:write 写

x:excute 执行

尚硅谷Linux基础笔记 - 图3

第1位:

表示的文件类型, linux不像win那样有许多的扩展文件表示文件类型,但是linux通过一些字母符号表示文件类型,不同命令你无法看到。

  • -:普通文件
  • b :块设备文件,例如/dev/sda1
  • c :字符设备文件、一般都是键盘,鼠标
  • d:目录文件
  • l:软链接文件
  • p:管道符文件
  • s:解套字文件,也是特殊文件,访问socket时会产生这种文件

修改权限命令

chmod

修改文件权限

chmod u+x abc #给所有者执行权限
chmod g-w,o-w abc #给所有组和其他人减少读的权限

数字权限

  • 4:代表 r 权限
  • 2:代表 w 权限
  • 1:代表 x 权限
chmod 755 abc #所有者全部权限 4+2+1 组读和执行 4+1 其他 4+1

常见的数字权限

644:文件的基本权限,代表所有者读,写4+2。所属组和其他人只读 4。

755:目录的基本权限,所有者全部4+2+1,所属组读和执行 4+1。

777:最大权限,少给对就对了。

修改所有者,所属组命令

普通用户可以修改文件的所有组和所有者,不过只能修改自己创建的文件。但是不能修改文件的所有者,哪怕是属于自己的。

chown

修改文件的所有者和所属组。

chown liao1 abc #修改文件的所有者为liao1
chown root:root abc #修改文件所有者和所有组

chgrp

修改文件的所属组。因为在linux中,创建一个用户就会添加一个用户组。所以这里也能填写liao1。

chgrp liao1 abc #修改文件的所属组为liao1

权限含义的解释

权限对文件的作用

  • 读(r) read : 可以使用查看类命令:cat,more,less,head,tail
  • 写(w) write :可以对文件中的数据进行修改:vim,echo等。注意:虽然有读写权限,但是不能删除文件本身的,只能修改文件的数据。必须有上级目录的写权限。
  • 执行(x) :有了执行权限才是可执行文件,才能执行。对于文件来说,执行权限是最大权限。

权限对目录的作用

  • 读(r) read : 可以查看目录下的内容。
  • 写(w) write :可以修改目录下的数据。比如删除,复制,剪切文件或者子目录。可以执命令:touch,rm,cp,mv等。对于目录来说,写(w)是最高权限。
  • 执行(x) :目录是不行执行的,但是给了目录执行(x)权限,就可以cd 进入目录。

目录的常见权限,0,5,7。

unmask 默认权限

umask 查看linux默认权限

umask权限计算方法

文件的默认最高权限是 666 因为执行权限有风险,需要管理员自行添加执行权限。

目录的默认最高权限是 777 因为执行权限对于目录只是进入文件夹。

例如:umask 022 实际的文件默认权限是:666-022=644。所以为:读写+读+读。

但也不完全是直接加减!

umask 033 666-033 = 633

-rw-rw-rw- 减去 ——-wx-wx 等于 -rw—r—r

配置默认方法

vim /etc/profile 进入环境变量。

尚硅谷Linux基础笔记 - 图4

常用命令

帮助命令类

man

帮助命令 man + 命令

whoami 查看当前用户

快捷键 操作
g 快速第一行
G 快速到最后一行
/+字符 向下关键词查找
?字符 向上关键词查找
n 查看下一个关键词
N 反向查看关键词
q 退出

man帮助文档级别

尚硅谷Linux基础笔记 - 图5

whatis + 命令 查看当前命令帮助级别

info

比较完整的帮助信息。文件操作和man差不多。非常完善的资料,还是建议用man

快捷键 作用
u 进入上一层信息
n 进入下一小节信息
p 进入上一小节信息

help

获取shell内置命令的帮助。如何看命令是内置命令还是外置命令呢?

type type + 命令。如果显示了文件位置,就是外部命令。没显示就是内部命令。

—help

获取简要的帮助命令。

ls --help 并且有部分命令是中文版,能看!

搜索/查找命令

whereis/which

相同点: 查找命令位置,都能找到命令文件的位置

whereis:能找到文件的帮助文档。

which:能找到文件的alias别名

locate

只能用来搜索文件名,但是通过数据库搜索,速度快,消耗资源少。数据库位置在/var/lib/mlocate/molocate/db。

高版本没有该命令,使用 yum install -y mlocate 即可安装。updatedb 更新数据库。

/etc/uodatedb.conf 中,可以查看locate数据库配置。

尚硅谷Linux基础笔记 - 图6

find ★

搜索文件的命令,非常强大。并且是用通配符查询[^通配符]

按照文件名搜索

find . -name abc #搜索 所有文件 以名称搜索 abc文件。并且是严格搜索。
-name        以名称查找
-iname        以名称查找,不区分大小写
-inum        以inode号查找(可以用来查找硬链接)

按照文件大小来搜索

find . -size 100k #搜索 所有文件 以文件大小搜索 100k的文件
[+/-]100k        +号就是大于,-号就是小于。
Linux常见字节:b,c,k,M,G

注意:如果搜索时 不加单位。默认单位可不是字节,而是 数字 * 512个字节。需要注意搜索时的大小写。

按照修改时间搜索

find . -atime -5 #搜索 所有文件 5天内创建的
-atime        按照文件访问时间
-mtime        按照数据的修改时间搜索
-ctime        按照文件状态修改时间搜索

注意:时间的计算格式有些不一样

[+/-]5
-5        搜索5天内
5        搜索第5-6天的修改文件
+5        搜索5天后的修改文件

按照权限搜索

find . -perm +444 ##搜索 所有文件 以权限 444权限搜索
-perm        权限查找
-perm +777    只要任意一个权限时是777,就会被查找到 类似 或 ||
-perm -777    全部权限是777,才会被查到 类似 与 &&

按照所有者和所属组搜索

find . -user root #根据所有者查找文件
-uid    用户id    按照用户id或者所有者是指定id的文件
-gid    组id        按照组用户id查找所属组是指定id的文件
-user    用户名        按照用户名或者所有者是指定用户文件
-group    组名        按照组用户id查找所属组是指定用户组的文件
-nouser:        查找没有所有者的文件

后三个比较常用。并且nouser 常用来查找垃圾,并且外来文件例如,光盘,u盘可能会没有所有者

按照文件类型搜索

find / -type d #查找根目录下的目录
-type d        查找目录
-type f        查找普通文件
-type l        查找软链接

逻辑运算符搜索

-a        与运算
-o        或运算
-not    not逻辑非 取反 用! 也可

-a 与运算

find . -size +2k -a -type f
查找内存大于2kb,并且文件类型为普通文件

-o 或运算

find . -name liao -o -name wuhu 
查找名称为liao 或 wuhu 的文件

-not 取反运算

find . -not -name liao
查找名称不为liao的文件

其他选项

-exec 将命令1的结果交给命令2处理

-ok 比exec命令,多一个确认流程

find . -size +2k -a -type f -exec ls -lh {} \;
将查找到的文件,再以ls -lh显示详细信息
find /opt -mtime +10 -exec rm -rf {} \;
将查到的文件,删除。

grep与通配符

grep

在文件中提取和匹配符合条件的字符串行。也是查找类语句,

find与grep的差别

  1. find是找文件,grep是找匹配的字符串。
  2. find默认不能模糊查询,grep默认模糊查询。
  3. find是用通配符进行匹配,grep是用正则表达式匹配的。
grep "123" abc #在文件abc中查找字符串123
-n        给搜索结果带上行号
-v        取反
--color=auto    匹配的内容显示颜色

sort

给字符或者数字排序

缩写 全拼释义 描述
-b —ignore-leading-blanks 排序时忽略起始的空白
-C —check=quiet 不排序,如果数据无序也不要报告
-c —check 不排序,但检查输入数据是不是已排序;未排序的话,报告
-d —dictionary-order 仅考虑空白和字母,不考虑特殊字符
-f —ignore-case 默认情况下,会将大写字母排在前面;这个参数会忽略大小写
-g —general-number-sort 按通用数值来排序(跟-n不同,把值当浮点数来排序,支持科学 计数法表示的值)
-i —ignore-nonprinting 在排序时忽略不可打印字符
-k —key=POS1[,POS2] 排序从POS1位置开始;如果指定了POS2的话,到POS2位置结 束
-M —month-sort 用三字符月份名按月份排序
-m —merge 将两个已排序数据文件合并
-n —numeric-sort 按字符串数值来排序(并不转换为浮点数)
-o —output=file 将排序结果写出到指定的文件中
-R —random-sort
—random-source=FILE
按随机生成的散列表的键值排序
指定-R参数用到的随机字节的源文件
-r —reverse 反序排序(升序变成降序)
-S —buffer-size=SIZE 指定使用的内存大小
-s —stable 禁用最后重排序比较
-T —temporary-directory=DIR 指定一个位置来存储临时工作文件
-t —field-separator=SEP 指定一个用来区分键位置的字符
-u —unique 和-c参数一起使用时,检查严格排序;不和-c参数一起用时,仅 输出第一例相似的两行
-z —zero-terminated 用NULL字符作为行尾,而不是用换行符

如果是给字符排序命令为:

sort file1        #使得文件中的内容以字符的形式排序

给数字排序

sort -n file1    #将文中的数字不识别为字符

按照月份排序

sort -M    file3    #内容写的是 Mon之类的月份,就用-M排序

k和-t参数在对按字段分隔的数据进行排序时非常有用,例如/etc/passwd文件。可以用-t 参数来指定字段分隔符,然后用-k参数来指定排序的字段。举个例子,要对前面提到的密码文件 /etc/passwd根据用户ID进行数值排序,可以这么做:

-t:使用某符号进行分割

-k:分割后的第几位

sort -t ":" -k 3 /etc/passwd

现在数据已经按第三个字段——用户ID的数值排序。 -n参数在排序数值时非常有用,比如du命令的输出。

-n:将数字排序

-r:反序排列

du -sh * | sort -nr

通配符与正则表达式

通配符

用于匹配文件名,完全匹配。使用时最好用"" 号括起来。

只要是操作文件名的命令,都可以用通配符

rm find

通配符 作用
? 匹配任意一个字符,就是一个字符。
* 匹配0个或任意多个任意字符,也就是匹配任何内容
[] 匹配中括号的任意一个字符,[abc],[123] 皆可
[-] 匹配中括号任意字符,不过是有区间范围。[1-100],[a-b]
[^] 逻辑非,表示匹配不是中括号的一个字符。[ ^ 0-9 ]

例子:

find /etc -name a[^a-c]c #查找名称中 a 没有a-c c的文件
find /root -name "a*" #查找以a开头的文件

正则表达式

用于匹配字符串,包含匹配.

常常grep使用

正则符号 作用
? 匹配前一个字符重复0次或1次
* 匹配前一个字符重复0次或任意多次
[] 匹配中括号的任意一个字符,[abc],[123] 皆可
[-] 匹配中括号任意字符,不过是有区间范围。[1-100],[a-b]
[^] 逻辑非,表示匹配不是中括号的一个字符。[ ^ 0-9 ]
^ 匹配行首
$ 匹配行尾
grep "a" abc #查找含有a的行
grep "^aa*" abc #查找开头是a,并且匹配多次a
egrep "aa?" abc

管道符

管道命令是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的操作对象。管道命令的操作符是“|”,它只能处理由前一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。前面上 -exec 一样。模式一样,格式不一样。

常用格式:

ls -l /etc | grep yum #查找etc目录下yum关键词的数据
netstat -ntlp | grep java #查看网络进程,并且只显示java的
netstat -an | grep "ESTABLISHED"|wc -l #查询当前有多少人连接服务器
ll /etc | wc #查询文件的数量

补充别名与快捷点

alias

给命令设置“小名”,别名,自定义命令格式。

注意:alias定义别名时,除非你设置的就是该命令,可以重叠名,其他时候千万别重叠到其他命令。

alias ser='service restart network' #设置 输入ser 执行重启网卡命令
使用命令命名,是临时生效的。想要永久生效必须写入环境变量文件中。

vim .bashrc #在家目录下的隐藏文件

快捷键

快捷键 作用
Tab 自动补全
ctrl+A 将光标移动到开头
ctrl+E 将光标移动到结尾
ctrl+C 强制终止当前命令
ctrl+L 清屏
ctrl+U 删除或者剪切光标之前的命令
ctrl+Y 粘贴ctrl+U剪切内容

压缩命令

.zip

win和linux都能识别的压缩格式,用zipunzip 解压缩

压缩:

zip [压缩包名称] [压缩文件]

-r 压缩目录

zip test.zip abc 123 #将abc,123文件压缩,压缩包为test.zip

解压:

unzip [选项] [压缩包名]

-d 指定压缩位置

unzip -d /tmp/ test.zip

.gz

linux最常见的压缩格式,gzip来操作

压缩:

gzip -c abc >> abc.gz #将abc添加到压缩文件,命名为abc.gz,保留源文件

-c 将文件压缩,并且保留源文件

-d+压缩包 将文件解压

-r+文件夹 将文件夹下的文件压缩

解压:

gzip -d abc.gz #解压abc.gz
gunzip abc.gz

.bz

压缩:

bzip2 -k abc #不保留源文件,进行压缩。

不能压缩目录

解压:

bzip -d abc.bz2 #解压文件
bunzip abc.bz2

.tar

也是压缩,但是打包不会压缩。

选项 描述
-A 将一个已有tar归档文件追加到另一个已有tar归档文件
-c 创建一个新的tar归档文件
-d 检查归档文件和文件系统的不同之处
-r 追加文件到已有tar归档文件末尾
-t 列出已有tar归档文件的内容
-u 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
-x 从已有tar归档文件中提取文件
-C 目录 切换到指定目录
-f 文件 输出结果到文件或设备
-j 将输出重定向给bzip2命令来压缩内容
-p 保留所有文件权限
-v 在处理文件时显示文件
-z 将输出重定向给gzip命令来压缩内容

压缩打包:

tar -cvf abc.tar abc 123 #打包文件

-c 打包

-f 指定压缩包的文件名

-v 显示过程

解压:

tar -zxf abc.tar #解压文件

-x 解打包

-f 指定压缩包名称

-v 显示过程

-t 测试,不解压,只是看包里有哪些文件

.tar.gz和tar.bz2

因为很多文件都是.tar.gz 所以,我们常用tar先打包,再用gz/bz2压缩。不过我们也有命令进行一键操作。

.tar.gz

tar -zcf liao.tar.gz /opt/ #压缩/opt下的所有文件到liao.tar.gz包中。
tar -zxf liao.tar.gz #解压包

.tar.bz2

tar -jcf liao.tar.gz /opt/ #压缩/opt下的所有文件到liao.tar.bz2包中。
tar -jxf liao.tar.gz #解压包

一些特殊操作

只看不解压

tar -ztvf test.tar.gz

指定解压位置

tar -zxf test.tar.gz -C /opt

解压指定文件到指定位置

tar -zxf test.tar.gz -C /tmp 123.txt

关机重启命令

sync

刷新文件系统缓存区,只需要知道,重启之前输入几次这个命令就好了。

shutdown

可以关机可以重启,最安全的重启命令。

shutdown [选项] [时间] [警告信息]

shutdonw -r now #立马重启
shutdonw -h 05:30 #指定时间关机

-c 取消执行的命令

-r 重启

-h 关机

reboot

直接重启,当年reboot不安全,但是官方还是说shutdown最安全。

halt/poweroff

完全不安全的关机命令

init

修改linux运行级别,也可以用来开关机。

常用网络命令

ifconfig

查看网卡信息

ping

查看网络是否通信

-c 次数 指定ping的次数

-b 用于对整个网段探索

-s 字节 指定探测包的大小

netstat

查看网络状态命令,大多时候用来看端口。需要提前安装包net-snmp,net-tools。

尚硅谷Linux基础笔记 - 图7

常用命令:

netata -ntlpu 查看网络进程

netstat -an查看网关

write

向其他用户发送信息,用于发送给其他在线的管理员发送消息。

w可以查看用户在线情况,后面带有w的是你自己

终端名称 终端说明
tty1-6 本地字符终端,用alt+F1-F6。
tty7 本地图形化终端,
pts0-255 远程终端

write [用户名] [终端名称]

write user1 tty #给user1本地终端用户发消息

wall

给所有用户发信息。

wall "123" #给所有用户发一条消息

mail

给linux用户写一封信。邮箱位置:var/spool/mail/root

写邮件

# mail user1
Subject: //邮件标题
然后可以随便写邮件内容了
用 . 来结尾即可

查看发送来的邮件

mail //查看发来的邮件
再输入邮件的标题,即可

h 列出邮件标题列表

d 删除指定邮件

save 保存邮件,s 2 /tmp/test.mail

quit 退出,并且保存操作

exit 退出,但是不保存操作

发送文件内容

发送文件内容给指定用户

mail -s "test mail" root < /root/123.txt

-s 指定邮件标题

查看日志/痕迹命令

例如:/var/log,/var/run/utmp等日志文件,用vim无法打开,无法修改,文件都是二进制的。里面会包含一些重要信息。只能用一些命令去查看。

w

查询系统中正在登录的用户,查看的日志为:/var/run/utmp。

who

和w类似,都是查询用户,不过显示内容更简单。查看的日志为:/var/run/utmp。

last

查看系统用户登录过的用户信息,正在登录的/之前登录的用户。查看的日志为:/var/log/wtmp。

lastlog

查看系统中所有用户的登录时间

lastb

查看错误登录的信息。查看的日志为:/var/log/btmp。

挂载命令

mount

linux所有存储设备必须挂载,包括硬盘。直接输入mount,查看系统中已经挂载的情况

挂载时,必须挂载到空目录

参数 描述
-a 挂载/etc/fstab文件中指定的所有文件系统
-f 使mount命令模拟挂载设备,但并不真的挂载
-F 和-a参数一起使用时,会同时挂载所有文件系统
-v 详细模式,将会说明挂载设备的每一步
-I i 不启用任何/sbin/mount.filesystem下的文件系统帮助文件
-l L 给ext2、ext3或XFS文件系统自动添加文件系统标签
-n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
-p + 数字 进行加密挂载时,从文件描述符num中获得密码短语
-s 忽略该文件系统不支持的挂载选项
-r 将设备挂载为只读的
-w 将设备挂载为可读写的(默认参数)
-L 将设备按指定的label挂载
-U 将设备按指定的uuid挂载
-o 给文件系统添加特定的选项
-O 和-a参数一起使用,限制命令只作用到特定的一组文件系统上

-o参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。以下为常用的选项。

ro:以只读形式挂载。

rw:以读写形式挂载。

user:允许普通用户挂载文件系统。

check=none:挂载文件系统时不进行完整性校验。  loop:挂载一个文件。

挂载光盘

光盘挂载的前提依然是只当光盘的设备文件名,不同版本linux,设备文件名并不相同。

mount /dev/sr0 /mnt/cdrom #挂载光盘
unmount /dev/sr0 #卸载光盘

挂载U盘

U盘和硬盘共用设备文件名,所以u盘的设备文件名不是固定的。需要手工查询。

fdisk -l #查询硬盘
插上u盘到虚拟机
mount -t vfat /dev/sdb1 /mnt/usb/ #挂载u盘
mount -t vfat -o iocharset=utf8 /dev/sdb1 /mnt/usb/ #挂载u盘,并且支持中文。

因为中文会乱码,所以需要安装中文编码和中文字体。操作终端也要支持中文。并且,在挂载的时候,需要手工指定中文编码。

卸载

如果卸载有问题
 install -y psmisc #安装包,查看文件进程pid
fuser -m /mnt/usb #查看文件的pid进程
kill -9 pid
umount /mnt/usb #卸载u盘

如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。 这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof命令的用法很简 单:lsof /path/to/device/node,或者lsof /path/to/mount/point。

挂载常用命令

自动挂载

当成检测自动挂载配置文件是否有错的命令就行了

#mount -a 
根据配置文件/etc/fstab的内容,自动挂载。
mount -t 文件系统 -L 卷标名 -o 特殊选项

挂载NTFS分区

linux对于NTFS分区是只读的,无法写。

Vim编辑器

命令模式

常见命令

  • a 光标字符后
  • A 光标字符尾
  • i 光标字符前
  • I 光标字符后
  • o 光标下插入新行
  • O 光标上插入新行

尚硅谷Linux基础笔记 - 图8

命令模式操作

移动光标

  • 上 下 左 右
  • H J K L

光标移动到文件的头或尾

  • gg 移动到文件头
  • G 移动到文件尾

删除或剪切

  • x 删除单个字符
  • nx 删除n个字符
  • dd 删除单行,并且也是剪切
  • ndd 删除多行
  • :n1,n2 删除指定范围的行
  • p 粘贴剪切的字符到光标后
  • P 粘贴剪切的字符到光标前
  • dG 从光标所在行,删除到文件尾

复制,撤销,替换

  • yy 复制单行
  • nyy 复制多行,从光标位置往下
  • u 撤销
  • ctrl+r 反撤销
  • r 替换光标处所在的一个字符
  • R 从光标所在处开始替换字符

查找关键字

  • /查找内容 从光标所在行向下查找
  • ?查找内容 从光标所在行向上查找
  • n 下一个
  • N 上一个

替换

:1,10s/w/W/g 将1到10行的w换成W

:%s/old/new/g 替换整个文件的old为new

配合正则表达式

  • :1,10s/^/#/g 注释1-10行
  • :1,10s/^#//g 取消注释
  • :1,10s/^////g 首行加入//
  • :1,10s/^////g 取消首行的//

输入模式

当输入了命令,就是进入输入模式,开始输入就好了。

编辑模式

  • :w 保存不退出
  • :q 不保存退出
  • :! 强制
    • :wq! 强制保存
    • :q! 强制不保存退出

Vim配置文件

设置参数 含义
:set nu/nouu 设置行号
:syntax on/off 设置vim颜色的开关
:set on/hlsearch 设置是否给关键词查询设置高亮显示
:set ruler 设置是否显示右下角状态栏
:set showmode 设置是否在左下角显示状态:—INSERT—
:set list 设置是否显示隐藏字符(Tab:I,回车:$)。这个命令类似cat -A

这些配置都是临时生效的,需要在~/.vimrc 中进行修改。

Vim使用技巧

导入其他内容或者命令的结果

:r 文件名 将文件导入到光标位置

:! 命令 在vim执行系统命令

:r !命令 将执行的命令结果导入到文件中

设定快捷键

:map 快捷键 快捷键执行的命令

:map ^P I#<ESC>        Ctrl+P 给这一行添加注释

^P 不是手打的,是先 ctrl+V ctrl+P。不过依然是临时生效,需要写入配置文件中。

字符串替换

:ab 源字符 替换为字符

:ab mymail 118@qq.com #字符串替换,依然是需要写入配置文件

多文件打开

vim -o 123 test 同时上下打开两个文件

vim -O 123 test 同时左右打开两个文件

ctrl+w 上下左右 就可以切换文档

Linux软件包分类

linux只有两种包,源码包和二进制包。源码包开源,能自己修改。

  • 源码包:

开源,自由度高,能自己修改代码。但是安装步骤多,新手容易出现错误,并且容易出现拼写错误。

  • 二进制包

二进制包也是rpm包,不能看到源码,安装/卸载等操作简单。自由度不是特别高,但是所需的依赖特别多。

Rpm包

rpm包名命名规则

httpd-2.2.15-15.el6.centos.1.i686.rpm

包名-版本号-发行次数-软件发行商-系统名称-硬件平台-包扩展名

已经安装的rpm包在/var/lib/rpm

rpm包的安装

rpm包位置

rpm在安装时并没有让指定位置,所以是按照包作者的意愿进行安装。

尚硅谷Linux基础笔记 - 图9

rpm包安装

rpm -ivh 包全名

-i install安装

-v 显示更详细的信息

-h 打印#显示安装进度

 --nodeps 不检测依赖性安装。安装时会检测依赖性,确定所需的底层软件是否安装。
        如果没有安装则会报错。如果我不管依赖性,想强行安装,可以使用这个选项。注意:
        这样不检测依赖性安装的软件基本是不能使用的,所以不建议这样做
      --replacefiles 替换文件安装。如果安装软件包,可是包中部分文件已经存在,那么
        正常安装时候,会报错“某个文件已经存在”从而导致软件无法安装,使用这个选项可
        以忽视这个报错,而覆盖安装
      --replacepkgs 替换软件包安装。如果软件包已经安装,此选项可以把软件包重复安装一遍。
      --force 强制安装。不管是否已经安装,都重新安装。就是—replacefiles 和
          —replacepkgs 的综合。
      --test 测试安装。不会实际安装,只是检测一下依赖性。
      --prefix 指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:
          如果指定了安装路径,软件没有安装到系统默认路径中的话,系统会找不到这些安装的
          软件,需要进行手工配置才能被系统识别。所以 rpm 包我们一般都采用默认路径安装。

启动服务

service 服务名 start|stop|restart|status
systemctl 服务名 restart

rpm包升级

rpm -Uvh 包全名

-U 升级安装

-F 也是升级安装,但是必须安装过,才会升级。

rpm包卸载

rpm -e 包名

—nodeps 不检查依赖性
-e 卸载

rpm包查询

查询是否安装了某软件包

rpm -q 包名
rpm -aq | grep httpd #查询所有包,并且显示httpd
  • -q 查询
  • -qa 查询所有
  • -qi 查询软件的信息
  • -qip 包全名 查询没有安装的软件包
  • -ql 列出软件包中所有的文件列表和软件所安装的目录
  • -qlp 包全名 查询还没有安装的软件包中的文件列表和打算安装的位置
  • -qf 系统文件名 查询系统文件属于哪个软件包
  • -qR 查询软件包的依赖性

rpm包验证

rpm -Va #检验本地已经安装的所有软件包

-V 检验指定RPM包中的文件

-Vf 检验某个系统文件是否被修改

出现了提示信息,我们来解释下最前面共有 8 个信息内容,是表示验证内容的。文件名前面的 c
是表示这是个配置文件(configuration)。最后是文件名。那么验证内容中的 8 个信息的具体内容
  如下:
   S 文件大小是否改变
   M 文件的类型或文件的权限(rwx)是否被改变
   5 文件 MD5 校验和是否改变(可以看成文件内容是否改变)
   D 设备的主从代码是否改变
   L 文件路径是否改变
   U 文件的属主(所有者)是否改变
   G 文件的属组是否改变
   T 文件的修改时间是否改变
apache 配置文件的文件类型是 c,那么还有哪些文件类型呢?
   c 配置文件(config file) 
   d 普通文档(documentation) 
   g “鬼”文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含 
   l 授权文件(license file) 
   r 描述文件(read me)

rpm数字证书

刚刚的校验方法只能对已经安装的 RPM 包中的文件进行校验,但是如果 RPM 包本身就被动过手脚,那么校验就不能解决问题了。我们就必须使用数字证书验证了。数字证书保证你的rpm安装包是安全的,没被修改过

数字证书有如下特点

  • 首先必须找到原厂的公钥文件,然后进行安装
  • 再安装 RPM 包是,会去提取 RPM 包中的证书信息,然后和本机安装的原厂证书进行验
  • 证如果验证通过,则允许安装;如果验证不通过,则不允许安装并警告

如何导入证书

ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #证书位置
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #导入证书
rpm -qa | grep gpg-pubkey #查询安装好的数字证书

rpm包中文件的提取

cpio

命令本身是用来备份的,但是及其不好用,只需要知道他的提取命令就好了。

rpm2cpio 包全名 | cpio -idv . 文件绝对路径

rpm包在线安装(yum)

yum 源配置文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是“*.repo”。

搭建本地yum源

放入放盘,并且挂载到指定地点。

mount /dev/sr0 /mnt/cdrom #挂载光盘
修改yum.repos.d目录下的文件后缀名/转移到其他位置
修改CentOs-Media.repo中的文件
yum list #查看配置的yum包

yum命令

yum list             #查看可用软件包列表
yum search 关键字       #用命令查询包名
yum info samba         #查询软件包信息
yum install -y 包名  #安装包
yum update -y         #升级本机所有的安装包

yum组管理命令

yum grouplist                #列出所有的可用软件组列表
yum groupinfo 软件组名         #列出软件组中包含的软件
yum groupinstall 软件组名     #安装指定软件组文件
yum groupremove 软件组名    #卸载指定软件组

源码包安装

我该选择哪个安装包?

简单来说:个人实验用rpm,企业环境用源码包。

如果软件包是给大量客户提供访问,建议使用源码包安装,如LAMP环境搭建,因为源码包效率更高。如果软件包是给Linux底层使用,或只给少量客户访问,建议使用rpm包安装,因为rpm包简单。

RPM包和源码包可以一起安装,不会报错,但是别这样做!

源码包安装流程

这里以apache举例

  1. 下载,上传软件包
  2. 解压缩,进入解压目录
  3. ./configure 编辑前准备
    • 检查环境是否符合安装要求
    • 定义需要的功能选项,./configure —prefix=安装路径
  4. make 编译
    • 编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。
  5. make clean:清空编译内容(非必需步骤)
    • 如果在“./configure”或“make”编译中报错,那么我们在重新执行命令前一定要记得执行 make clean 命令,它会清空 Makefile 文件或编译产生的“.o”头文件。
  6. make install 编译安装
    • 这才是真正的安装过程,一般会写清楚程序的安装位置。如果忘记指定安装目录,则可以把这个命令的执行过程保存下来,以备将来删除使用。

卸载源码包

直接删除文件包的目录即可

打入补丁

补丁的作用就不多说了。他不像win那样,点一点就能安装补丁。linux的安装和win非常不一样。

linux中补丁太少了,并且如果有补丁大多情况下会给你比较完整的补丁操作流程。

diff -Naux old文件系统路径 new文件系统路径 > buding.txt
patch -p3 < buding.txt

脚本安装程序

非常少见,非常麻烦。自动化安装,还是安装了rpm或者源码包。不如一些容器之类的。

用户和权限

根据职位来分配你用户的权限。

id 用户名    #查看用户信息

用户相关文件

vi /etc/passwd

可以看到很多的用户,这些用户都不能动。一个用户代表一个服务。并且大部分不能登录。

root:x:0:0:root:/root:/bin/bash

第一列:root 用户名

第二列:x 密码位

第三列:0 用户ID

第四列:0 初始组ID

第五列:root 用户说明

第六列:/root/ 用户的家目录

第七列:/bin/bash 用户登录权限。如果是/bin/bash 就可以登录。/sbin/nologin 则无法登录。

  • 0 超级用户,UID为0,就代表这个账号是管理员账号。所以将该账号设置为管理员权限的话,将UID改为0也行。
  • 1-499 系统用户(伪用户)UID,这些是专门用来服务于系统服务的。不是用来运行/登录的。1-99是系统保留的账号,系统会自动创建。100-499预留给用户创建
  • 500-65535 普通用户UID,建立普通用户UID从500开始,最大到65535。

vi /etc/shadow 影子文件

里面保存了用户的密码。只有管理员用户才能打开。

root:$6$XiHn3Abh$prKcb2uSJ7lwO5Nr0rysYIXdtkkpuAqVl7FTQeot15jlCGwbCaibWBS9ncrIr6aaPBhBmiLatPsc8khPaC7A:18938:0:99999:7:::

第一列: 用户名

第二列: 加密密码

第三列: 密码最近更新时间

第四列: 两次密码修改间隔时间

第五列: 密码更换时间(以天为单位,设置密码后需要在这么多天里更改一次密码)

第六列: 密码修改到期前的警告天数(快到期时给你密码到期提示)

第七列: 密码过期的宽限天数

第八列: 密码失效时间(时间戳)

第九列: 保留

vi /etc/group 组信息文件

root:x:0:root

第一列: 组名

第二列: 组密码位

第三列: GID

第四列: 此组中支持的其他用户,附加组是此组的用户

初始组: 每个用户初始组只有一个,初始组只能有一个,一般都是和用户名相同的组作为初始组。

附加组: 每个用户可以属于多个附加组。要把用户加入组,都是加入附加组。

/etc/gshadow

组密码文件,不建议修改。

/etc/skel 用户模板目录

当我们创建用户的时候,都会添加一个家目录文件夹,其中并不是空的。里面会有一些配置文件,这个skel有什么,家目录就有什么。

用户管理命令

1.手动添加用户

尚硅谷Linux基础笔记 - 图10

2.useradd命令添加

建议不用添加任何选项,直接输入即可。

useradd 选项 用户名

常用选项:

-u 550 指定UID

-g 组名 指定初始组

-G 组名 指定附加组

-c 说明 添加说明

-d 目录 手工指定家目录

-s shell /bin/bash

3.修改useradd默认值

vi /etc/default/useradd

GROUP=100 #默认用户组

HOME=/home #用户家目录位置

INACTIVE=-1 #过期宽限天数,/etc/shadow第七个字段,写的-1实际上就是没有天数。不会失效

EXPIRE= #密码失效时间,默认没天数,并且使用时间戳来表示,默认值为空。也就是不会失效

SHELL=/bin/bash #用户默认的shell。/bin/bash是linux的标志shell,所以所有新建立的用户默认都有shell权限

SKEL=/etc/skel #定义目录模板的位置

CREATE_MALL_SPOOL=yes #是否给新用户建立邮箱

/etc/login.defs 修改登录配置文件

MAIL_DIR /var/spool/mail 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000 指定用户最大的 UID 为 60000。
GID_MIN 500 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000 用户 GID 最大为 60000。
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077 用户主目录的权限默认设置为 077。
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

设定密码

passwd 选项 用户名        #修改用户密码
passwd                    #修改当前密码

选项:

-l: 暂时锁定用户

-u: 解锁用户

—stdin: 可以将通过管道符输出的数据作为用户的密码

change -d 0 user1        #用户登录就得改密码
echo "123"    | passwd --stdin user1        #修改用户的密码为user1

用户信息更改

userdel -r 用户名        #删除用户
su [选项] 用户名           #切换用户身份
选项:
-:        #选项只使用"-"代表连带用户的环境变量一起切换
-c:        #仅执行一次命令,而不切换用户身份

组管理命令

groupadd [选项] 组名        #添加用户组
groupadel    组名             #删除用户组

将用户添加进组/从组中删除

gpasswd -a liao123    #将用户添加进组
gpasswd -d liao123    #将用户从组中删除

注意: 如果使用命令useradd -g zu1 liao123 则是设置了liao123用户的初始组为zu1,此时你无法直接删除该组,需要将liao123移除了才能删除。

ACL权限

有时候想额外给一个用户权限,但是linux还无法设置(因为linux只能给创建者和组来设置权限),当这个用户权限需要比这个组更低时,就需要用到ACL额外设置权限。

查看是否开启acl

deump2fs -h /dev/sdb1    #查询分区详细文件系统信息

尚硅谷Linux基础笔记 - 图11

如果没有这个ACL,则手工开启分区的ACL权限。

mount -o remount,acl /    #重新挂载根分区,并挂载加入acl权限
vi /etc/fstab    #进入挂载文件,修改使得默认挂载
UUID=123123123    /    ext4    defaults,acl    1 1
mount -o remount /    #重载挂载文件

ACL基本命令

getfacl 文件名 #查询文件的ACL权限

setfacl 选项 文件名 设定ACL权限

-m    #设定ACL权限

-b     #删除ACL权限

-x:用户    #删除单个用户的ACL权限
setfacl -m u:liao123:rw /test    #test目录赋予liao123用户,读写权限。
setfacl -m u:liao123:rw -R /test    #给予/test目录下以递归的方式给所有的文件夹权限。只是对已经创建的
setfacl -m d:u:liao123:rw -R /test    #只对以后新建的文件生效
setfacl -x u:liao123 /test    #删除指定用户和用户组的ACL权限
setfacl -b u:liao123 /test    #删除所有的ACL权限

最大有效权限

setfacl -m m:rx /test    #设置mask权限位r-x。
getfacl project/        #查看ACL权限配置

sudo

有时候普通用户需要执行一些root用户才能执行的命令,比如重启,删除一些文件等。root用户通过visudo命令,编辑文件/etc/sudoers,来给用户添加权限。

root            ALL=(ALL)                     ALL
#用户名  被管理主机的地址=(可使用的身份)  授权命令(绝对路径)
%wheel      ALL=(ALL)                      ALL
#%组名  被管理主机的地址=(可使用的身份)  授权命令(绝对路径)
 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%” 
 用户可以用指定的命令管理指定 IP 地址的服务器。这里的 IP 指定的是用户可以管理哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。
 可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略
 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径

比如我们给普通用户重启权限

visudo    #进入配置文件
#直接在后面添加
user    ALL=/sbin/shudown -r now
#切换账号都user
sudo -l    #查看能使用的命令,会先让你输入一次密码

尚硅谷Linux基础笔记 - 图12

在比如给用户管理web服务器的权限,让普通用户可以自行重启apache服务。

  1. 使用apache管理脚本
  2. 可以修改apache配置文件
  3. 可以更新网页内容
visudo    #进入sudo配置文件
user 192.168.0.101=/etc/rc.d/init.d/httpd reload, \
/etc/rc.d/init.d/httpd configtest#给user用户,在当前ip时,可以使用httpd下的重启和检测语法错误命令
user 192.168.0.101=/binvi /etc/httpd/conf/httpd.conf    #给用户user可以使用root身份使用vi编辑apache配置文件

以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。

条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 user1 对此目录具有写权限或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务更新网页

授权user用户可以添加其他普通用户

user ALL=/usr/sbin/useradd        #赋予user添加用户权限.命令必须写入绝对路径
user ALL=/usr/bin/passwd    #赋予改密码权限,取消对 root 的密码修改
user ALL=/usr/bin/passwd [A-Za-z]*,  !/usr/bin/passwd "",  !/usr/bin/passwd root
#进入user用户
sudo /usr/sbin/useradd ee  #普通用户使用 sudo 命令执行超级用户命令

特殊权限

SetUID,SetGID,Sticky BIT。这几个能不用不用,SetUID SetGID 很危险,不允许手工赋予。

设定文件特殊权限

特殊权限这样来表示:

4 代表 SUID

2 代表 SGID

1 代表 SBIT

[root@localhost ~]# chmod 4755 ftest 
#赋予 SUID 权限
[root@localhost ~]# chmod 2755 ftest 
#赋予 SGID 权限
[root@localhost ~]# mkdir dtest
[root@localhost ~]# chmod 1755 dtest/
#SBIT 只对目录有效,所以建立测试目录,并赋予 SBIT

SetUID

例如:普通用户没有/etc/passwd /etc/shadow 文件的w权限,那他的密码怎么写进去的

ll /etc/passwd        #此时的权限
-rw-r--r-- 1 root root 1728 1 月 19 04:20 /etc/passwd

ll /etc/shadow        #shadow没任何权限
---------- 1 root root 1373 1 月 19 04:21 /etc/shadow

chmod u+s /usr/bin/passwd    #给passwd文件添加执行权限
ll /usr/bin/passwd     #此时多了一个小写的s
-rwsr-xr-x 1 root root 25980 2 月 22 2012 /usr/bin/passwd

当普通用户使用passwd命令时,会以创建者root身份执行,类似一瞬间的变成root用户,不过也就只能使用passwd 命令,不能额外添加参数。

危险setuid

千万不要给一些编辑命令权限

[root@localhost ~]# chmod u+s /usr/bin/vim    #给vim添加权限
[root@localhost ~]# ll /usr/bin/vim    #此时可以用vim打开任何文件!!!!
-rwsr-xr-x 1 root root 1847752 4 月 5 2012 /usr/bin/vim

有几点建议:

  • 关键目录应严格控制写权限。比如“/”、“/usr”等;
  • 用户的密码设置要严格遵守密码三原则;
  • 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限
#!/bin/bash
# Author: shenchao (E-mail: shenchao@atguigu.com)
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
#做循环,每次循环取出临时文件中的文件名
do
     grep $i /root/suid.list > /dev/null
    #比对这个文件名是否在模板文件中
             if [ "$?" != "0" ]
      #如果在,不报错
       then
         echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
         #如果文件名不再模板文件中,则报错。并把报错报错到日志中
       fi
done
rm -rf /tmp/setuid.check
#删除临时文件

SetGID

SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。

1)针对文件的作用

如果针对文件,SGID 的含义如下:

  • 只有可执行的二进制程序才能设置 SGID 权限
  • 命令执行者要对该程序拥有 x(执行)权限
  • 命令执行在执行程序的时候,组身份升级为该程序文件的所属组
  • SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db 
-rw-r----- 1 root slocate 1838850 1 月 20 04:29 /var/lib/mlocate/mlocate.db
#大家发现属主权限是 r、w,属组权限是 r,但是其他人权限是 0:
[root@localhost ~]# ll /usr/bin/locate 
-rwx--s--x 1 root slocate 35612 8 月 24 2010 /usr/bin/locate

当普通用户 user1 执行 locate 命令时,会发生如下事情:

  • /usr/bin/locate 是可执行二进制程序,可以赋予 SGID
  • 执行用户 user1 对/usr/bin/locate 命令拥有执行权限
  • 执 行 /usr/bin/locate 命令时,组身份会升级为 slocate 组,

而 slocate 组 对/var/lib/mlocate/mlocate.db 数据库拥有 r 权限,

所以普通用户可以使用 locate 命令查询mlocate.db 数据库

  • 命令结束,user1 用户的组身份返回为 user1 组

2)针对目录的作用

如果 SGID 针对目录设置,含义如下:

  • 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的属组
  • 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组

这样写的实在太难看明白了,举个例子:

[root@localhost ~]# cd /tmp/
*#进入临时目录做此实验。因为临时目录才允许普通用户修改*

[root@localhost tmp]# mkdir dtest
*#建立测试目录*

[root@localhost tmp]# chmod g+s dtest
*#给测试目录赋予 SGID*

[root@localhost tmp]# ll -d dtest/
drwxr-sr-x 2 root root 4096 1 月 20 06:04 dtest/
*#SGID 已经生效*

[root@localhost tmp]# chmod 777 dtest/
*#给测试目录权限,让普通用户可以写*

[root@localhost tmp]# su – user1
*#切换成普通用户 user1*

[user1@localhost ~]$ cd /tmp/dtest/
*#普通用户进入测试目录*

[user1@localhost dtest]$ touch abc
*#普通用户建立 abc 文件*

[user1@localhost dtest]$ ll
总用量 0 
-rw-rw-r-- 1 user1 root 0 1 月 20 06:07 abc
*#abc 文件的默认属组不再是 user1 用户组,而变成了 dtest 组的属组 root*

Sticky BIT 仅目录

粘着位,也简称为 SBIT。SBIT 目前仅针对目录有效,它的作用如下:

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

文件系统属性 chattr 权限

1、命令格式

[root@localhost ~]# chattr [+-=] [选项] 文件或目录名

选项:

+: 增加权限

-: 删除权限

=: 等于某权限

i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据

如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。

a: 如果对文件设置 a 属性,那么只能在文件中增加数据(此时vim无法保存,用echo),但是不能删除也不能修改数据

如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删 除

e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行

存储的,而且不能使用“chattr -e”命令取消 e 属性。

2、查看文件系统属性 lsattr

[root@localhost ~]# lsattr 选项 文件名

选项:

-a 显示所有文件和目录

-d 若目标是目录,仅列出目录本身的属性,而不是子文件的

chattr +i test123    #给test123目录添加i权限
#此时ll ls-a都无法查看到i权限必须使用
lasttr -a test123
#此时在test123内的文件,不能添加修改删除移动。
chattr +i test456    #给test456目录添加a权限
#添加a权限,此时可以使用echo添加给文件添加字符,并且可以复制/新建文件了。

文件系统管理

Linux文件系统的特性

  • super block(超级块):记录整个文件系统的信息,包括 block 与 inode 的总量,已经使用的 inode 和 block 的数量,未使用的 inode 和 block 的数量,block 与 inode 的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等。
  • date block(数据块,也称作 block):用来实际保存数据的(柜子的隔断),block 的大小(1KB、2KB 或 4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。每个blcok 只能保存一个文件的数据,要是文件数据小于一个 block 块,那么这个 block 的剩余空间不能被其他文件是要;要是文件数据大于一个 block 块,则占用多个 block 块。Windows 中磁盘碎片整理工具的原理就是把一个文件占用的多个 block 块尽量整理到一起,这样可以加快读写速度。
  • inode(i 节点,柜子门上的标签):用来记录文件的权限(r、w、x),文件的所有者和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。

常见的硬盘管理命令

df

统计分区的占用状况和使用率。统计空间大小,统计的剩余空间是准确的。查剩余和占用的空间,用df。

df -hT #查看内存使用情况
  • -a 查找全部的
  • -h 良好的单位显示
  • -T 多了文件系统一列

du

统计文件的大小,并且统计的文件大小非常准确。查询文件的准确的大小,用du。

df是统计空间大小,统计的剩余空间是准确的。

du是统计系统文件的大小,统计的文件大小是准确的

du -h #显示文件的占用量
  • -a 显示当前文件夹中全部的文件
  • -h 良好的单位显示
  • -s 统计总占用量

fsck

文件系统修复命令。

dumpe2fs

查询显示磁盘状态,只能看ext类型文件系统。

dumpe2fs /dev/sdb1 #查看磁盘的状态信息

stat

查看文件的详细时间,一些详细的参数

stat 文件名

file/type

file 判断文件类型,type 判断命令类型。

file test.txt #判断文件的类型
type ls #查看命令的类型,会显示命令的位置等信息。

手工分区

分区流程

fdisk -l    #查看分区
fdisk /dev/sdb #进行磁盘分区

尚硅谷Linux基础笔记 - 图13

n 新建分区

p 选择分区编号

选择分区(默认1)

选择起始柱面(默认1)

选择last扇区(默认1):+2G

尚硅谷Linux基础笔记 - 图14

格式化分区

格式化,建立文件系统后,才能进行使用,并且扩展分区无法格式化。

mkfs -t ext4 /dev/sdb1 
-t 文件系统:   指定格式化成哪个文件系统,如 ext2,ext3,ext4
-b 字节:         指定 block 块的大小
-i 字节:         指定“字节/inode”的比例,也就是多少个字节分配一个 inode
-j:           建立带有 ext3 日志功能的文件系统
-L 卷标名:     给文件系统设置卷标名,就不使用 e2label 命令设定了

自动挂载

搞了新分区,一重启就没有了。所以设置下自动挂载。但是禁止挂载u盘,光盘等设备。

vim /etc/fstab #该文件中设置自动挂载
按照格式写入对应的信息
设备文件名        挂载点        文件系统        挂载选项        是否可以备份/检测
最后两个数字,通向为1 2 即可。
mount -a #检查是否出错。

关于uuid:

uuid写不写都可以,可以使用命令查看:

dumpe2fs /dev/sdb5
ls -l /dev/disk/by-uuid/

fstab修复

fstab文件非常危险,非常容易改错!之后需要root账户修复,而且必须在本机才能修复。

  1. 直接重启,输入root密码
  2. 此时因为错误的启动,导致所有的文件是只读,模式,需要通过指令修改。
  3. mount -o remount,rw / 重新挂载,并且设置权限。
  4. 此时进入 /etc/fstab 文件,开始找错纠错。

parted命令分区

    一般情况下,我们都是选择使用**fdisk**工具来进行分区,但是目前在实际生产环境中使用的磁盘空间越来越大,呈TiB级别增长;而常用的**fdisk**这个工具对分区是有大小限制的,它只能划分**小于2T**的磁盘,所以在划**大于2T**磁盘分区的时候**fdisk**就无法满足要求了;这个时候有2个方法,其一是通过卷管理来实现,其二就是通过**parted**工具来实现对**GPT**磁盘进行分区操作;这里我们采用**parted**的方法来实现管理。

创建分区

创建分区前,先把之前的自动挂载分区去掉。

parted /dev/sdb #进入建立分区界面
(parted)print #查看分区
(parted)mklabel gpt #修改分区表命令
Igonre
Yes
然后重启进行其他操作
(parted)mkpart #分区名称
disk1
ext2
(parted)mkfs
Yes
1
ext2

调整分区大小

先卸载分区
#parted
(parted) resize
1
1M
6GB

删除分区

#parted
(parted) rm
1

分配swap分区

#fdisk /dev/sdb
n
p
+1G
t
82
w
#mkswap /dev/sdb1
#swapon /dev/sdb1

高级文件系统管理

磁盘配额 X

限制用户和用户组的磁盘使用空间。

LVM

LVM简单流程

给硬盘创建PV物理卷——将物理卷放入到VG卷组中——在卷组中创建LV逻辑卷——设置物理扩展(PE)

物理卷(PV):就是用硬盘创建的内存卷

卷组(VG):多个物理卷合起来的卷组,可以是来自不用硬盘/分区的物理卷组成。

逻辑卷(LV):将VG卷组中的内存划分成逻辑卷,才能真正被linux使用。此时的逻辑卷可以根据卷组大小,来增加逻辑卷内存。

物理扩展(PE):我们的文件就是存储在PE中的,默认为4MB

创建物理卷

pvcreate /dev/sdb2 #创建物理卷
pvcan / pvdisplay #查看物理卷的信息
pvremove /deb/sdb2 #删除物理卷

创建卷组

vgcreate -s 4MB vgs /dev/sdb1 #创建卷组 -s是指定PE大小,可有可无
vgcan/vgdiplay #查看vg卷组的信息
vgextend vgs /dev/sdb2 #扩容卷组
vgreduce vgs /dev/sdb2 #缩容卷组,不建议

创建逻辑卷

lvcreate -L 5G vgs -n lvs vgs #创建逻辑卷
-L        容量
-l        个数
-n        指定名称
lvresize -L 10G /dev/vgs/lvs #调整逻辑卷大小

格式化

mkfs -t ext4 /dev/sdb1/vgs/lvs #格式化为ext4
resize2fs /dev/vgs/lvs #如果修改过逻辑卷内存,使用该命令更新内存

启动引导与修复

Linux默认有7个运行级别

运行级别 含义
0 关机
1 单用户模式,可以理解为windows的安全模式
2 不完全命令行模式,不含NFS服务
3 完全的命令行模式,就是标准字符界面
4 系统保留
5 图形模式
6 重启动

可以使用 runlevel 命令来查看系统的运行级别,命令如下:

runlevel    #默认为:
N    3
#N 代表进入这个级别前,上一个是哪个级别。3 代表当前级别
#“N”就是 None 的意思,也就是说系统是开机直接进入的 3 运行级别

我们可以手动改变当前的运行级别:

init 5
#此时会转变为图形模式,但是因为我们并没有安装图形
init 0         #关机
init 6        #重启

默认运行级别

知道了运行级别的作用,我们回到系统启动过程中来。/etc/init/rcS.conf 配置文件调用

/etc/inittab 配置文件的目的就是为了确定系统的默认运行级别,也就是系统一开机后会进入那个运行级别。

systemctl set-default multi-user.target #设置默认第三启动级别
systemctl set-default graphical.target #设置默认第五启动级别

自启文件rc.local

/etc/rc.d/rc.local 文件这个配置文件会在用户登陆之前读取,这个文件中写入什么命令,在每次系统启动时都会执行一次。也就是说,我如果有任何需要在系统启动就运行的工作,只需要写入/etc/rc.d/rc.local 这个配置文件即可。

该文件因为是shell脚本,所以可以写一些自启动命令,比如tomcat nginx重启命令。启动sh脚本命令等!

启动引导程序

grub 的作用有以下几个:第一是加载操作系统的内核;第二是拥有一个可以让用户选择的菜单,来选择到底启动哪个系统;第三还可以调用其他的启动引导程序,来实现多系统引导。grub 的配置文件主要是放置在/boot/grub/目录中的,我们来看看这个目录下到底有哪些文件吧。

尚硅谷Linux基础笔记 - 图15

grub配置文件

grub的配置文件的软件链接有多个

/etc/grup.conf,/boot/grub/menu.lst 这两个建议使用第一个,好记。

尚硅谷Linux基础笔记 - 图16

centos6的grep文件为:

/boot/grub/grub.conf

centos78的grep文件为:

/bbot/grub2/grub.cfg

grub加密

grub 菜单整体加密.如果只是加密单个启动菜单,grub 的编辑模式是不能锁定的,还是可以按“e”键进入编辑模式。而且进入编辑模式后,是可以删除 password 字段的,按“b”(boot 启动)键就可以不用密码直接进入系统。这时就需要给 grub 菜单整体加密了,整体加密后,如果想进入 grub 编辑界面必须输入正确的密码。加密方法其实只是把 password 字段换个位置而已。

grub2-mkpasswd-pbkdf2    #设置哈希密码

尚硅谷Linux基础笔记 - 图17

将生成的哈希值复制粘贴到grep文件中。千万不要添加lock命令!!!!

单用户密码

Linux 的单用户模式有些类似 Windows 的安全模式,只启动最少的程序用于系统修复。在单用户模式(运行级别为 1)中,Linux 引导进入根 shell,网络被禁用,只有少数进程运行。单用户模式可以用来修改文件系统损坏、还原配置文件、移动用户数据等。

启动时, e编辑模式, 选择 kernel xxx ,e编辑, 输入 空格1 ; esc返回 ; 选择kernel xx , b启动此时免密直接root登录,此时重设密码并重启。

光盘修复模式

重要系统文件丢失,导致系统无法启动

如果系统中的重要系统文件丢失,当然会导致系统无法正常启动。这时也可以利用光盘修复模式修复。我们假设把/etc/inittab 文件丢失了,我们通过系统启动过程知道这个文件是定义系统默认运行级别的,如果丢失了这个文件,系统当然不能正常启动,这时就需要进入光盘修复模式中了。然后需要利用 chroot 命令。

chroot /mnt/sysimage

修改root目录位置,此时我们可以进行任何操作了!修改文件,修改密码等!!!但是在已经运行的服务器上千万不要遇到这种情况,不然距离离职不远了。