Linux 目录结构

Linux 中一切皆文件

Linux 目录结构

目录 含义
/bin 用来存二进制可执行文件,并且比较特殊的是/bin存放的是所有一般用户都能使用的可执行文件,如:cat、chmod、mv、mkdir、cd等常用指令
/sbin 存放一些只有root用户才有权限执行的可执行文件,如init,ip,mount等命令
/boot 主要存放开机时用到的引导文件,如linux内核文件和开机菜单与开机所有需要的配置文件
/dev 任何设备都以文件的形式存放再这个目录中。例如硬盘、键盘、鼠标、光驱等各种设备文件。只要通过访问该目录的某个文件就相当于访问了对应的设备
/etc 配置文件、启动脚本等(etc)包含所有程序所需的配置文件以及系统的配置文件,如用户的账号密码文件,各个服务的起始文件等。也包含了用于启动/停止单个程序的启动和关闭shell脚本。一般来说,该目录下的文件属性是可以让用户查阅,但只有root管理员有权利修改
/home 系统默认的用户的家目录,每当新建一个用户系统都会在这个目录下创建以该用户名为名称的目录作为该用户的家目录。
/lib 存放着系统开机时所需的函数库以及/bin和/sbin目录下的命令会调用的函数库
/lib64 存放相对于/lib中支持64位格式的函数库
/media 存放可移除的媒体设备、如光盘,DVD等
/mnt 临时挂载的设备文件,临时安装目录,系统管理员可以挂载文件系统。系统管理员临时安装文件的系统安装点。
/opt 可选的软件包,即第三方文件软件。我们可以将除了系统自带软件之外的其他软件安装到这个目录。
/proc 特殊的动态目录,用以维护系统的信息和状态,包括当前运行中进程(processes)信息。包含系统进程的相关信息,是一个虚拟的文件系统,包含有关正在运行的进程的信息,系统资源以文本信息形式存在。
/root 系统管理员root的主目录
/run 最近一次开机后所产生的各项信息,如当前的用户和正在运行中的守护进程等。
/srv 存放一些服务启动后所需的数据
/sys 与/proc类似也是虚拟文件系统,存放系统核心与硬件相关信息管理设备文件。不占用硬件容量。
/tmp 存放系统运行过程中使用的一些临时文件,可以被所有就用户访问,系统重启时会清空该目录。
/usr 包含绝大部分所有用户(users)都能访问的应用程序和文件包含二进制文件,库文件。文档和二级程序的源代码。
/var 经常变化的(variable)文件,诸如日志或数据库等代表变量文件。在这个目录下可以找到内容可能增长的文件

VI/VIM 编辑器

一般模式

vim 打开一个文件直接进入一般模式(默认模式),该模式中可以使用 [上下左右] 按键移动光标,可以使用 [删除字符][删除整行] 来处理文档内容,可以使用 [复制粘贴] 处理数据。

语法 功能描述
yy 复制光标当前一行
nyy 复制一段(从第几行到第几行)
p 箭头移动到目的行粘贴
u 恢复前一个操作
dd 删除光标当前行
ndd 删除光标(含)后多少行
x 向后删除一个字符,相当于[del]
X 向前删除一个字符,相当于[Backspace]
gg 移动到页头
G 移动到页尾

插入模式

在一般模式中可以进行 删除、复制、粘贴 等的动作,但是却无法编辑文件内容的!要等到你按下 [i, I, o, O, a, A] 等任何一个字母之后才会进入编辑模式。

通常在 Linux 中,按下这些按键时,在画面的左下方会出现 INSERTREPLACE 的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下 [Esc] 这个按键即可退出编辑模式。

进入编辑模式

按钮 功能
i 当前光标前
a 当前光标后
o 当前光标行的下一行
I 光标所在行最前
A 光标所在行租后
O 当前光标行的上一行

退出编辑模式

[ESC] 键退出编辑弄湿,之后所在的模式为一般模式

指令模式

在一般模式当中,输入 : / ? 3个中的任何一个按钮,就可以将光标移动到最底下的一行

命令 功能
:w 保存
:q 退出
:wq 保存并退出
:q! 不保存强制退出
/要查找的词 n查找下一个,N往上查找
:noh 取消高亮显示
:set nu 显示行号
:set nonu 关闭显示行号
:s /old/new 替换当前行匹配到第一个old为new
:s /lod/new/g 替换当前行匹配到所有old为new
:%s/old/new 替换文档中每一行匹配到的第一个old为new
:%s/old/new/g 替换文档中的所有的old为new 比较常用

练习

1
2
3
4
5
6
7
# 1. 拷贝当前行 yy,拷贝当前行向下的5行 5yy,并粘贴 p
# 2. 删除当前行 dd,删除当前行向下的5行 5dd
# 3. 在文件中查找某个单词(命令行模式 /)
# 4. 设置文件的行号,取消文件的行号(命令行模式 : set nu 和 :set nonu)
# 5. 编辑 /etc/profile 文件,使用快捷键到文档的最末行[G]和最首行[gg]
# 6. 在一个文件中输入 "hello",然后撤销动作 u
# 7. 编辑/etc/profile为保护,在一般模式下,将光标移动到 20 行 20G 或 20gg

关机&&重启命令

命令 说明
shutdown -h now 立刻关机
shutdown -h 1 1 min 后关机
shutdown -r now 现在重新启动计算机
halt 关机
reboot 现在重新启动计算机
sync 把内存的数据同步到磁盘

