Linux学习笔记
本笔记是学习 刘遄老师 的《Linux就该这么学》一书所做,书籍地址:https://www.linuxprobe.com/docs/LinuxProbe.pdf
本文以centOS发行版为例,软件仓库等可能不适用于其他发行版
----------------------------------------------------------------------------------------------------------
du 命令用查看分区或目录所占用的磁盘容量大小,英文全称为“disk usage”,语法:
du -h 目录
上面会列出其下所有层级文件夹和文件大小,如果只看当前目录则加s参数,即du -sh 目录
--------------------------------
passwd 其他参数用法
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
-S 显示用户的密码是否被锁定,执行后,用户名后面紧跟的 项 即是状态:L为锁定,P为允许登录
-----------------------------------------------------------------------------------------------------------
安装软件的方法:
1.RPM 有点像 Windows 系统中的控制面板,会建立统一的数据库,详细记录软件信息并 能够自动分析依赖关系。
常用的 RPM 软件包命令
rpm –ivh filename.rpm 安装软件
rpm –Uvh filename.rpm 升级软件
rpm -e filename.rpm 卸载软件
rpm –qpi filename.rpm 查询软件描述信息
rpm -qpl filename.rpm 列出软件文件信息
rpm -qf filename 查询文件属于哪个 RPM
2.yum软件仓库( 或者其接替者 dnf,命令兼容)
尽管 RPM 能够帮助用户查询软件之间的依赖关系,但问题还是要运维人员自己来 解决,而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件依然很繁琐。
Yum 软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安 装到系统。
常见的 Yum 命令
yum repolist all 列出所有仓库
yum list all 列出仓库中所有软件包
yum info 软件包名称 查看软件包信息
yum install 软件包名称 安装软件包
yum reinstall 软件包名称 重新安装软件包
yum update 软件包名称 升级软件包
yum remove 软件包名称 移除软件包
yum clean all 清除所有仓库缓存
yum check-update 检查可更新的软件包
yum grouplist 查看系统中已经安装的软件包组
yum groupinstall 软件包组 安装指定的软件包组
yum groupremove 软件包组 移除指定的软件包组
yum groupinfo 软件包组 查询指定的软件包组信息
重要命令:
---------------------------存储结构与管理硬盘----------------------
RHEL 7/8 系统中一个比较大的变化就是使用了 XFS 作为文件系统,这不同于 RHEL 6 使用的 Ext4。
我个人认为 XFS 虽然在性能方面比 Ext4 有所提升,但绝不是压倒性的,因此XFS 文件系统最卓越的亮点应该当属可支持高达 18EB 的存储容量吧。
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 当文件系统发生错误时,将一些丢失的文件片段存放在这里
---------物理设备的命名规则--------
IDE 设备(已不常见) /dev/hd[a-d] | SCSI/SATA/U 盘 /dev/sd[a-z] | Virtio 设备(一种虚拟化设备) /dev/vd[a-z] | 软驱/dev/fd[0-1]
打印机/dev/lp[0-15] | 光驱/dev/cdrom | 鼠标/dev/mouse | 磁带机/dev/st0 或/dev/ht0
主分区或扩展分区的编号从 1 开始,到 4 结束;逻辑分区从编号 5 开始。
硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中 第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记(Mast Boot Record,MBR) 录需要占用 446 字节,分区表占用 64 字节,结束符占用 2 字节;其中分区表中每记录一个分 区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区 就是 4 个主分区。
注意误区:
1./dev 目录中 sda 设备之所以是 a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。
2.分区的数字编码不一定是强制顺延下来的,也有可能是手工指定的。因此 sda3 只能表示是编号为 3 的分区,而不能判断 sda 设备上已经存在了 3 个分区。
mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”,
-t参数:指定文件系统的类型(新的linux版本可自动判断,已不常用)
-a 参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无被疏漏挂载的设备文件,如果有,则进行自动挂载操作。
blkid 命令用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [设备名(要写绝对全路径)]”。可用 blkid 命令来查询设备 UUID,只输blkid显示全部的
如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab 文件中。
例如: /dev/sdb2 /backup ext4 defaul ts 0 0
写入到/etc/fstab 文件中的设备信息并不会立即生效,需要使用 mount -a 参数进行自动挂载
umount 命令用于卸载设备或文件系统,英文全称为“un mount”,语法格式为“umount [设备文件/挂载目录]”。
df 命令用于查看已挂载的磁盘空间使用情况,英文全称为“disk free”,语法格式为“df -h”。-h参数使用易读单位显示
lsblk 命令用于查看已挂载的磁盘的空间使用情况,英文全称为“list block id”,以树状图的形式列举
--------------一般分区操作----------------------------------------------------------------------------------
fdisk 命令用于新建、修改及删除磁盘的分区表信息,英文全称为“format disk”,语法格式为“fdisk 磁盘名称”。
fdisk 命令中的参数以及作用:
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出
分区例子:
1. fdisk /dev/sdb
2. 看到提示信息后输入参数 p 来查看 硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息
2-0.输入 o
来新建一个 MBR 分区表并清除磁盘上的所有数据;输入 g
来新建一个GUID分区表 (GPT)。 如果已创建所需的分区表,请跳过此步骤。
3. 输入参数 n 尝试添加新的分区
4. 系统会要求用户是选择继续输入参数 p 来创建主分区, 还是输入参数 e 来创建扩展分区。这里输入参数 p 来创建一个主分区
5.系统要求用户先输入主分区的编号,这里输入1或者直接回车默认1
6. 接下来系统会提示定义起始的扇 区位置,这不需要改动,敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲 扇区的位置
7. 最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区 的大小是多少。我们不用去计算扇区的个数,只需要输入+2G 即可创建出一个容量为 2GB 的硬盘分区。
8. 再次使用参数 p 来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起 始扇区位置为 2048、结束扇区位置为 4196351 的主分区了。
9. 这时千万不要直接关闭窗口,而 应该敲击参数 w 后按回车键,这样分区信息才是真正地写入成功
在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1 设备文 件。可以使用 file 命令查看该文件的属性,但我在讲课和工作中发现,有些时候系统并没有 自动把分区信息同步给 Linux 内核,而且这种情况似乎还比较常见(但不能算作严重的 bug)。 可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令
10.格式化操作,命令是mkfs
这个 mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,因为在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab 键,会显示出这些命令,如mkfs.ext4 mkfs.xfs
用起来也非常简单 — mkfs.文件类型名称。例如要将分区为 XFS 的文件系统进行格式化,
则命令应为 mkfs.xfs /dev/sdb1
11.建立swap交换分区,按照上面步骤2-9,再建立一个主分区
建好后需要改一下分区类型,输入l可查看支持的类型及对应的id(例如82 linux swap ),然后输入t回车,提示输入分区号,这里输入2回车,再输入82回车,输入p查看改的类型(id和type)是否正确,正确的话输入w回车写入生效即可,
在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍。
mkswap 命令用于对新设备进行交换分区格式化,英文全称为“make swap”,语法格式为“mkswap 设备名称”。
mkswap /dev/sdb2
swapon 命令用于激活新的交换分区设备,英文全称为“swap on”,语法格式为“swapon设备名称”。
swapon /dev/sdb2
12. 如果是UEFI 引导需要额外的分区,类型为: EFI(FAT-12/16/32)
13.想要分区在重启后依然生效,需要编辑/etc/fstab文件写入相关配置
14.a
可以将一个 MBR 分区设置为可启动分区
--------------------------------------------------------------------------------------------------------------------
du 命令用查看分区或目录所占用的磁盘容量大小,英文全称为“disk usage”,语法格式为“du -sh 目录名称”。可以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别
占用的空间大小,在 1s 之内就能找到哪个目录占用的空间最多
使用 free -m 命令查看交换分区的大小变化
软连接也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问
硬链接可以将它理解为一个“指向原始文件 block 的指针”,系统会创建出一个与原来一模一样的 inode 信息块。所以,硬链接文件与原始文件其实是一模
一样的,只是名字不同。每添加一个硬链接,该文件的 inode 个数就会增加 1;而且只有当该文件的 inode 个数为 0 时,才算彻底将它删除
ln 命令用于创建文件的软硬链接,英文全称为“link”,语法格式为“ln [参数]原始文件名 链接文件名”。
-s创建“符号链接”(如果不带-s 参数,则默认创建硬链接)
-f强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程
----------------------------基础命令-----------------------------------------------------------------
网卡参数配置方法:
1.vim编辑配置文件: cd 切换到 /etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件),vim 需要配置的网卡文件(名称一般为: ifcfg-网卡名 )
TYPE=Ethernet #设备类型
BOOTPROTO=static #地址分配模式
NAME=ens160 #网卡名称
ONBOOT=yes #是否启动
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1
2. nmtui 命令: 配置网卡参数的图形工具
配置完成后需要输入命令重新载入后才能生效:nmcli connection reload ens160 如果还不行,执行命令 nmcli connection up ens160
-------------------------------------------------
echo 命令用于在终端设备上输出字符串或变量提取后的值,语法格式为“echo [字符串] 例如:[root@linuxprobe~]# echo $SHELL
[$变量]”。
top:加强版任务监视器
date 查看或设置日期时间 例如设置时间date -s "20201101 8:30:00"
timedatectl 查看或设置时间及时区 例如 查看 timedatectl status 设置中国时区:timedatectl set-timezone Asia/Shanghai
wget 命令用于在终端命令行中下载网络文件,英文全称为“web get”,语法格式为“wget
[参数] 网址”。
ps 命令用于查看系统中的进程状态
-a显示所有进程(包括其他用户的进程)
-u用户以及其他详细信息
-x显示没有控制终端的进程
-e
等于“-A”
D
不可中断 uninterruptible sleep (usually IO)R
运行 runnable (on run queue)S
中断 sleepingT
停止 traced or stoppedZ
僵死 a defunct (”zombie”) process
除了上面 5 种常见的进程状态,还有可能是高优先级(<)、低优先级(N)、被锁进内存
(L)、包含子进程(s)以及多线程(l)这 5 种补充形式。
常用组合形式:
ps -ef 显示所有进程信息,连同命令行
ps -ef|grep ssh ps 与grep 常用组合用法,查找特定进程
ps -l 将目前属于您自己这次登入的 PID 与相关信息列示出来
ps aux 列出目前所有的正在内存当中的程序
ps -u root 显示指定用户信息
pidof 命令用于查询某个指定服务进程的 PID 号码值,语法格式为“pidof [参数] 服务名称”
kill 命令用于终止某个指定 PID 值的服务进程,语法格式为“kill [参数] 进程的 PID”。
killall 命令用于终止某个指定名称的服务所对应的全部进程,语法格式为“killall [参数] 服
务名称”
ifconfig 命令用于获取网卡配置与网络状态等信息,英文全称为“interface config”,语法
格式为“ifconfig [参数] [网络设备]”
uname 命令用于查看系统内核版本与系统架构等信息,英文全称为“unix name”,语法格
式为“uname [-a]”,一般要固定搭配上-a 参数来完整地查看
uptime 命令用于查看系统的负载信息,输入该命令后按回车键执行即可。显示平均负载值:系统在最近 1 分钟、5 分钟、15 分钟内的压力情况,建
议负载值保持在 1 左右,在生产环境中不要超过 5 就好。
free 命令用于显示当前系统中内存的使用量信息,语法格式为“free [-h]” ,如果不使用-h(易读模式)查看内存使用量情况,则默认以 KB 为单位
who 命令用于查看当前登入主机的用户终端信息
last 命令用于调取主机的被访记录
tracepath 命令用于显示数据包到达目的主机时途中经过的所有路由信息,语法格式为
“tracepath [参数] 域名”
netstat 命令用于显示如网络连接、路由表、接口状态等的网络相关信息,英文全称为
“network status”,语法格式为“netstat [参数]”。
history 命令用于显示执行过的命令历史,语法格式为“history [-c]”。可以使用“!编码数字”的方式来重复执行某一次的命令
--------------------------------------
pwd 命令用于显示用户当前所处的工作目录,英文全称为“print working directory”
cd 命令用于切换当前的工作路径,英文全称为“change directory”,语法格式为“cd [参
数] [目录]”。可以使用“cd -”命令返回到上一次所处的目录,
使用“cd..”命令进入上级目录,以及使用“cd~”命令切换到当前用户的家目录,抑或使用
“cd~username”命令切换到其他用户的家目录
ls 命令用于显示目录中的文件信息,英文全称为“list”,语法格式为“ls [参数] [文件名称]”。使用 ls 命令的-a 参数
可以看到全部文件(包括隐藏文件),使用-l 参数可以查看文件的属性、大小等详细信息。如果想要查看目录属性信息,则需要额外添加一个-d 参数。
tree 命令用于以树状图的形式列出目录内容及结构,输入该命令后按回车键执行即可。
find 命令用于按照指定条件来查找文件所对应的位置,语法格式为“find [查找范围] 寻
找条件”
locate 命令用于按照名称快速搜索文件所对应的位置,语法格式为“locate 文件名称”。在使用 locate 命令时,先使用 updatedb 命
令生成一个索引库文件,这个库文件的名字是/var/lib/mlocate/mlocate.db,后续在使用 locate
命令搜索文件时就是在该库中进行查找操作,速度会快很多。
whereis 命令用于按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的
位置,语法格式为“whereis 命令名称”。
------------------------------------------文本文件编辑命令-------------
cat 命令用于查看纯文本文件(内容较少的),英文全称为“concatenate”,语法格式为“cat
[参数] 文件名称”。
more 命令用于查看纯文本文件(内容较多的),语法格式为“more [参数] 文件名称”。
head 命令用于查看纯文本文件的前 N 行,语法格式为“head [参数] 文件名称”。例如: head -n 10 initial-setup-ks.cfg
tail 命令用于查看纯文本文件的后 N 行或持续刷新文件的最新内容,语法格式为“tail [参
数] 文件名称”。tail 命令最强悍的功能是能够持续刷新一个文件的内容,当想要实时查看最新的日志文件
时,这特别有用,此时的命令格式为“tail -f 文件名称”
wc 命令用于统计指定文本文件的行数、字数或字节数,英文全称为“word counts”,语
法格式为“wc [参数] 文件名称”;-l只显示行数,-w只显示单词数,-c 只显示字节数
stat 命令用于查看文件的具体存储细节和时间等信息,英文全称为“status”,语法格式为
“stat 文件名称”。
grep 命令用于按行提取文本内容,语法格式为“grep [参数] 文件名称”。grep 命令是用途最广泛的文本搜索匹配工具(常与管道符|结合使用搜索前一个命令的输出,例如:history|grep home)。它虽然有很多参数,但是大多数基本上都
用不到。两个最常用的参数:-n 参数用来显示搜索到的信息的行号;-v 参数用于反选信息(即没有包含关键词的所有信息行)。
cut 命令用于按“列”提取文本内容,语法格式为“cut [参数] 文件名称”。一般而言,按基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键
词即可。但是如果按“列”搜索,不仅要使用-f 参数设置需要查看的列数,还需要使用-d 参
数来设置间隔符号。
接下来使用下述命令尝试提取出 passwd 文件中的用户名信息,即提取以冒号(:)为间
隔符号的第一列内容:cut -d : -f 1 /etc/passwd
-----------------------------------------文件目录管理命令------------------
touch 命令用于创建空白文件或设置文件的时间,语法格式为“touch [参数] 文件名称”。
mkdir 命令用于创建空白的目录,英文全称为“make directory”,语法格式为“mkdir [参
数] 目录名称”。-p 参数来递归创建出具有嵌套层叠
关系的文件目录
cp 命令用于复制文件或目录,英文全称为“copy”,语法格式为“cp [参数] 源文件名称 目
标文件名称”。
-p保留原始文件的属性
-d若对象为“链接文件”,则保留该“链接文件”的属性
-r递归持续复制(用于目录)
-i若目标文件存在则询问是否覆盖
-a相当于-pdr(p、d、r 为上述参数)
mv 命令用于剪切或重命名文件,英文全称为“move”,语法格式为“mv [参数] 源文件
名称 目标文件名称”。
rm 命令用于删除文件或目录,英文全称为“remove”,语法格式为“rm [参数] 文件
名称”。
-f 强制执行
-i删除前询问
-r删除目录
-v 显示过程
file 命令用于查看文件的类型,语法格式为“file 文件名称”。
tar 命令用于对文件进行打包压缩或解压,语法格式为“tar 参数 文件名称”。
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用 gzip 压缩或解压
-j 用 bzip2 压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录
一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”命令把指定的文件进行打包压缩;
相应的解压命令为 “tar -xzvf 压缩包名称.tar.gz”。
将打包后的压缩包文件指定解压到/root/etc 目录中(先使用 mkdir 命令创建/root/etc目录)
[root@linuxprobe~]# mkdir /root/etc
[root@linuxprobe~]# tar xzvf etc.tar.gz -C /root/etc
-----------------管道符、重定向与环境变量-----------
------输入输出重定向----
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1
或
命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
-----------------管道命令符------------
同时按下键盘上的 Shift+反斜杠(\)键即可输入管道符,其执行格式为“命令 A | 命令 B”。
管道命令符的作用也可以用一句话概括为:"把前一个命令 原本要输出到屏幕的信息 当做 后一个命令 的 标准输入"
比如用翻页的形式查看/etc 目录中的文件列表及属性信息 ls -l /etc/ | more
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成
为一个非常致命的缺陷。通过把管道符和 passwd 命令的--stdin 参数相结合,可以用一条命令
来完成密码重置操作:echo "linuxprobe" | passwd --stdin root
如果需要将管道符处理后的结果既输出到屏幕,又同时写入到文件中,则可
以与 tee 命令结合使用。下述命令将显示系统中所有与 bash 相关的进程信息,并同时将输出到屏幕和文件中:ps aux | grep bash | tee result.txt
*******Vim 编辑器与 Shell 命令脚本*************
----------------------------------------------------------Vim 文本编辑器-----------
命令模式中最常用的一些命令:
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的 5 行
yy 复制光标所在整行
5yy 复制从光标处开始的 5 行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
末行模式中常用的一些命令:
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:整数 跳转到该行
:s/one/two 将当前光标所在行的第一个 one 替换成 two
:s/one/two/g 将当前光标所在行的所有 one 替换成 two
:%s/one/two/g 将全文中的所有 one 替换成 two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
可以分别使用 a、i、o 这 3 个键从命令模式切换到输入模式。其中,a
键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 o 键则是在光标的下面
再创建一个空行
---------------------计划任务服务程序---------------------
##长期计划任务 使用 Linux 系统中默认启用的 crond 服务
创建、编辑计划任务的命令为 crontab -e,查看当前计划任务的命令为 crontab -l,删除某条计划任务的命令为 crontab -r。
另外,如果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。
诸如 crond 在内的很多服务默认调用的是 Vim 编辑器,所以删除 crond 计划任务,也可以 直接使用 crontab -e 命令进入编辑界面,删除里面的文 本信息即可。
crontab 命令中的参数及其作用
-e 编辑计划任务
-u 指定用户名称
-l 列出任务列表
-r 删除计划任务
口诀“分、时、日、月、星期 命令”。 这是使用 crond 服务设置任务的参数格式(其格式见表 4-8)。需要注意的是,如果有些字段 没有被设置,则需要使用星号( *)占位
使用 crond 设置任务的参数字段说明
分钟 取值为 0~59 的整数
小时 取值为 0~23 的任意整数
日期 取值为 1~31 的任意整数
月份 取值为 1~12 的任意整数
星期 取值为 0~7 的任意整数,其中 0 与 7 均为星期日
命令 要执行的命令或程序脚本
例子:
假设在每周一、三、五的凌晨 3:25,都需要使用 tar 命令把某个网站的数据目录进行打包 处理,使其作为一个备份文件。我们可以使用 crontab -e 命令来创建计划任务,为自己创建计 划任务时无须使用-u 参数。
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
如果在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。
尤其 需要注意的是,在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果 不知道绝对路径,请用 whereis 命令进行查询。
除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月 和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”, 则表示每月的 12~15 日)。
还可以用除号(/)表示执行任务的间隔时间(例如“*/2”表示每 隔 2 分钟执行一次任务)。
例子2:
再 添加一条计划任务,它的功能是每周一至周五的凌晨 1 点自动清空/tmp 目录内的所有文件。
#上一条任务
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
#本次添加的任务,一行一条命令
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
总结一下使用计划服务的注意事项。
➢ 在 crond 服务的配置参数中,一般会像 Shell 脚本那样以#号开头写上注释信息,这样 在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
➢ 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期” 字段不能同时使用,否则就会发生冲突。
**********************************************************************************************************
--------------------------------------用户身份与文件权限-------------------------------
管理员UID为0
系统用户UID为1~999
普通用户UID从1000开始
id 命令用于显示用户的详细信息,语法格式为“id 用户名”。
useradd 命令用于创建新的用户账户,语法格式为“useradd [参数] 用户名”。
groupadd 命令用于创建新的用户组,语法格式为“groupadd [参数] 群组名”。
usermod 命令用于修改用户的属性,英文全称为“user modify”,语法格式为“usermod [参
数] 用户名”。
例子:将已有用户加入已有组
usermod -aG 组名1,组名2,组名3 用户名
#-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。
#将已有用户的主用户组改为新的用户组
usermod -g <新的用户组名称> <用户名称>
将用户移出用户组
#gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除。
gpasswd -d 用户名 组名
passwd 命令用于修改用户的密码、过期时间等信息,英文全称为“password”,语法格式
为“passwd [参数] 用户名”。
userdel 命令用于删除已有的用户账户,英文全称为“user delete”,语法格式为“userdel [参
数] 用户名”。
文件的可读、可写、可执行权限的英文全称分别是 read、write、execute,
可以简写为 r、w、x,亦可分别用数字 4、2、1 来表示,
文件所有者、文件所属组及其他用户权限之间无关联
对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新
增、删除、重命名文件;而“可执行”则表示能够进入该目录,以下为对应可执行命令:
文件 目录
可读(r) cat ls
可写(w) vim touch
可执行(x) ./script cd
排在权限前面的减号(-)是文件类型(减号表示普通文件),新手经常会把它跟“无权
限”混淆。尽管在 Linux 系统中一切都是文件,但是不同的文件由于作用不同,因此类型也
不尽相同(有一点像 Windows 系统的后缀名)。
常见的文件类型包括:
普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。
例如:
某个文件夹 drwxr-xr-x 含义:文件夹/可读可写可执行(所有者者权限)/可读不可写可执行(所有组)/可读不可写可执行(其他用户)
某个文件.sh -rwxr--r--
chattr 命令用于设置文件的隐藏权限,英文全称为 change attributes,语法格式为“chattr [参
数] 文件名称”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把
某个隐藏功能移出文件,则需要追加“-参数”。
我们一般会将-a 参数设置到日志文件(/var/log/messages)上,这样可在不影响系统正常
写入日志的前提下,防止黑客擦除自己的作案证据。如果希望彻底地保护某个文件,不允许
任何人修改和删除它的话,不妨加上-i 参数试试,效果特别好。要想彻底删除某个文件,可以使用-s 参数来保证其被
删除后不可恢复
lsattr 命令用于查看文件的隐藏权限,英文全称为“list attributes”,语法格式为“lsattr [参
数] 文件名称”。
-----文件访问控制列表----
前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性 — 权
限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独
的权限控制,就需要用到文件的访问控制列表(ACL)了。
setfacl 命令用于管理文件的 ACL 权限规则,英文全称为“set files ACL”,语法格式为
“setfacl [参数] 文件名称”。
-m 修改权限
-M 从文件中读取权限
-x 删除某个权限
-b 删除全部权限
-R 递归子目录
例子:[root@linuxprobe~]# setfacl -Rm u:linuxprobe:rwx /root
常用的 ls 命令是看不到 ACL 信息的,但是却可以看到文件权限的最后一个点( .)
变成了加号( +),这就意味着该文件已经设置了 ACL
getfacl 命令用于查看文件的 ACL 权限规则,英文全称为“get files ACL”,语法格式为
“getfacl [参数] 文件名称”。
-------su 命令与 sudo 服务---
从 root 管理员切换至普通用户:[root@linuxprobe~]# su - linuxprobe
su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
强烈建议在切换用户身份时添加这个减号(-)。
sudo 命令用于给普通用户提供额外的权限,语法格式为“sudo [参数] 用户名”。
visudo 命令用于编辑、配置用户 sudo 的权限文件,语法格式为“visudo [参数]”。
这是一条会自动调用 vi 编辑器来配置/etc/sudoers 权限文件的命令,能够解决多个用户同
时修改权限而导致的冲突问题。不仅如此,visudo 命令还可以对配置文件内的参数进行语法
检查,并在发现参数错误时进行报错提醒。这要比用户直接修改文件更友好、安全、方便。
可以添加 NOPASSWD 参数,
使得用户下次再执行 sudo 命令时就不用密码验证:
[root@linuxprobe~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) NOPASSWD: /usr/bin/cat,/usr/sbin/reboot
--------------------------------------------------
对于 MySQL
数据库来说,我们需要在系统中创建一个名为 mysql 的用户,专门用于负责运行 MySQL 数据
库。请记得要把这类账户的 Bash 终端设置成 nologin 解释器,避免黑客通过该用户登录到服
务器中,从而提高系统安全性。
应使用-M 参数不创建对应的家目录,以及使用-s 参数指定登录后的 Shell 解释器为 /sbin/nologin,确保任何人都不能通过这个账号登录主机
[root@linuxprobe lnmp]# useradd mysql -M -s /sbin/nologin
-----------------------------------------------------------------------
chmod 命令用于设置文件的一般权限及特殊权限,英文全称为“change mode”,语法格式为“chmod [参数] 文件名”。
[root@linuxprobe~]# chmod 760 anaconda-ks.cfg
chown 命令用于设置文件的所有者和所有组,英文全称为 change own,语法格式为“chown 所有者:所有组 文件名”。
[root@linuxprobe~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
chmod 和 chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共
性,就是针对目录进行操作时需要加上大写参数-R 来表示递归操作,即对目录内所有的文件
进行整体操作。
------------------------------------------特殊权限设置--------------
1. SUID 是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥 有所有者的权限(仅对拥有执行权限的二进制程序有效)。
查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着 该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权 限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。
[root@linuxprobe~]# ls -l /etc/shadow
----------. 1 root root 1312 Jul 21 05:08 /etc/shadow
[root@linuxprobe~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd
2. SGID 特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文 件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用 户组的名称。体现为:所属组x变为s:
文件例子,ps命令,使得可读取所属组可读,而其他用户权限为0不可读的文件:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
3. SBIT 特殊权限位可确保用户只能删除自己的文件,而 不能删除其他用户的文件。体现为“其他用户”权限字段的x变为s:
如果是大写 S 表示原先没有执行权
------------------------------
SUID、SGID、SBIT 特殊权限的设置参数
u+s 设置 SUID 权限
u-s 取消 SUID 权限
g+s 设置 SGID 权限
g-s 取消 SGID 权限
o+t 设置 SBIT 权限
o-t 取消 SBIT 权限
---------------
如果我们想将一般权限和特殊权限一起设置,有什么高效率的方法么?
其实,SUID、SGID 与 SBIT 也有对应的数字表示法,分别为 4、2、1。也就是说 777 还 不是最大权限,最大权限应该是 7777,其中第 1 个数字代表的是特殊权限位。既然知道了数 字表示法是由“特殊权限+一般权限”构成的
------------------------------------------------------
--------------------------------隐藏属性
Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏 起来的权限,默认情况下不能直接被用户发觉。
chattr 命令用于设置文件的隐藏权限,英文全称为 change attributes,语法格式为“chattr [参 数] 文件名称”。 如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把 某个隐藏功能移出文件,则需要追加“-参数”。chattr 命令中可供选择的隐藏权限参数非常丰 富,
chattr 命令中的参数及其作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新 建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用零块填充原文件所在的硬盘区域)
A 不再修改这个文件或目录的最后访问时间(Atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用 dump 命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
x 可以直接访问压缩文件中的内容
例子:[root@linuxprobe~]# chattr +a linuxprobe
lsattr 命令用于查看文件的隐藏权限,英文全称为“list attributes”,语法格式为“lsattr [参 数] 文件名称”。
我们一般会将-a 参数设置到日志文件(/var/log/messages)上,这样可在不影响系统正常 写入日志的前提下,防止黑客擦除自己的作案证据。如果希望彻底地保护某个文件,不允许 任何人修改和删除它的话,不妨加上-i 参数试试,效果特别好。
要想彻底删除某个文件,可以使用-s 参数来保证其被 删除后不可恢复—硬盘上的文件数据会被用零块重新填充,那就更保险了。
--------------------------------文件访问控制列表--------------------
基于普通文件或目录 设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权 限。另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL 权限;若针对文件 设置了 ACL,则文件不再继承其所在目录的 ACL 权限。