实操篇(上)
# 1. 开机、重启与用户登录注销
# 1.1 关机 & 重启命令
命令 | 说明 |
---|---|
shutdown -h now | 立刻进行关机 |
shutdown -h 2 | “hello,2 分钟后会关机了” |
shutdown -r now = reboot | 现在重启 |
halt | 关机,与上面一样 |
sync | 把内存的数据同步到磁盘 |
- 不管是重启还是关机,首先要运行 sync 命令,把内存中的数据写到磁盘中。目前的 shutdown/reboot/halt 等命令均在关机前进行了 sync,但小心驶得万年船。
- root 才可以关机。
# 1.2 用户登录和注销
登录时尽量少用 root 账号,避免操作失误。使用 su <用户名>
可以切换身份。
logout
命令即可注销用户。这个指令再图形运行级别无效。
# 2. 用户管理
Linux 是一个多用户多任务的操作系统。
# 2.1 添加用户
语法:useradd 用户名
- 当用户创建成功后,会自动创建与用户同名的家目录。
- 也可以通过
useradd -d 指定目录 用户名
来给新用户指定家目录。
# 2.2 指定/修改密码
passwd tom
:给 tom 指定密码
# 2.3 删除用户
userdel yubin
:删除用户 yubin,但要保留家目录userdel -r yubin
:删除用户及其家目录
一般情况下,我们建议保留,毕竟他所做的工作放在了里面。
# 2.4 查询用户信息
id 用户名
:查询该用户的信息,当用户不存在时返回无此用户。
# 2.5 切换用户
当操作权限不够时,可以通过 su
命令切换到高权限用户。
- 从高权限到低权限的切换不需要密码,反之需要。
- 当需要返回到原来用户时,使用 exit/logout 指令。
# 2.6 查看当前登录用户
whoami
= who am I
:显示第一次登录时的用户。
# 2.7 用户组
用户组可以让系统对有共性/权限的多个用户进行统一管理。
groupadd 组名
:新增组groupdel 组名
:删除组
如何将让一个用户加入一个组呢?有以下几种方法:
- 增加用户时直接加上组:
useradd -g 用户组 用户名
- 修改用户的组:
usermod -g 用户组 用户名
- 若一个用户没有指定加入哪个组,会默认在一个与自己同名的组中
# 2.8 用户和组相关的文件
- /etc/passwd 文件:用户的配置文件,记录用户的各种信息
- 每行的含义:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
- 每行的含义:
- /etc/shadow 文件:口令的配置文件
- 每行的含义:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
- 每行的含义:
- /etc/group 文件:组的配置文件,记录各组的信息
- 每行的含义:
组名:口令:组标识号:组内的用户列表
- 每行的含义:
# 3. 实用指令
# 3.1 运行级别
运行级别 | 说明 |
---|---|
0 | 关机 |
1 | 单用户模式(可以帮助我们找回丢失密码) |
2 | 多用户状态没有网络服务 |
3 | 多用户状态有网络服务【工作中常用】 |
4 | 系统未使用,保留给用户 |
5 | 图形界面 |
6 | 系统重启 |
- 常见运行级别是 3 和 5,也可以指定默认运行级别。
init <num>
:切换到 num 运行级别,如 init 3
将切换到多用户状态有网络服务模式。
# CentOS 7 后运行级别说明
- multi-user.target:相当于 runlevel 3
- graphical.target:相当于 runlevel 5
查看当前默认运行级别:systemctl get-default
设置默认运行级别:systemctl set-default TARGET.target
当我们在图形化下将默认运行级别设为 graphical.target 后,重启系统后会默认进入黑框框界面,即 runlevel 3。
# 3.2 找回 root 密码
// TODO
# 3.3 帮助指令
man [命令或配置文件]
:获得帮助信息,比如man ls
help 命令
:获得 shell 内置命令的帮助信息
如果英语不太好,百度更直接。
# 3.4 时间日期类
# 3.4.1 date 显示当前日期
date
:显示当前日期
date "+format"
:format 中可以用 %Y(年)、%m(月)、%d(日)、%H(时)、%M(月)、%S(秒),比如 date "+%Y-%m-%d %H:%M:%S"
# 3.4.2 cal 显示日历
calendar 的缩写。
cal [选项]
- 默认显示本月日历
cal 2020
:显示 2020 全年的日历
# 3.5 搜索查找类
# 3.5.1 find
find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示出来。
find [搜索范围] [选项]
-name <查询方式>
:按指定的文件名查找模式查找文件-user <用户名>
:查找属于指定用户名的所有文件-size <文件大小>
:按照指定的文件大小查找文件
案例:
- 根据名称查找 /home 目录下的 hello.txt:
find /home -name hello.txt
- 查找 /opt 下用户 yubin 的文件:
find /opt -user yubin
# 3.5.2 locate
locate 可以快速定位文件路径。locate 指令利用事先建立的数据库实现快速定位,它无需遍历整个文件系统因而较快。为了保证查询结果准确性,管理员必须定期更新 locate 时刻:updatedb
。
locate [搜索文件]
:
- 第一次使用前,必须使用
updatedb
指令来创建 locate 数据库。
# 3.5.3 which
which 可以查看某个指令在哪个目录下。比如 which ls
查看 ls 指令在哪个目录。
# 3.5.4 grep 指令和管道符号 |
grep 过滤查找。
管道夫 |
表示将前一个命令的处理结果输出传递给后面的命令处理。
grep [选项] 查找内容 源文件
- -n:显示匹配行及行号
- -i:忽略字母大小写
案例:在 hello.text 文件中查找“yes”所在行,并显示行号
- 写法1:
cat /home/hello.txt | grep “yes”
- 写法2:
grep -n “yes” /home/hello.txt
# 3.6 压缩和解压类
# 3.6.1 gzip 压缩 & gunzip 解压
gzip 文件
:压缩文件为 *.gz 文件gunzip 文件.gz
:解压
# 3.6.2 zip 压缩 & unzip 解压
zip [选项] xxx.zip
:压缩文件和目录。-r
递归压缩,即压缩目录。unzip [选项] xxx.zip
:解压缩文件。-d <目录>
指定解压后文件的存放目录。
案例:
- 将 /home 下的所有文件压缩:
zip -r myhome.zip /home/
- 将 myhome.zip 解压到 /opt/tmp 目录下:
unzip -d /opt/tmp /home/myhome.zip
# 3.6.3 tar 打包 ⭐️
tar 是打包指令(仅仅打包但不压缩),最后打包后的文件是 xxx.tar.gz 文件。
tar [选项] xxx.tar.gz 打包的内容
:打包目录,压缩后的文件格式为 xxx.tar.gz
- -c:【create】创建一个新的打包文件
- -v:【verbose】显示详细信息
- -f:【filename】指定压缩后的文件名
- -z:【gzip】打包同时用 gzip 算法压缩
- -x:【extract】解包 .tar 文件
常用的选项组合:
- 打包并压缩:tar -zcvf xxx.tar.gz [原文件名/目录名]
- 解压并解包:tar -zxvf xxx.tar.gz [目的地]
案例:
- 将 pig.txt 和 cat.txt 压缩成 pc.tar.gz:
tar -zcvf pc.tar.gz pig.txt cat.txt
- 将 /home 文件夹压缩成 myhome.tar.gz:
tar -zcvf myhome.tar.gz /home/
- 将 pc.tar.gz 解压到当前目录:
tar -zxvf pc.tar.gz
- 将 pc.tar.gz 解压到 /opt/tmp:
tar -zxvf pc.tar.gz /opt/tmp
# 4. 组管理和权限管理
Linux 中每个用户必须属于一个组,不能独立于组外。每个文件有所有者、所在组、其他组的概念。
目录也是一种特殊的文件,所以这里的“文件”也包括了目录。
# 4.1 所有者
创建文件的人是所有者,所有者可以更改。
# 4.1.1 查看文件的所有者
ls -ahl
- 最后一列的蓝色表示这是个目录,白色表示是文件
# 4.1.2 修改文件所有者
chown 用户名 文件名
:【change owner】将文件的所有者改成指定的用户chown newOwner:newGroup 文件名
:同时改变所有者和所在组-R
:如果是目录,则使其下所有子文件或者目录递归生效
# 4.2 组的创建
groupadd 组名
:创建一个组
案例:
- 创建一个组 monster:
groupadd monster
- 创建一个用户 fox,并放到 monster 组中:
useradd -g monster fox
- -g 表示 group
# 4.3 所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
# 4.3.1 查看文件的所在组
ls -ahl
# 4.3.2 修改文件的所在组
chgrp 组名 文件名
:【change group】
# 4.4 其他组
除了文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组。
# 4.5 改变用户的所在组
root 的管理权限可以改变某个用户的所在组。
usermod -g 新组名 用户名
:修改用户的所在组。
usermod 可以用来修改用户账号的各项设定,具体可查 usermod命令 | 菜鸟教程 (opens new window)
# 4.6 文件的权限
# 4.6.1 权限的基本介绍
下图的第一列便是权限:
- 第 0 位表示文件类型:l 链接,d 目录,c 字符设备文件(如鼠标、光盘),b 块设备(如硬盘)
- 第 1~3 位表示所有者拥有该文件的权限
- 第 4~6 位表示所属组拥有该文件的权限
- 第 7~9 位表示其他用户拥有该文件的权限
# 4.6.2 rwx 权限 ⭐️
# 1)rwx 作用到文件
- 【r】可读
- 【w】可写。可以修改但不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限。
- 【x】可执行(execute)
# 2)rwx 作用到目录
- 【r】可读。ls 可以查看目录内容。
- 【w】可写。可以对目录内创建 + 删除 + 重命名目录。
- 【x】可执行。可以进入该目录。
# 4.6.3 权限的数字表示
因此 rwx = 4+2+1 = 7,rw- = 4+2 = 6 等
# 4.6.4 chmod 修改权限
chmod 可以修改文件/目录的权限:chmod [变更方式] 文件名
# 1)第一种方式:+ - = 变更权限
- u —— 所有者,user 的简写
- g —— 所有组,group 的简写
- o —— 其他人,other 的简写
- a —— 所有人(即 u、g、o 的总和),all 的简写
案例:给 foo.txt 的所有者赋予读写执行的权限,增加所在组写的权限,除去其他人读的权限
chmod u=rwx,g+w,o-r foo.txt
# 2)第二种方式:通过数字变更权限
案例:将 bar.txt 的权限修改为 rwxr-xr-x
chmod 755 bar.txt
# 5. 定时任务调度
# 5.1 crond 任务调度
crontab 进行定时任务的设置。该命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
英语:crond 定时任务,crontab 定时任务
# 5.1.1 概述
任务调度:是指系统在某个时间执行特定的命令或程序。
任务调度分类:
- 系统工作:系统周期性所要执行的工作,如病毒扫描
- 个别用户工作:某个用户定期要做的工作,比如对 MySQL 数据库的备份
# 5.1.2 基本语法
crontab [选项]
- -e:使用编辑器来编辑 crontab 定时任务
- -l:列出目前的时程表
- -r:删除当前用户的时程表(即所有 crontab 任务)
# 5.1.3 快速入门
设置任务调度文件:/etc/crontab
设置个人任务调度:执行 crontab -e
命令,接着输入任务到调度文件。如输入 */1 * * * * ls -l /etc/ > /tmp/to.txt
表示每个小时的每分钟执行 ls -l /etc/ > /tmp/to.txt
命令。
# 任务书写格式:
f1 f2 f3 f4 f5 program
- program 处为定时执行的命令
- f1 ~ f5 为指示时间的占位符,具体可见下面
# 5 个占位符的说明:
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
2
3
4
5
6
7
8
# 特殊符号的说明
特殊符号 | 含义 |
---|---|
* | 代表任何时间,比如第一个 * 就代表一个小时中每分钟执行一次的意思。 |
, | 代表不连续的时间,如 0 8,12,16 * * * 命令就代表每天的8点0分、12点0分、16点0分都执行一次命令。 |
- | 代表连续的时间范围,如 0 5 * * 1-6 命令就代表周一到周六的凌晨5点0分执行命令 |
*/n | 代表每隔多久执行一次,如 */10 * * * * 就代表每隔 10 分钟就执行一次命令 |
# 5.2 at 定时任务
crond 是反复执行的任务,而 at 命令是一次性定时计划任务,其守护进程 atd 会以后台模式运行,检查任务队列来运行。
默认情况下,atd 守护进程每分钟检查一次作业队列,有作业时会检查其运行时间,若匹配则运行此作业。在使用 at 命令时,一定要保证 atd 进程的启动,可以使用 ps -ef | grep atd
来检测 atd 是否在运行。
ps -ef | grep atd
:查看所有进程并过滤出 atd
命令格式:at [选项] [时间]
- -m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
- -I atq的别名
- -d atrm的别名
- -v 显示任务将被执行的时间
- -c 打印任务的内容到标准输出
- -V 显示版本信息
-q<列队>
使用指定的列队-f<文件>
从指定文件读入任务而不是从标准输入读入-t<时间参数>
以时间参数的形式提交要运行的任务
# 5.2.1 at 时间定义的方法
- 接受在当天的 hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。
- 使用 midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。
- 采用 12 小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午。
- 指定命令执行的具体日期,指定格式为 month day(月 日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。
- 使用相对计时法,指定格式为:now + count time-units ,now 就是当前时间,time-units 是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count 是时间的数量,究竟是几天,还是几小时,等等。比如
now + 5 minutes
。 - 直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
案例:2 天后的下午 5 点执行 /bin/ls /home
先输入 at [选项] [时间]
后回车,再接着输入命令,输入完后按两次 Ctrl D
结束输入。
# 6. 磁盘分区、挂载
# 6.1 Linux 分区
# 6.1.1 原理介绍
Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux 中每个分区都是用来组成整个文件系统的一部分。
Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录, 且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
示意图:
# 6.1.2 硬盘说明
Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘。
- 对于 IDE 硬盘,驱动器标识符为“hdx~”,“hd”表明分区所在设备的类型,这里是指IDE硬盘。“x”为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。比如 hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区。
- 对于 SCSI 硬盘,驱动器标识符为“sdx~”,SCSI 硬盘是用“sd”来表示分区所在设备的类型,其余则和 IDE 硬盘的表示方法一样。
# 6.1.3 查看所有设备挂载情况
命令:lsblk
或者 lsblk -f
- lsblk:英文是“list block”,即用于列出所有可用块设备的信息
# 6.2 挂载的经典案例 —— 增加一块硬盘
目标:给 Linux 系统增加一块新的硬盘,并且挂载到 /newdisk
主要有以下5个步骤:虚拟机添加硬盘、分区、格式化、挂载、设置可以自动挂载。
# 1)虚拟机添加硬盘
在【虚拟机】菜单中,选择【设置】,然后设备列表里添加硬盘,然后一路【下一步】,中间只有选择磁盘大小的地方需要修改,直到完成。然后重启系统(才能识别)!
# 2)磁盘分区
分区命令:fdisk /dev/sdb
开始对 /sdb 分区:
命令 | 含义 |
---|---|
m | 显示命令列表 |
n | 新增分区 |
d | 删除分区 |
w | 写入并退出 |
做法:开始分区后输入 n,新增分区,然后选择 p,分区类型为主分区,分区号1-4可选,默认为1,1代表为只为磁盘划分一块分区,2代表为磁盘划分两块分区,依次类推。此次案例选择1。两次回车默认剩余全部空间。最后输入 w 写入分区并退出,若不保存退出输入 q。
# 3)格式化磁盘
命令:mkfs -t ext4 /dev/sdb1
- 其中 ext4 是分区类型
# 4)挂载
挂载: 将一个分区与一个目录联系起来。
命令:mount 设备名称 挂载目录
- 此次案例为
mount /dev/sdb1 /newdisk
- 去除挂载命令为
umount 设备名称或者挂载目录
,比如umount /dev/sdb1
或者umount /newdisk
# 5)设置自动挂载
用命令行挂载只能实现临时挂载,重启系统后,挂载就会失效。设置自动挂载,即永久挂载,当重启系统,仍然可以挂载到指定目录。
通过修改 /etc/fstab 文件实现永久挂载。
- 此次案例在文件中增加
/dev/sdb1 /newdisk ext4 defaults 0 0
- 保存并退出文件后,执行
mount –a
即刻生效
# 6.3 磁盘情况查询
# 6.3.1 查询系统整体磁盘使用情况
命令:df -h
- df:disk free,显示目前在 Linux 系统上的文件系统磁盘使用情况统计
- -h:human readable,使用人类可读的格式(预设值是不加这个选项的
可用于查询系统整体磁盘使用情况:
$ df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 974M 0 974M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 11M 980M 2% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 5.4G 11G 34% /
/dev/sda1 976M 177M 733M 20% /boot
vmhgfs-fuse 400G 317G 84G 80% /mnt/hgfs
tmpfs 199M 52K 198M 1% /run/user/1000
2
3
4
5
6
7
8
9
10
- 当“已用”超过 80% 后就不正常了,应该想到扩容。
# 6.3.2 查询指定目录的磁盘占用情况
命令:du -h
- du:disk usage,显示指定的目录或文件所占用的磁盘空间,默认是当前目录。
- -s:指定目录占用大小汇总
- -h:带计量单位
- -a:含文件
- --max-depth=1:子目录深度为1
- -c:列出明细的同时,增加汇总值
案例:查看 /opt 目录的磁盘占用情况,深度为 1
$ du -hac --max-depth=1 /opt 163M /opt/vmware-tools-distrib 4.0K /opt/rh 54M /opt/VMwareTools-10.3.10-13959562.tar.gz 216M /opt 216M 总用量
1
2
3
4
5
6
# 6.4 磁盘情况 - 工作实用指令
# 1)统计 /opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l
# 2)统计 /opt 文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l
# 3)统计 /opt 文件夹下文件的个数,包括子文件夹下的
ls -lR /opt | grep "^-" | wc -l
# 4)统计 /opt 文件夹下目录的个数,包括子文件夹下的
ls -lR /opt | grep "^d" | wc -l
# 5)以树状显示目录结构
yum install tree 后 tree 指定目录
$ tree .
.
├── aaa
│ └── abc.txt
├── bar.txt
├── foo.txt
2
3
4
5
6
补充:wc 命令
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
命令:
wc [选项] [文件]
- -c:统计字节数
- -l:统计行数
- -m:统计字符数,这个选项不能与 -c 一起使用
- -w:统计字数,一个字被定义为由空白、跳格或换行字符分隔的字符串
- -L:统计最长行的长度