注意细节

  • 不管重启系统还是关闭系统,首先运行 sync 命令,把内存中的数据写到磁盘中
  • 目前的 shutdown/reboot/halt 等命令均已经在关机前进行了 sync

用户登录和注销

  • 登录时尽量少用 root 账号(系统管理员,权限最大)登录,避免操作失误
  • 普通用户登录,登录后使用 su - 用户名 命令切换成管理员省份
  • 在提示符下输入 logout 即可注销登录(用户状态切到 root 下使用 logout 从 root 状态切回用户状态)

注意细节

  • logout 注销指令在图形运行级别无效
  • 在运行级别 3 下有效

用户管理

添加用户

1
useradd 用户名
  • 当创建用户成功后,会自动的创建和用户同名的家目录
  • 也可以通过 useradd -d 指定目录新的用户名,给新创建的用户指定家目录

指定/修改密码

1
passwd 用户名
指令 说明
pwd 显示当前用户所在的目录

删除用户

1
userdel 用户名

1.删除用户milan,但是保留家目录;

1
userdel milan

2.删除用户以及用户主目录

1
userdel -r cyan

查询用户信息指令

1
id 用户名

切换用户

如果当前用户的权限不够,通过 su - 指令,切换高权限用户

1
su - 切换用户名

创建一个用户 jack,指定密码,然后切换到 jack

1
2
3
4
su - root
useradd jack
passwd jack
su - jack
  • 从高权限的用户切换到低权限的用户,不需要输入密码,反之需要
  • 当需要返回到原来用户时,使用 exit/logout 指令

查看当前用户/登录用户

1
whoami/who am I

用户组

类似于角色,系统可以对有共性/权限的多个用户进行统一的管理

新增组

1
groupadd 组名

删除组

1
groupdel 组名

增加用户时直接加上组

1
useradd -g 用户组 用户名

修改用户的组

1
usermod -g 用户组 用户名

用户和组相关文件

文件 说明 每行含义
/etc/password 用户(user)的配置文件,记录用户的各种信息 用户名:口令:用户识别号:组标识号:注释性描述:主目录:登录Shell
/etc/shadow 口令的配置文件 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
/etc/group 组(group)的配置文件,记录Linux包含的组的信息 组名:口令:组标识号:组内用户列表

运行级别

运行级别说明

运行级别 说明
0 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
1 单用户工作状态,root权限,用于系统维护,禁止远程登录
2 多用户状态(没有NFS),不支持网络
3 安全的多用户状态(有NFS),登录后进入控制台命令行模式
4 系统未使用,保留
5 X11控制台,登陆后进入图形GUI模式
6 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
1
2
# 切换运行级别
init [0123456]

CentOS 7 的运行级别简化为:

/etc/inittab文件中,进行了简化

运行级别 说明
multi-user.target 等价于原运行级别3(多用户有网,无图形界面)
graphical.target 等价于原运行级别5(多用户有网,有图形界面)

查看当前运行级别:

1
2
3
systemctl get-default

vim /etc/inittab

修改当前运行级别:

1
2
# TARGET取 multi-user 或者graphical 
system set-default TARGET.target

找回密码

如何找回root密码

1.首先,启动系统,进入开机界面,在界面中按 e 进入编辑界面

2.进入编辑界面,使用键盘上的上下键把光标往下移动,找到以 Linux16 开头内容所在的行数,在行的最后面输入: init=/bin/sh

3.接着,输入完成后,直接按快捷键:Ctrl+X 进入 单用户模式

4.接着,在光标闪烁的位置中输入 mount -o remount,rw /(注意:各单词间有空格),完成后按回车键(Enter)

5.在新的一行最后面输入:passwd,完成后按键盘的回车键(Enter),输入密码,然后再次确认密码即可,密码修改成功后,会显示passwd…的样式,说明密码修改成功

6.接着,在鼠标闪烁的位置中(最后一行)输入:touch / autorelabel*(注意:touch/后面有一个空格),完成后按键盘的回车键(Enter)

7.继续在光标闪烁的位置中,输入exec /sbin/init(注意:exec/后面有一个空格),完成后按键盘的回车键(Enter),等待系统自动修改密码,完成后,系统自动重启,新的密码即可生效。

帮助指令

man

1
man [命令或配置文件]  # 获取帮助信息

在Linux下隐藏文件是以.开头

信息 功能
NAME 命令的名称和单行描述
SYNOPSIS 怎样使用命令
DESCRIPTION 命令功能的深入讨论
EXAMPLES 怎样使用命令的例子
SEE ALSO 相关主题(通常是手册页)

help

  1. 基本语法

    help 命令 获得 shell 内置命令的帮助信息

  2. 案例实操

    查看 cd 命令的帮助信息 help cd

常用快捷键

常用快捷键 功能
ctrl + c 停止进程
ctrl + l 清屏,等同于clear;彻底清屏是: reset
tab 提示(更重要的是可以防止敲错)
上下键 查找执行过的命令

文件目录指令

pwd

指令 说明
pwd 显示当前工作目录的绝对路径

ls

指令 说明
ls [选项] [文件或目录] 列出目录内容
选项 功能
-a 全部的文件,连同隐藏文档(开头为.的文件) 一起
-l 长数据串列出,包含文件的属性与权限等等数据(常用)等价于“ll”

显示说明

每行列出的信息依次是:文件类型与权限 链接户 文件属性 文件大小用byte来标识 建立或最近修改的时间 名字

cd

指令 说明
cd [参数] 切换到指定目录
参数 功能
cd 绝对路径 切换路径
cd 相对路径 切换路径
cd ~cd 回到自己的家目录
cd - 回到上一次所在目录
cd .. 回到当前目录的上一级目录
cd -P 跳转到实际物理路径,而非快捷方式路径
1
2
3
4
5
6
7
8
# 使用绝对路径切换到root目录 
cd /root
# 使用相对路径切换到/root目录,比如练 /home/tom
cd ../../root
# 表示回到当前目录的上一级目录
cd ..
# 回到家目录
cd ~

mkdir

指令 说明
mkdir [选项] 要创建的目录 # 默认创建一级目录 创建目录
选项 说明
-p 创建多级目录
1
2
3
4
5
6
# 创建目录
mkdir a
mkdir /home/dog
# 一次创建多级
mkdir a a/b a/b/c
mkdir -p a/b/c

rmdir

指令 说明
rmdir [选项] 要删除的空目录 指定删除空目录
  • rmdir 删除的是空目录,如果目录下有内容是无法删除的
  • 如果需要删除非空目录,使用 rm -rf 要删除的目录
1
2
3
4
5
# 删除目录
rmdir a

# 删除多级目录
rmdir a/b/c

touch

指令 说明
touch 文件名称 创建空文件

cp

指令 说明
cp [选项] source dest 拷贝文件到指定目录
选项 说明
-r 递归复制整个文件夹

细节

强制覆盖不提示的方法: \cp

1
\cp -r/home/bbb /opt

1.将 /home/hello.txt 拷贝到 /home/bbb 目录下

1
2
3
mkdir bbb
cp hello.txt bbb/
cd bbb/

2.递归复制整个文件夹,如将 /home/bbb 整个目录,拷贝到 /opt

1
cp -r /home/bbb /opt

rm

指令 说明
rm [选项] 要删除的文件或目录 移除文件或目录
选项 功能
-r 递归删除目录中所有内容
-f 强制执行删除操作,而不提示,用于进行确认
-v 显示指令的详细执行过程
1
2
3
4
5
6
7
8
# 删除文件
rm test.txt
# 递归删除
rm -r /home/bbb
# 强制删除
rm -f dir
# 递归 强制 删除 [删除整个文件夹,不提示]
rm -rf /home/bbb

mv

指令 说明
mv oldNameFile newNameFile 重命名
mv /tmp/moveFile /targerFolder 移动文件

1.将 /home/cat.txt 文件重命名为 pig.txt

1
mv cat.txt pig.txt

2.将 /home/pig.txt 文件移动到 /root 目录下

1
mv pig.txt /root/

3.移动整个目录,将 /opt/bbb 移动到 /home 下

1
2
3
cd /home/
cd /opt/
mv bbb/ /home/

cat

指令 说明
cat [选项] 文件名 要查看的文件
参数 说明
-n 显示所有行的行号,包括空行

cat 只能浏览文件,不能修改文件,为了浏览方便,一般带上管道命令 |more

1
cat -n /etc/profile | more

more

more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容,more指令中内置若干快捷键

指令 说明
more 要查看的文件 查看文件内容
操作 功能说
空白键(space) 代表向下翻一页
Enter 代表向下翻一行
q 立刻离开 more
ctrl + F 向下滚动一屏
ctrl + B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行行号

less

less指令在显示文件内容时,不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

指令 说明
less 文件名 分屏显示文件内容 (查看大文件)
操作 功能说明
空白键 向下翻动一页
pagedown 向下翻动一页
pageup 向上翻动一页
/字符串 向下搜寻【字符串】的功能:n:向下查找 N:向上查找
?字符串 向上搜寻【字符串】的功能:n 向上查找 N 向下查找
q 离开less这个程序

echo

指令 说明
echo [选项] [输出内容] echo 输出内容到控制台
选项 说明
-e 支持反斜线控制的字符转换
控制字符 作业
\\ 输出\本身
\n 换行符
\t 制表符,也就是Tab键
1
2
3
4
# 输出主机名
eco $HOSTNAME
# 输出 hello world
echo "hello world"

head 用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容。

指令 说明
head 文件名 查看文件头10行内容
head -n 5 文件 查看文件头5行内容

tail

用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前10行内容

指令 说明
tail 文件 查看文件尾10行内容
tail -n 5 文件 查看文件尾5行内容,5可以是任意行数
tail -f 文件 实时追踪文档的所有更新;按Ctrl + S 可以暂停监听;按Ctrl + Q 可以继续监听

1.查看 /etc/profile 最后 5 行代码

1
tail -n /etc/profile

2.实时监控 mydate.txt,看到文件有变化时,是否看到,实时的追加的 hello world

1
2
3
touch mydate.txt
tail -f mydate.txt
echo 'hello world' > /home/mydate.txt

> 输出重定向 和 >> 追加

指令 说明
> 输出重定向
>> 追加
1
2
3
4
5
6
7
8
9
10
# 列表的内容写入文件 a.txt 中(覆盖写)
ls -l > a.txt

# 列表的内容追加的末尾
ls -al >> aa.txt

# 将文件 1 的内容覆盖到文件 2
cat 文件 1 > 文件 2

echo “内容” >> 文件

1.将 /home 目录下的文件列表写入到 /home/info.txt 中,覆盖写入

1
ls -l /home > /home/info.txt # [若info.txt不存在,则会创建文件]

2.将当前日历信息 追加/home/mycal 文件中

1
2
3
4
cal
cal >> /home/mycal
ls
cat mycal

ln

软链接(link)也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放了连接其他文件的路径。当使用 pwd 指令查看目录,看到的是软链接所在目录

指令 说明
ln -s [原文件或目录] [软链接名] 给原文件创建一个软链接

1.在 /home 目录下创建一个软链接 myroot,链接到 /root 目录

1
ln -s /root /home/myroot

2.删除软链接 myroot

1
rm /home/myroot

删除软连接: rm -rf 软连接名,而不是 rm -rf 软连接名/如果使用 rm -rf 软连接/ 删除,会把软连接对应的真实目录下内容删掉

history

指令 说明
history 查看历史命令

1.显示所有的历史命令

1
history

2.显示最近使用过的10个命令

1
history 10

3.执行历史编号为5的指令

1
!5

时间日期指令

指令 说明
date 显示当前时间
date +%Y 显示当前年份
date +%m 显示当前月份
date +%d 显示当前哪天
date "+%Y-%m-%d %H:%M:%S" 显示年月日时分秒
date -s 字符串时间 设置日期
cal [选项] 查看日历。不加选项,显示本月日历
1
2
3
4
5
6
7
8
9
10
11
12
13
date [option] + [format]

date -s 日期时间 # 设置日期时间

date + "日期时间格式" # 指定显示时使用的日期

date -s "2022-06-19 20:52:22" # 设置系统当前时间

cal -3 # 查看3个月的时间

cal 2023 # 查看2022年日历

cal # 查看本年度日历

搜索查找指令

find

find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端

指令 说明
find [搜索范围] [选项] 查找文件或目录
选项 功能
-name 查询方式 按照指定文件名查找模式查找文件
-user 用户名 查找属于指定用户名所有文件
-size 文件大小 按照指定文件大小查找文件,单位为 b-块 (512字节) c- 字节 w-字 2字节 k - 千字节 M -兆字节 G-吉字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 按名称查找
find -name nginx.conf

# 按路径加名称查找
find /root -name nginx.conf

# 按照后缀查找
find -name ".cfg"

# 按用户查找
find -user lys

# 按大小查找 +大于 -小于
find -size +1M # >
find -size -1M # <
find -size 1M # =

locate

locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库事先快速定位给定的文件。locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。

由于 locate 指令基于数据库进行查询,所以第一次运行前,必须 使用 updatedb 指令创建 locate 数据库

指令 说明
locate 搜索文件 快速定位文件路径

使用 locate 指令快速定位 hello.txt 文件所在目录

1
2
3
4
5
6
yum install mlocate
updatedb
locate hello.txt
# 查看指令所在位置
which ls
whereis locate

grep

grep 过滤查找,管道符 |,表示将前一个命令的处理结果输出传递给后面的命令处理

1
grep 选项 查找内容 源文件
选项 功能
-n 显示匹配行及行号
-i 忽略字母大小写

hello.txt 文件中,查找 “yes” 所在行并显示行号

1
2
cat /home/hello.txt | grep -n "yes" # 写法1
grep -n "yes" /home/hello.txt # 写法2

压缩和解压指令

gzip/gunip

指令 说明
gzip 文件 压缩文件
gunzip 文件.gz 解压文件
  • 只能压缩文件不能压缩目录
  • 不保留原来的文件
  • 同时多个文件会产生多个压缩包

1.gzip 压缩,将 /home 下的 hello.txt 文件进行压缩

1
gzip /home/hello.txt

2.gunzip 压缩,将 /home 下的 hello.txt.gz 文件进行解压缩

1
gunzip /home/hello.txt.gz

zip/unzip

zip 用于压缩文件,unzip 用于解压,zip 压缩命令在 window/linux 都通用,可以压缩目录且保留源文件

指令 说明
zip [选项] XXX.zip 压缩文件和目录命令
unzip [选项] XXX.zip 解压缩文件
选项 说明
zip -r 递归压缩,即压缩目录
unzip -d <目录> 指定解压后文件的存放目录

1.将 /home 下的所有文件进行压缩成 myhome.zip

1
zip -r myhome.zip /home/ # [将home目录及其包含的文件和子文件夹都压缩]  

2.将 myhome.zip 解压到 /opt/tmp 目录下

1
2
mkdir /opt/tmp
unzip -d /opt/tmp myhome.zip

tar

tar 指令是打包指令,最后打包后的文件是 tar.gz 文件

指令 说明
tar [选项] XXX.tar.gz 打包的内容 打包目录,压缩后的文件格式 .tar.gz
选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 执行压缩后的文件名
-z 打包同时压缩
-x 解压.tar文件
-C 解压到指定目录

1.压缩多个文件,将 /home/pig.txt/home/cat.txt 压缩成 pc.tar.gz

1
2
3
touch pig.txt
touch cat.txt
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

2.将 /home 的文件夹压缩成 myhome.tar.gz

1
tar -zcvf myhome.tar.gz /home/

3.将 pc.tar.gz 解压到当前目录。切换 /opt/

1
tar -zxvf pc.tar.gz 

4.将 myhome.tar.gz 解压到 /opt/tmp2 目录下

1
2
mkdir /opt/tmp2
tar -zxvf /home/myhome.tar.gz -C /opt/tmp2

组管理和权限管理

Linux 中每个用户必须属于一个组,不能独立于组外。在 Linux 中每个文件中有所有组、所在组、其他组的概念。

文件/目录所有者

一般为文件的创建者,谁创建了文件,自然称为该文件的所有者。当用户创建一个文件后,该文件所在的组就是用户所在的组

指令 说明
ls -ahl 查看文件的所有者
chown 用户名 文件名 修改文件所有者

组的创建

指令 说明
groupadd 组名 创建组
chgrp 组名 文件 修改文件所在的组
useradd -g 组名 用户 创建用户加入组

使用 root 用户创建文件 orange.txt,看看当前文件属于哪个组,然后将这个文件所在组,修改到 fruit

1
2
3
4
groupadd fruit
touch orange.txt
# 看看当前文件属于哪个组 root组
chgrp fruit orange.txt

改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组

指令 说明
usermod -g 新组名 用户名 改变用户所在组
usermod -d 目录名 用户名 改变该用户登录的初始目录(用户需要有进入新目录的权限

权限基本介绍

在 Linux 中我们可以使用 ll 或者 ls -l显示一个文件的属性以及文件所属的用户和组

从左到有的 10 个字符标识

(1) 0 首位表示文件类型

标识符 说明
- 代表文件
d 代表目录
l 代表链接
c 代码字符设备文件,鼠标,键盘
b 代表块设备,硬盘

(2) 第 1-3 位确定所有者(该文件的所有者)拥有该文件的权限。User

(3) 第 4-6 位确定所属组(所有者的同组用户)拥有该文件的权限。Group

(4) 第 7-9 位确定其他用户拥有该文件的权限 Other

作用到文件

r】: 代表可读(read)可以读取,查看

w】:代表可写(write)可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件

x】:代表可执行 (execute) 可以被系统执行

作用到目录:

r】: 代表可读(read)可以读取,ls 查看目录内容

w】:代表可写(write)可以修改,目录内创建+删除+重命名目录

x】:代表可执行(execute)可以进入该目录

文件基本属性介绍

修改权限 chmod

通过 chmod 指令,可以修改文件或者目录的权限

第一种方式 +、-、= 变更权限

1
2
3
4
u:所有者 g:所有组 o:其他人 a:所有人
chmod u=rwx,g=rx,o=x 文件/目录名
chmod o+w 文件/目录名
chmod a-x 文件/目录名

1.给 abc 文件的所有者读写执行的权限,给所在组读执行权限,给其他组读执行权限

1
chmod u=rwx,g=rx,o=rx abc

2.给 abc 文件的所有者去除执行的权限,增加组写的权限

1
chmod u-x,g+w abc

3.给 abc 文件的所有用户添加读的权限

1
chmod a+r abc

第二种方式 通过数字变更权限

1
2
3
4
r=4 w=2 x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名
# 等于
chmod 751 文件目录名

/home/abc.txt 文件的权限修改成 rwxr-xr-x,使用数字方式实现

1
chmod 755 /home/abc.txt

修改文件所有者 chown

指令 说明
chown newowener 文件/目录 改变所有者
chown newowener:newgroup 文件/目录 改变所有者和所在组
选项 说明
-R 如果是目录,则使其下所有子文件或者目录递归生效

1.请将 /home/abc.txt 文件的所有者修改成tom

1
chown tom /home/abc.txt

2.请将 /home/test 目录下所有的文件和目录的所有者都修改成tom

1
chown -R tom /home/test

修改文件/所在组 chgrp

指令 说明
chgrp newgroup 文件/目录 改变所在组

1.请将 /home/abc.txt 文件的所在组修改成shaolin

1
2
groupadd shaolin
chgrp shaolin /home/abc.txt

2.请将 /home/test 目录下的所有的文件和目录的所在组修改成shaolin

1
chgrp -R shaolin /home/test

定时任务调度

crond 任务调度

任务调度:系统在某个时间执行的特定命令或程序

任务调度分类:1.系统工作 2.个别用户工作

指令 说明
crontab [选项] 进行定时任务的设置
选项 说明
-e 编辑crontab定时任务
-l 查询crontab定时任务
-r 删除当前用户所有的crontab任务
1
2
3
conrtab -r # 终止任务调度
conrtab -l # 列出当前的任务调度
service crond restart # 重启任务调度

设置任务调度文件:/etc/crontab

设置个人任务调度。执行 crontab -e 命令

接着输入任务到调度文件

1
2
3
crontab -e
# 每一小时的每分钟执行 ls -l /etc/ > /tmp/to.txt
*/1 * * * * ls -l /etc/ > /tmp/to.txt
项目 含义 范围
第一个 * 一小时当中的第几分钟 0-59
第二个 * 一天当中的第几小时 0-23
第三个 * 一个月当中的第几天 1-31
第四个 * 一年当中的地几个月 1-12
第五个 * 一周当中的星期几 0-7(0和7代表周日)

特殊符号说明

特殊符号 含义
* 代表任何时间,比如第一个“*”就代表一小时中每分钟都执行一次的意思
, 代表不连续的时间。比如“0 8,12,16 *” 就代表在每天的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间访问。比如“0 5 1-6” 代表在周一到周六的凌晨5点0分执行命令
*/n 代表每隔多久执行一次,比如”/10 *” 命令,代表每隔10分钟就执行一遍命令

特定时间执行任务案例

时间 含义
45 22 * * * 每天22点45分执行命令
0 17 * * 1 每周1的17点0分执行命令
0 5 1,15 * * 每月1号 15号的凌晨5点0分执行命令
40 4 * * 1-5 每周一到周五 4点40分执行命令
*/10 4 * * * 每天的凌晨4点,每隔10分钟执行一次命令
0 0 1,15 * 1 每月1号和15号,每周1的0点0分都会执行命令。注意:星期几和几号最好不要同事出现,因为他们定义的都是天。非常容易让管理员混乱
1
2
3
4
5
6
7
8
9
10
11
# 案例1:每隔1分钟,将当前日期信息追加到/tmp/mydate
*/1 * * * * date >> /tmp/mydate

# 案例2:每隔1分钟,将当前日期和日历追加到/tmp/mycal
1. vim /home/my.sh 写入内容 date >> /home/mycal 和 cal >> /home/mycal
2. 给my.sh增加执行权限 chmod u+x/home/my.sh
3. crontab -e 增加*/1 * * * * /home/my.sh

# 案例3:每天凌晨2:00将MySQL数据库testdv备份到文件中
1. crontab -e
2. 0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak

at 定时任务

1.at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行

2.默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业

3.at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务

4.在使用 at 命令时,一定要保证 atd 进程的启动,可以使用相关指令来查看

1
2
3
ps -ef # 检测当前运行的进程
# 加上过滤操作
ps -ef | grep atd # 检测atd是否在运行
1
2
at [选项] [时间]
# Ctrl+D 结束at命令的输入
选项 说明
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q <队列> 使用指定的队列
-f <文件> 从指定文件读入任务而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交运行的任务

磁盘分区和挂载

查看所有设备挂载情况

指令 说明
lsblk 查看挂载情况
lsblk -f 查看详细的设备挂载情况,显示文件系统信息

查看磁盘空间使用情况

指令 说明
df -h 查询系统整体磁盘使用情况
du -h 查询指定目录的磁盘占用情况

du -h

选项 功能
-h 带计量单位
-a 含文件
-c 显示所有的文件和子目录大小后,显示总和
-s 指定目录占用大小汇总
--max-depth=n 指定统计子目录的深度为第n层

查询 /opt 目录的磁盘占用情况,深度为 1

1
2
cd /opt/
du -h --max-depth=1 /opt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 统计/opt文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l

# 统计/opt文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l

# 统计/opt文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l

# 统计/opt文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l

# 以树状显示目录结构
tree 目录

mount/umount 挂载/卸载

指令 说明
mount [-t vfstype] [-o options] device dir 挂载设备
umount 设备文件名或挂载点 卸载设备
参数 功能
-t vfstype 指定文件系统的类型,通常不必指定。mount会自动选择类型。常用类型有:光盘或光盘镜像 DOS Windows9x fat32文件系统:vfat Windows NT ntfs 文件系统: ntfs Mount Windows 文件网络共享:smbfs UNIX(LINUX)文件共享:nfs
-o options 主要用来描述设备或档案的挂接方式。常用的参数有: loop 用来把一个文件当成硬盘分区挂接上系统 ro:采用只读方式挂接设备 rw:采用读写方式挂接设备 iocharset: 指定访问系统所用字符集
device 要挂接的设备
dir 设备在系统上的挂载点

fdisk 分区

指令 说明
fdisk -l 查看磁盘分区详情
fdisk 硬盘设备名 显示所有硬盘的分区列表

网络配置和系统管理操作

指令 说明
ifconfig 查看Linux的网络配置
ping 目的主机 测试当前服务器是否可以连接目的主机

Linux 网络环境配置

直接修改配置文件来指定 IP,并可以连接外网

修改为静态IP

1
vim /etc/sysconfig/network-scripts/ifcfg-“ifconfig看到的前缀”
1
2
3
4
5
6
7
BOOTPROTO="static"
#IP地址
IPADDR=192.162.202.100
# 网关
GATEWAY=192.168.202.2
# 域名解析器
DNS1=192.168.202.2

重启网络服务

1
2
# 重启网卡
server network restart

设置主机名

1
2
3
4
5
# 查看主机名
hostname
# 修改文件在/ect/hostname指定
vim /ect/hostname
# 修改后,重启生效

设置 hosts 映射

如何通过主机名找到某个 Linux 系统

  • 对于 Winodws:在 C:Windows\System32\drivers\etc\hosts 文件指定即可
  • 对于 Linux:在 /etc/hosts 文件指定
1
vim /etc/hosts

进程管理

显示系统执行的进程

指令 说明
ps 用来查看目前系统中,哪些正在执行,他们执行的状况,可以不加任何参数
选项 功能
-a 显示当前终端的所有进程信息
-u 以用户的格式显示进程信息
-x 显示后台进程运行的参数
字段 说明
PID 进程标识
TTY 终端机号
TIME 此进程所消CPU时间
CMD 正在执行的命令或进程名

ps -aux

指令 说明
ps -aux | grep xxx 显示系统执行的进程
参数 说明
USER 用户名称
PID 进程号
%CPU 该进程占用CPU百分比
%MEM 进程占用物理内存的百分比
VSZ 进程占用虚拟内存的大小,单位KB
RSS 进程占用实际物理内存的大小,单位KB
TTY 终端名称
STAT 进程状态
START 进程的启动时间
TIME 进程占用CPU的运算时间
COMMAND 启动进程所用的命令和参数

ps -ef

1
ps -ef | grep sshd
指令 说明
ps -ef 以全格式显示当前所有的进程,查看进程的父进程
选项 说明
-e 显示所有的进程
-f 全格式
参数 说明
UID 用户ID
PID 进程ID
PPID 父进程ID
C CPU用于计算执行优先级的因子。数字越大,表明进程是CPU密集型运算,执行优先级会降低;数字越小,表明进程是I/O密级型运算,执行优先级会提高
STIME 进程启动的时间
TTY 终端名称
TIME CPU时间
CMD: 启动进程所用的命令和参数

小结

如果是想查看进程 CPU 占用率和内存占用率,可以使用 aux

如果想查看进程的父进程 ID 可以使用 ef;

进程终止

指令 说明
kill [选项] 进程号 通过进程号杀死进程
killall 进程名称 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
选项 功能
-9 表示强迫进程立即停止

kill -l 查看各个号码代表的意思

查看进程树

指令 说明
pstree [选项] 直观查看进程信息
选项 功能
-p 显示进程PID
-u 显示进程的所属用户

服务管理

服务本质是运行在后台的进程,通常监听某个端口,等待其他程序的请求,因此又称为守护进程

1
service 服务名 [start | stop | restart | status]
1
2
3
4
5
6
7
8
9
10
11
# 查看网络服务的状态 
service network status

# 停止网络服务
service network stop

# 启动网络服务
service network start

# 重启网络服务
service network restart

查看服务名

方式1 使用setup->系统服务

方式2 /etc/init.d 看到service指令管理的服务

1
ls -l /etc/init.d/ # service指令管理的服务在/etc/init.d查看

systemctl

1
2
3
4
systemctl [start | stop | restart | status]  服务名

# 查看服务的方法:
ls - al /usr/lib/systemd/system
指令 说明
systemctl list-unit-files [| grep 服务名] 查看服务开机启动状态
systemctl enable service_name 开启指定服务的自动启动(永久生效)
systemctl disable service_name 关掉指定服务的自动启动(永久生效)
systemctl is-enabled 服务名 查询某个服务是否是自启动
1
2
3
4
5
6
7
8
9
10
11
# 查看防火墙服务的状态 
systemctl status firewalld

# 停止防火墙服务 (临时生效)
systemctl stop firewalld

# 开启防火墙服务 (临时生效)
systemctl start firewalld

# 重启防火墙服务
systemctl restart firewalld

打开或关闭指定端口

指令 说明
firewall-cmd --permanent --add-port=端口号/协议 打开端口
firewall-cmd --permanent --remove-port=端口号/协议 关闭端口
firewall-cmd --reload 重新载入,才能生效
firewall-cmd --query-port=端口号/协议 查询端口是否开放

监控网络状态

指令 说明
netstat [选项] 查看系统网络情况
1
2
3
netstat -anp | grep 进程号 # 查看该进程网络信息
netstat -nlp | grep 端口号 # 查看网络端口号占用情况
netstat -atnp # 查看连接
选项 功能
-a 显示所有正在监听(listen)和未监听的套接字(socket)
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在监听的服务状态
-p 表示显示哪个进程在调用
-t 显示TCP传输协议的连线状况

动态监控进程

指令 说明
top [选项] 实施监控系统进程状态
选项 功能
-d 秒数 指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行
-i 使top不显示任何闲置或者僵死进程。
-p 通过指定进程ID来仅仅监控某个进程的状态
交互操作 功能
P 以CPU使用率排序,默认就是此项
M 以内存的使用率排序
N 以PID排序
q 退出top
u 根据指定用户进行过滤
k 直接杀死

软件包管理

RPM

rpm 用于下载包的打包及安装工具

指令 说明
rpm -qa 查询所安装的所有rpm软件包
rpm -q 软件包名 查询软件是否安装
rpm -ql 软件包名 查询软件包中的文件
rpm -qf 文件全路径名 查询文件所属的软件包
rpm -e RPM包的名称 卸载rpm软件包
rpm -ivh RPM包全路径名称 安装RPM包

rpm -ivh RPM 包全路径名称 参数说明

选项 说明
-i install 安装
-v —verbose 显示详细信息
-h —hase,进度条
--nodeps 安装前不检查依赖

yum

YUM 是 Shell 前端软件包管理。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包

指令 说明
yum [选项] [参数]
选项 功能
-y 对所有提问都回答“yes”
参数 功能
install 安装rpm 软件包
update 更新rpm软件包
check-update 检查是否有可用的更新rpm软件包
remove 删除指定的rpm软件包
list 显示软件包信息
clean 清楚yum过期的缓存
deplist 显示yum软件包的所有依赖关系

yum 方式安装 firefox

1
2
3
4
yum list | grep firefox
# 卸载老版本
yum remove firefox
yum -y install firefox

修改网络 YUM 源 (默认会自己搜索最近的)

1.安装 wget, wget 用来从指定的 URL 下载文件

1
2
3
yum update
yum install wget
wget --version

2.在 /etc/yum.repos.d/ 目录下,备份默认的 repos 文件

1
cp CentOS-Base.repo CentOS-Base.repo.backup

3.下载网易 163 或者是 aliyun 的 repos 文件,任选其一

1
2
wget http://mirrors.aliyun.com/repo/Centos-7.repo # 阿里云
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo # 网易

4.使用下载好的 repos 文件替换默认的 repos 文件 例如:用 CentOS7-Base-163.repo 替换 CentOS-Base.repo

1
mv CentOS7-Base-163.repo CentOS-Base.repo

5.清理旧缓存数据,缓存新数据

1
2
yum clean all
yum makecache

yum makecache 就是把服务器的包信息下载到本地电脑缓存起来

6.测试

1
2
yum list | grep firefox
yum -y install firefox

安装配置 JDK 8

  1. midir /opt/jdk
  2. 通过xft上传到/opt/jdk
  3. cd /opt/jdk
  4. 解压 tar -zxvf jdk1.8.0_261-linux-x64.tar.gz
  5. mkdir /usr/local/java
  6. mv /opt/jdk/jdk 1.8.0_261 /usr/local/java
  7. 配置环境变量的配置文件vim /etc/profile
  8. export JAVA_HOME=/usr/local/java/jdk_1.8.0_261
  9. export PATH = $JAVA_HOME/bin:$PATH
  10. source /etc/profile [让文件生效]
  11. 测试是否安装成功

安装配置 Tomcat

  1. 上传安装文件,并解压到/opt/tomcat
  2. 进入解压目录/bin,启动tomcat ./startup.sh
  3. 开放端口8080
  4. 测试是否安装成功

安装 MySQL 5.7

  1. 新建文件夹/opt/mysql

  2. 运行 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

  3. 解压tar -xvf mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

  4. 运行rpm -qa | grep mari,查询mariadb相关安装包

  5. 运行rpm -e --nodeps mariadb-libs

  6. 运行以下命令

    1
    2
    3
    4
    rpm -ivh mysql-community-common-5.7.35-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-5.7.35-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-5.7.35-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-5.7.35-1.el7.x86_64.rpm
  7. 运行systemctl start mysqld.service,启动mysql

  8. 设置root密码:mysql自动给root设置随机密码,运行grep "password" /var/log/mysqld.log查看 5WWkpO)Itdpp

  9. 运行mysql -u root -p,用root登录

  10. 设置root密码。运行set global validate_password_policy=0;提示密码设置策略

  11. set password for 'root'@'localhost'=password('xxx')

  12. 运行 flush privileges;使密码设置生效

Shell

脚本格式要求

  1. 脚本以#!/bin/bash开头
  2. 脚本需要有可执行权限

变量

Shell变量分为系统变量和自定义变量

系统变量:$HOME$PWD$SHELL

指令 说明
set 显示当前shell中所有变量

自定义变量

1
2
3
4
5
6
7
8
# 定义变量
变量=值
A=100
echo "A=$A"
# 撤销变量
unset 变量
# 声明静态变量,不能unset
readonly 变量
  • 变量名可以由字母、数字和下划线组成,但是不能以数字开头

  • 等号两侧不能有空格

  • 变量名一般大写

  • 将命令的返回值赋值变量

    1
    2
    3
    A=`date`
    #
    A=${date}

设置环境变量

指令 说明
export 变量名=变量值 将shell变量输出为环境变量
source 配置文件 让修改后的配置信息立即生效
echo $变量名 查询环境变量的值
1
2
3
4
5
# 在/etc/profile中定义TOMCAT_HOME环境变量
export TOMCAT_HOME=/opt/tomcat/apache-tomcat-9.0.75
# 查看环境变量TOMCAT_HOME的值
echo $TOMCAT_HOME
# 在另一个shell程序使用TOMCAT_HOME

位置参数变量

当执行一个shell脚本时,如果希望获取命令行的参数,就可以使用位置参数变量

参数 说明
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数用${10}
$* 代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 代表命令行中所有的参数,不过$@把每个参数区分对待
$# 代表命令行中所以有参数的个数

预定义变量

变量 说明
$$$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,证明上一个命令执行不正确

运算符

  1. $((运算式))$[运算式]expr m + nexpr运算符间要有空格,如果希望将expr的结果赋值给某个变量使用``
  2. expr m - n
  3. expr \* / % 乘,除,模
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# 计算 (2+3) × 4
# 写法1
ANS1=$((2+3)*4)
echo "ans1=$ANS1"
# 写法2
ANS2=$[(2+3)*4]
echo "ans2=$ANS2"
# 写法3
TEMP=`expr 2 + 3`
ANS3=`expr $TEMP \* 4`

# 求出 命令行的两个参数和
SUM=$[$1 + $2]
echo "sum=$SUM"

条件判断

1
2
# condition前后有空格,非空返回true,可使用$?验证(0为true,>1为false
[ condition ]
判断条件 说明
-eq 等于 equal
-ne 不等于 not equal
-lt 小于 less than
-le 小于等于 less equal
-gt 大于 greate than
-ge 大于等于 greater equal

:如果是字符串之间的比较,用等号”=“判断相等;用”!=“判断不等。

权限判断 说明
-r 有读的权限
-w 有写的权限
-x 有执行的权限
1
2
3
# 判断文件是否有可执行权限
[ -x helloworld.sh ]
echo $?
文件类型判断 说明
-e 文件存在
-f 文件存在并且是一个常规的文件
-d 文件存在并且是一个目录
1
2
3
4
5
6
# 23是否大于等于22
$ [ 23 -ge 22 ]
# 判断文件是否有可执行权限
$ [ -x helloworld.sh ]
# 文件是否存在
$ [ -e helloworld.sh]

流程控制

IF

1
2
3
if [条件判断]; then
程序
fi

1
2
3
4
if [ 条件判断式 ]
then
程序
fi

case

1
2
3
4
5
6
7
8
9
case $变量名 in
"值1")
;;
"值2")
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

for

1
2
3
4
for ((初始值; 循环控制条件; 变量变化 ))
do
程序
done

while

1
2
3
4
while [ 条件判断式 ]
do
程序
done

read 读取控制台输入

指令 说明
read (选项) (参数) 读取控制台输入
选项 说明
-p 指定读取值时的提示符
-t 指定读取值时等待的时间(秒)如果-t不加表示一直等待
参数 说明
变量 指定读取值的变量名
1
read -t 10 -p "请输入您的名称:" name

函数

系统函数

函数 说明
basename [string/pathname] [suffix] 取路径里的文件名称
dirname 文件绝对路径 取文件路径的绝对路径名称

自定义函数

1
2
3
4
5
6
7
8
9
[ function ] funname [()]

{

action;

[return int;]

}