【Linux笔记】Linux基本指令

一、操作指令

ls 指令

ls表示:list的缩写,列出目录下的文件

ls : 仅列出当前目录下文件和文件夹的名称

复制代码
ls
​
#有如下输出结果:
Desktop  Documents  Downloads  Music  Pictures  example.txt

ls -l:展示每个文件或目录的详细属性

复制代码
ls -l  
​
( ls表示:命令  -l表示:命令行选项) 
    
#输入指令
ls -l example.txt
    
#有如下输出结果:
-rw-r--r-- 1 user group 1024  5月 12 18:21 example.txt
​
​
#解释:以上述输出为例 
​
1. -rw-r--r--   文件类型和权限
    
2.  1           硬链接数:指向该文件的硬链接数量(如果是目录,代表其内部子目录的数量)。
​
3. user         所有者:创建或拥有该文件的用户名称。
​
4. group        所属用户组:该文件所属的用户组名称。
    
5. 1024         文件大小:单位是字节 (Bytes)。
​
6. 5月 12 18:21 最后修改时间:文件内容上一次被修改的日期和时间。
    
7. example.txt  文件或目录名称
​
​
#解释第一列输出的10 个字符 (-rw-r--r--)
    
#注1:首字符(文件类型):首字符一般由如下三个构成
    
-:普通文件 (文本、压缩包、图片、视频、可执行文件)   
    
d:目录 (directory,即文件夹)
    
l:软链接 (类似 Windows 的快捷方式)
​
c:字符文件(键盘,显示器,终端)
​
b:块设备文件 或 磁盘
​
p:管道文件
​
#温馨提示:系统不关心文件的后缀,但是工具(如gcc)关心文件的后缀,系统认为后缀是名的一部分
    
    
#注2:后 9 个字符(权限): 分为3组,每组3个字符,分别代表:所有者、同组用户 和 其他用户 的权限。
    
r (read):可读
    
w (write):可写
    
x (execute):可执行
    
-:没有该权限
    
#例如: rw- 代表可读可写但不可执行,r-- 代表只能读

ls -l 知识点补充1

复制代码
#知识点补充1:
	
A. ls -l : 默认查看当前目录下的详细属性
	

B. ls -l [指定目录]: 查看指定目录下的详细属性  
	
例如:假设所在目录路径 /root/mydir ,输入指令 ls -l /home,就可以查看目录home下的所有文件的详细属性

输出信息如下所示:
total 4
drwxr-xr-x 2 root root 4096 May 12 19:24 mydir


C. ls -l -d 或 ls -ld :看当前目录本身的详细属性 

例如:假设当前用户在目录路径 /root/mydir , 输入指令 ls -l -d 或 ls -ld ,就可以查看目录/home/mydir的详细属性

输出信息如下所示:
drwxr-xr-x 2 root root 4096 May 12 19:24 .


D. ls -l -d [指定目录] / ls -ld [指定目录] :查看指定目录本身的详细属性

#例如:存在目录路径 /root/mydir ,输入指令 ls -l -d /root/mydir 或 ls -ld /root/mydir,
#     可以指定查看目录/home/mydir的详细属性

#输出信息如下所示:
drwxr-xr-x 2 root root 4096 May 12 19:24 /root/mydir

ls -a : 列出目录下的所有文件,包括以.开头的隐含文件

复制代码
ls -a 
	
核心作用:显示隐藏文件

在 Linux 和 macOS 系统中,只要文件或文件夹的名称是以点 . 开头的,它就是隐藏文件(例如 .bashrc、.gitignore、.config/)。
复制代码
#ls 和 ls -a 的对比
	
1.普通的 ls,只显示常规文件和目录

2.使用 ls -a,所有隐藏的配置文件都出来了

ls:

Desktop  Documents  Downloads  Music  Pictures  Videos


ls -a:

.  ..  .bash_history  .bashrc  .cache  .config  Desktop  Documents  Downloads  Music  Pictures  Videos


#备注:

1. . (一个点):代表当前目录本身。

2. .. (两个点):代表上一级目录(父目录)

3. 任何一个目录(包括根目录),即使该目录是空的,系统也要默认给该目录自动生成 " . " 和 " .. " 

4. 对于根目录而言 . 和 .. 都代表当前目录本身

ls -d: 只看目录(文件夹)本身,不看目录(文件夹)里面的内容

复制代码
ls -d 

假设存在路径 /root/mydir

使用命令 ls -d /root/mydir ,即可输出目录本身 /root/mydir
复制代码
A. 使用场景1:查看目录本身的详细信息
	
通常我们会用 ls -l 来查看“当前目录下”的详细信息(权限、所有者、大小等),配合 -d 即可查看一个目录本身的详细信息。
	
假设存在路径 /root/mydir

输入:

ls -l -d /root/mydir 或 ls -ld /root/mydir 

输出结果:

drwxr-xr-x 3 root root 4096 May 13 19:14 /root/mydir
复制代码
B. 使用场景 2:只列出目录,不列出文件(配合通配符)
	
假设你当前目录下杂乱无章,既有文件又有文件夹,你只想挑出所有的文件夹来看看。

#错误做法:

如果你直接输入 ls *,系统会把当前目录下的文件列出来,并且把每一个子文件夹都打开,把里面的东西也全列出来,屏幕直接爆炸。
	
#正确做法:

利用 -d 和通配符的组合,使用命令:ls -d */

#解释:

*/ 专门匹配所有的目录,加上 -d 后,ls 就会乖乖地只把这些目录的名字打印出来,而不会去翻它们的底朝天。
复制代码
C. 场景 3:确认某个含有海量文件的目录是否存在
	
假设服务器上有一个存放了 100 万张图片的目录叫 images_backup,你想确认一下这个文件夹在不在当前目录。

#错误做法:

使用命令 ls images_backup,系统会去读取images_backup目录下,那 100 万个文件名然后打印在屏幕上,你的终端可能会卡死好几分钟。

#正确做法

使用命令 ls -d images_backup

系统会回答 images_backup(表示存在),或者报错 No such file or directory(表示不存在),绝对不会读取里面那 100 万个文件。

pwd 指令

pwd表示:Print Working Directory的缩写,显示当前工作路径。

pwd:显示用户当前所在的目录

复制代码
pwd

#输出结果

/home/user/Documents/project

cd 指令

cd : Change Directory 的缩写,意思是"切换目录 "或"改变目录"。

cd . :留在当前目录不动

复制代码
cd . 

核心作用:留在当前目录不动 (无效指令)

cd ..:退回到上一级目录(也就是当前目录的"父目录")

复制代码
cd .. 

核心作用:退回到上一级目录(也就是当前目录的“父目录”)。
复制代码
A.场景 1:普通退步

假设你当前在目录:/var/log/nginx

输入:cd ..
	
结果:你从 nginx 文件夹退了出来,来到了它的上一级 /var/log。
复制代码
B.场景 2:连续退步(高阶用法)

假设你当前在目录:/home/user1/projects/webapp

输入:cd ../..     #连续退两步

结果:你直接跳过了projects,回到了 /home/user1
复制代码
C.场景 3:退步并进入旁边的房间

假设你在 /var/log 目录下,你想去 /var/www 目录,你可以先退一步,再进一步:

输入:cd ../www

结果:先从/var/log 目录下退出到 /var,然后进入到 /var/www中

cd ~ :回到自己的 "主目录"(家目录)。

复制代码
cd ~

~ 是一个非常聪明的符号,它会根据你当前登录的账号,把你送回属于你自己的地盘:

A. 如果你是 root(超级管理员)

无论你在哪,输入 cd ~,你都会立刻回到 /root 目录。

B. 如果你是普通用户(例如名为 hamber 的用户)

无论你在哪,输入 cd ~,你都会立刻回到 /home/hamber 目录。


#技巧1

不需要敲那个波浪号 ~,直接敲 cd 然后回车,效果和 cd ~ 是一模一样

cd       # 等同于 cd ~


#技巧2

如果你在 ~ 后面直接跟上其他用户的用户名(中间不加空格),你就可以直接跳到他的主目录去(前提是你有权限)。

cd ~zhangsan    # 直接跳转到名为 zhangsan 这个用户的主目录 (/home/zhangsan)

cd 绝对路径:无视当前位置,直接空降到指定的确切坐标。

复制代码
cd  /.../目标目录


示例:

cd /c/Users/30398/Documents    # 切换到 Documents 目录
cd /c/Users/30398/Downloads    # 切换到 Downloads 目录
cd /                           # 回到根目录

注:绝对路径是从根目录 / 开始的完整路径,不依赖当前位置。

cd 相对路径:

复制代码
cd 相对路径
	
	
示例:

假设当前位置是 /root/Users/hamber:

cd Desktop              # 进入当前目录下的 Desktop
cd Documents/Work       # 进入当前目录下的 Documents/Work
cd ..                   # 回到上一级 /root/Users
cd ../..                # 回到上两级 /root
cd .                    # 不动,还在当前位置(无实际意义)
cd ~                    # 回到家目录 /root/Users/hamber
cd -                    # 切换到上一次所在的目录
	
注:相对路径是基于当前位置的路径,不从根目录 / 开始

cd -

复制代码
cd - :回到上一个目录

示例

假设当前位置在 /root/Users/hamber

cd /root/Users/hamber/Desktop    # 切到 Desktop
cd -                          	 # 切回 /root/Users/hamber
cd -                             # 又切到 Desktop

常用符号

符号 含义 示例
cd . 当前目录 cd ./Documents
cd .. 上一级目录 cd ..
cd ~ 家目录 cd ~
cd 回家目录 cd

touch 指令

touch: 用于创建空文件,如果文件已存在则更新修改时间(不改变内容)。

复制代码
touch 文件名

示例1: 文件不存在,创建文件

touch test.txt              # 创建空文件 test.txt
touch a.py b.py c.py        # 一次创建多个文件
touch dir/file.txt          # 在指定目录下创建文件

示例2:文件存在,则更新时间戳(包括 Access 时间戳、 Modify 时间戳、Change 时间戳)

touch temp.txt 				#创建空文件 temp.txt
touch temp.txt 				#文件已存在,只更新修改时间,内容不变

文件时间戳: Access、Modify、Change

复制代码
文件时间戳:Access、Modify、Change

1. Access Time (atime)

  - 读取文件内容时更新
  - 包括:cat、less、grep、head、编译等


2. Modify Time (mtime)

  - 修改文件内容时更新
  - 包括:编辑、重定向、追加等


3. Change Time (ctime)

  - 修改文件属性数据时更新
  - 包括:权限、所有者、链接数、内容修改


4.文件操作对应文件时间戳的改变

文件操作
   │
   ├─ 读取内容 ─────────→ Access Time 更新
   │
   ├─ 修改内容 ─────────→ Modify Time 更新
   │                    Change Time 更新
   │
   └─ 修改元数据 ───────→ Change Time 更新
     (权限/所有者)

touch -a:只修改访问时间

复制代码
touch -a 文件名


示例:假设现在系统时间是 10:00:00,我们按顺序执行以下命令:

touch demo.txt
stat demo.txt

# 输出结果片段:
# Access: 2026-05-27 10:00:00  (访问时间)
# Modify: 2026-05-27 10:00:00  (修改时间)
# Change: 2026-05-27 10:00:00  (状态更改时间)

等待几分钟,假设现在时间是 10:05:00,只更新访问时间 (-a)

touch -a demo.txt
stat demo.txt

# 输出结果片段:
# Access: 2026-05-27 10:05:00  (访问时间)
# Modify: 2026-05-27 10:00:00  (修改时间)
# Change: 2026-05-27 10:05:00  (状态更改时间)

touch -c: 只更改修改时间

复制代码
touch -c filename


示例:假设现在系统时间是 11:00:00,我们按顺序执行以下命令:

touch demo.txt
stat demo.txt

# 输出结果片段:
# Access: 2026-05-27 11:00:00  (访问时间)
# Modify: 2026-05-27 11:00:00  (修改时间)
# Change: 2026-05-27 11:00:00  (状态更改时间)

等待几分钟,假设现在时间是 11:05:00,只更新修改时间 (-c)

touch -c demo.txt
stat demo.txt

# 输出结果片段:
# Access: 2026-05-27 11:00:00  (访问时间)
# Modify: 2026-05-27 11:05:00  (修改时间)
# Change: 2026-05-27 11:05:00  (状态更改时间)

mkdir 指令

mkdir:用于创建目录(文件夹)。

复制代码
mkdir 目录(文件夹)

示例

mkdir test              # 创建单个目录 test
mkdir a b c             # 一次创建多个目录
mkdir dir/sub           # 在 dir 目录下创建 sub(要求 dir 已存在)

mkdir -p: 自动创建路径中所有不存在的父目录,以递归的方式创建

复制代码
mkdir -p 目录 


示例1:

#1.没有-p 参数的情况下

mkdir a/b/c		 #报错:mkdir: cannot create directory 'a/b/c': No such file or directory

因为 a 和 b 都不存在,mkdir 默认只创建最后一级。


#2.有-p 参数的情况下

mkdir -p a/b/c   #系统会自动按顺序创建:a → a/b → a/b/c,全部不存在就全部创建。


示例2:

# 创建项目结构
mkdir -p myapp/{src/main,src/test,bin,doc}

# 结果:
# myapp
# ├── src
# │   ├── main
# │   └── test
# ├── bin
# └── doc

rmdir 指令

rmdir 用于删除目录,但只能删除空目录。

复制代码
rmdir 目录名


示例1:

mkdir test
rmdir test      # 成功,test 是空目录


示例2:目录非空会失败

mkdir test
touch test/file.txt
rmdir test      # 报错:Directory not empty

rmdir -p:递归删除空的父目录

复制代码
rmdir -p 目录名/目录路径


示例1:

mkdir -p a/b/c
rmdir -p a/b/c    # c 删了,b 也空了删掉,a 也空了删掉,全部清掉

示例2:

存在如下路径:
 path1/
  ├── myfile.txt
  └── path2/
      ├── myfile.txt
      └── path3/
          └── path4/

rmdir -p path1/path2/path3/path4 

#出现如下报错
#rmdir: failed to remove directory ‘path1/path2’: Directory not empty

rm 指令

rm : 用于删除文件,会进行提示是否删除文件

复制代码
rm 文件名 


示例:删除单个普通文件

touch temp.txt
rm temp.txt

示例:删除多个普通文件

touch a.txt b.txt c.txt
rm a.txt b.txt c.txt

rm -r:用于删除目录(包括目录内所有内容),会进行提示是否删除文件

复制代码
rm -r 目录

示例:

假设存在如下路径:

path1
  ├── myfile.txt
  └── path2
      ├── myfile.txt
      └── path3
          └── path4
          
rm -r path1 	#将path1目录,以及 “目录的文件” 和 “子目录及文件” 的内容均进行删除

rm -f : 只能强制删除文件,删除不进行提示、删除不存在的文件也不报错

复制代码
rm -f 文件

示例:

touch temp.txt
rm -f temp.txt

#不会出现提示信息,强制删除temp.txt文件

rm -i: 只能删除文件,且每删一个文件都问你确认

复制代码
rm -i 文件

示例:

#指令:
touch a.txt b.txt c.txt
rm -i a.txt b.txt c.txt

# 输出:
# remove a.txt? y     ← 每个文件都问
# remove b.txt? y
# remove c.txt? n     ← 输入 n 就不删

rm -I: 只能删除文件,删超过3个文件时只问一次是否删除

复制代码
rm -I 文件

示例:

#指令输入:
touch a.txt b.txt c.txt d.txt
rm -I a.txt b.txt c.txt d.txt

#指令输出:
rm: remove 4 arguments? y

rm -v :只能删除文件,且每删一个文件都问你确认,并输出删出信息

复制代码
rm -v 文件
	
示例:

#指令
touch a.txt b.txt c.txt
rm -v a.txt b.txt c.txt

#输出
#rm: remove regular empty file ‘a.txt’? y
#removed ‘a.txt’
#rm: remove regular empty file ‘b.txt’? y
#removed ‘b.txt’
#rm: remove regular empty file ‘c.txt’? y
#removed ‘c.txt’

rm -rf : 强制 删除目录 和 删除文件,删除不进行提示、删除不存在的文件也不报错

复制代码
rm -rf 目录/文件


示例1:

touch temp.txt
rm -rf temp.txt

#不会出现提示信息,强制删除temp.txt文件


示例2:

假设存在如下路径:

path1
  ├── myfile.txt
  └── path2
      ├── myfile.txt
      └── path3
          └── path4

rm -rf path1

#不会出现提示信息,强制删除path1(包括目录内所有内容)

其他常见组合:

rm -r mydir # 删目录

rm -rf mydir # 删目录,不提示

rm -rfv mydir # 删目录,不提示,显示过程

rm -ri mydir # 删目录,逐个确认

通配符删除

rm *.txt # 删除所有 .txt 文件

rm test * # 删除所有 test 开头的文件

rm -r dir */ # 删除所有 dir 开头的目录

危险操作 ⚠️

rm -rf / # 删除整个系统 --- 绝对不要执行

rm -rf ~ # 删除家目录 --- 绝对不要执行

rm -rf * # 删除当前目录下所有内容

rm -rf . # 同上

cp 指令

cp:复制文件,并会提示是否将源文件覆盖目标文件

复制代码
cp 源文件 目标文件/⽬录

#注:
#1.源文件必须存在
#2.若目标文件不存在则生成目标文件,并将源文件中的内容拷贝到目标文件中。若目标文件存在,则提示是否将源文件的内容覆盖目标文件。
#3.若cp 源文件 目录,此时目录必须存在,才能将源文件复制到指定目录下


示例1:

cp a.txt b.txt              # 复制 a.txt 为 b.txt
cp a.txt dir/               # 复制 a.txt 到 dir 目录下 (dir目录必须存在)
cp a.txt dir/b.txt          # 复制 a.txt 到 dir 下并复制 a.txt 为 b.txt


示例2:

cp a.txt b.txt c.txt dir/    # 复制多个文件到 dir 目录

cp -r: 将整个源目录及其内部包含的所有子目录和文件,将其复制到目标目录

复制代码
cp -r 源目录 目标目录

#注:当然cp -r 也拥有cp指令的功能,复制源文件到目标文件/目标目录。

工作方式:

它会完整遍历源目录的整个树结构,包括:
- 所有子目录
- 所有文件
- 嵌套的子目录和文件
复制代码
示例1:

假设你当前目录下有一个文件夹叫 source_folder,你想把它复制一份并命名为 new_folder,且 new_folder 目前不存在。

source_folder 文件目录结构

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test


cp -r source_folder ./new_folder

结果:

系统会自动创建 new_folder,然后把 source_folder 里面的所有内容一模一样地复制到 new_folder 中。

文件结构图如下:

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test
|-- new_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test
复制代码
示例2:

假设你想把 source_folder 复制到 new_folder 中,但 source_folder 和 new_folder 文件夹均存在。

source_folder 文件目录结构如下:

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test


指令: cp -r source_folder new_folder

结果:系统会将 source_folder 作为一个完整的文件夹,放入 new_folder 的内部。

文件结构图如下:

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test
|-- new_folder
|   `-- source_folder
|       `-- myapp
|           |-- doc
|           `-- src
|               |-- main
|               `-- test
复制代码
示例3:

假设 source_folder 和 new_folder 文件夹均存在,你想把 source_folder 的文件内容复制到 new_folder 中

source_folder 和 new_folder 文件目录结构如下:

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test
|-- new_folder


指令: cp  source_folder/* -r new_folder

结果:系统会把 source_folder 里面的所有内容一模一样地复制到 new_folder 中。

|-- source_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test
|-- new_folder
|   `-- myapp
|       |-- doc
|       `-- src
|           |-- main
|           `-- test

mv 指令

mv:用于移动文件/目录 (相当于windows系统中的剪切) 或 重命名。

复制代码
mv 源文件 目标路径或目标文件名

#源文件:你想要移动或重命名的文件/目录(可以是一个或多个)。
#目标路径/文件:你想要将文件移动到的位置,或者你想给文件起的新名字。
复制代码
重命名:同目录

示例:

# 文件名变了,但还在同一个目录下 → 重命名
mv oldname.txt newname.txt


# 目录也可以重命名
mv old_dir/ new_dir/
复制代码
移动:跨目录

示例1:

假设file.txt在目录 /home/user/Lesson1/ 

# 文件名不变,但换到了另一个目录 → 移动
mv file.txt /home/user/Lesson2/  # <- 将file.txt 移动到Lesson2中

# 同时移动+重命名
mv file.txt /home/user/Lesson2/newname.txt #<- 将file.txt 移动到Lesson2中,并将file.txt重命名为newname.txt

# 移动多个文件
mv file1.txt file2.txt /path/user/Lesson2/

man 指令

man: manual的缩写(手册),用于查看 Linux 命令、函数、配置文件的详细帮助文档。

复制代码
man 命令名


示例1:

man ls

man cp

man printf

示例2:

# 同名内容存在于多个章节时,指定章节

man 2 open       # 查看 open 系统调用(第2章)

man 3 printf     # 查看 printf 库函数(第3章)

man 手册分为 9 个章节,常用的章节:

  1. 用户命令(ls, cp, grep)

  2. 系统调用(open, fork, read)

  3. C 库函数(printf, malloc, strcpy)

echo 指令

echo :将你指定的文本、字符串或变量的值,原样输出到屏幕上(标准输出)

复制代码
echo 字符串
	

输入:echo "Hello, Linux!"

输出:Hello, Linux!
	
	
注意:echo 默认会在输出的文本末尾自动添加一个“换行符”,所以每次执行完光标都会换到下一行。

echo:结合重定向(> 和 >>)操作文件

覆盖写入 (>):如果文件存在,会清空原有内容并写入新内容;如果不存在则创建文件。

复制代码
基本语法:

echo 字符串 > 文件


例如:echo "This is a new file" > config.txt

解释:上述指令目的是将字符串"This is a new file" 写入到文件 config.txt

注:若文件config.txt不存在则新建文件,若config.txt存在则先清空,然后再写入

追加写入 (>>):将内容追加到文件末尾,不破坏原有内容。

复制代码
基本语法:

echo 字符串 >> 文件


例如:echo "Add this line to the end." >> config.txt

解释:上述指令目的是将字符串"This is a new file" 追加到文件 config.txt
	
注:若文件config.txt不存在则新建文件,若config.txt存在则将内容添加到文件末尾

cat 指令

cat : 查看目标文件的内容,是英文concatenate(连接)的缩写

复制代码
cat 文件 

示例:

# 查看单个文件
cat file1.txt

# 查看多个文件(依次显示)
cat file1.txt file2.txt

# 查看所有 txt 文件
cat *.txt

cat -n: 查看目标文件的内容,所有行显示行号

复制代码
cat -n


示例

cat -n file.txt

# 显示行号
# 1  hello
# 2  world
# 3
# 4  test

cat > : 1.主要用于快速创建文件 并从键盘输入内容 2.主要用于合并文件

复制代码
cat > 文件名


示例1:

# 1. 输入命令并指定要创建(或覆盖)的文件名
cat > note.txt

# 2. 此时光标会换行,你可以开始输入任意内容:
Hello, Linux!
This is a test file.

# 3. 输入完成后,按一下回车键(确保在独立的新行)
# 然后按下键盘上的 Ctrl + D (表示 EOF,即 End Of File 文件结束)。


示例2:

# 合并两个文件
cat file1.txt file2.txt > merged.txt

#1.系统会严格按照你书写的顺序,先读取 file1.txt 的全部内容,紧接着读取 file2.txt 的全部内容。
#2.如果 merged.txt 不存在:系统会自动为你创建一个新文件,并写入合并后的内容。
#3.如果 merged.txt 已经存在:系统会毫不留情地清空它原有的所有内容,然后才把 file1.txt 和 file2.txt 的内容写进去。

cat >>: 在不破坏原文件内容的前提下,将新内容追加到文件的最末尾。

复制代码
cat >> 文件名


示例:若todo.txt中包含字符串“Hello ”

#1.启动追加模式
cat >> todo.txt

#2.光标跳到下一行,你输入以下内容:
Linux

#3.输入完成后,按下回车(换到新行),然后按 Ctrl + D 保存并退出。

#4.此时todo.txt 中的内容为:Hello Linux

tac 指令

tac:倒序显示文件内容(从最后一行到第一行)

复制代码
tac 文件


示例1:

#1.假设原文件 file.txt:
1
2
3

#2.输入指令
tac file.txt

#3.出现如下输出:
3
2
1


示例2:查看最新日志(倒序)

tac /var/log/messages 

#从最新的日志开始找,找到前 20 个信息
tac /var/log/messages | head -20

more 指令

more:在屏幕上加载部分文件内容,在屏幕底部提示 --More--,只能让你向后移动,按页或按行看。

复制代码
more 文件

示例

more file.txt #只能逐行向后查看file.txt文件内容

more /var/log/syslog  #只能逐行向后查看syslog文件内容

不推荐使用:由于只能向后查看不能向前查看

推荐使用 :less,功能更强,more 有的功能 less 全都有

less 指令

less:在屏幕上加载部分文件内容,让你既能向前移动又能向后移动,按页或按行看。

复制代码
less 文件

示例:

#1.向temp.txt写入字符串(从hello 0到 hello 2000)
cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt

#2.输入指令,阅读文件temp.txt
less temp.txt

#3.输出
#hello 0
#hello 1
#hello 2
#hello 3
#hello 4
:

less -N:在屏幕上加载部分文件内容(带行号的加载),让你既能向前移动又能向后移动,按页或按行看。

复制代码
less -N 文件


示例:

#1.向temp.txt写入字符串(从hello 0到 hello 2000)
cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt

#2.输入指令,阅读文件temp.txt
less temp.txt

#3.输出
#1 hello 0
#2 hello 1
#3 hello 2
#4 hello 3
#5 hello 4
:

less 四大核心键

Space : 向下翻一页

复制代码
Space — 向下翻一页

# 按 Space 后:
# ─────────────
# 第 1~30 行    ← 原来显示的
# ─────────────
# 按 Space
# ─────────────
# 第 31~60 行   ← 翻到下一页
# ─────────────

从当前页往下翻一页(通常一屏约 20~30 行)。

b :向上翻一页

复制代码
b — 向上翻一页

# 当前显示第 31~60 行
# ─────────────
# 第 31~60 行
# ─────────────
# 按 b
# ─────────────
# 第 1~30 行    ← 翻回上一页
# ─────────────

与 Space 方向相反,往回翻一页。

/:从当前浏览位置,向下搜索"字符串"的功能

复制代码
/ 字符串 - 向下搜索字符串

示例

假设file.txt中含有“hello world”

#1.浏览file.txt文件
less file.txt

#2.搜索字符串
/ “world”

#3.跳转到字符串“world”的位置,并进行高亮字符串

q:退出

复制代码
q — 退出

示例:

#1.输入指令,进行浏览文件file.txt
less file.txt

#2.浏览文件中 ...

#3.输入q进行退出浏览
q         ← 按 q 立刻退出,回到命令行

head 指令

head:用于查看文件开头的内容,常用于查看日志(默认前 10 行)

复制代码
head 文件


示例

# 默认查看前 10 行
head file.txt

head -n: 用于查看文件开头前n行的内容,常用于查看日志

复制代码
head -n 文件


示例

# 查看前 5 行
head -n 5 file.txt

# 简写形式
head -5 file.txt

tail 指令

tail:用于查看文件末尾的内容,常用于查看日志(默认后 10 行)

复制代码
tail 文件


示例:

# 默认查看后 10 行
tail file.txt

tail -n:用于查看文件文件末尾n行的内容,常用于查看日志

复制代码
tail -n 文件

示例1:

# 查看前 5 行
head -n 5 file.txt

# 简写形式
head -5 file.txt


示例2:模拟动态⽇志查看功能

#1.向temp.txt写入字符串(从hello 0到 hello 2000)
cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt

#2.输入指令查看180行 - 200行的信息 (结合管道重定向操作)
head -200 temp.txt | tail -20

#3.输出180行 - 200行的信息
hello 180
hello 181
hello 182
...
hello 199

date 指令

date:用于显示或设置系统日期和时间

复制代码
date

示例

#1.输入指令
date

#2.显示当前日期时间(默认格式)
Thu May 28 19:36:33 CST 2026

date -u:显示 UTC 时间

复制代码
date -u

示例:

#1.输入指令
date -u

#2.输出UTC时间
Thu May 28 11:38:59 UTC 2026

1.Unix 时间戳:它是从"Unix 纪元"(即协调世界时 UTC 1970年1月1日 00:00:00)开始,到现在所经过的总秒数。

2.UTC时间:是整个人类世界的"基准时间"或"零点时间"。

3.时间分区

如果你在零时区以东,时间就比 UTC 早,用加号(+)。

如果你在零时区以西,时间就比 UTC 晚,用减号(-)。

例如:北京时间(UTC+8)

例如:纽约时间 (UTC-5)

find 指令

find: 用于在目录树中按条件搜索文件和目录。

复制代码
find [搜索路径] [条件] [动作]


示例1:按名称搜索

find . -name "*.txt"          # 精确匹配(区分大小写)
find . -iname "*.txt"         # 不区分大小写
find . -name "report*"        # 通配符
find . -name "*.log" -o -name "*.tmp"   # 多个条件(或)

#1. . 为当前目录路径
#2. -name / -iname 为条件,其中-name区分大小写,-iname不区分大小写
#3. "*.txt" 字符串,搜索后缀为.txt的文件

示例2:  按类型

find . -type f                # 只找文件
find . -type d                # 只找目录
find . -type l                # 只找符号链接


示例3:  按时间

find . -mtime -7              # 最近7天内修改过
find . -mtime +30             # 超过30天没修改
find . -newer file.txt        # 比 file.txt 新
find . -mmin -60              # 最近60分钟内修改过


示例4:按大小
find . -size +100M            # 大于100MB
find . -size -1K              # 小于1KB
find . -size +1G -size -10G   # 大于1G且小于10G


示例5:按权限/用户
find . -perm 644              # 权限为644
find . -user root             # 属于root用户
find . -nouser                # 没有有效属主的文件

#温馨提示:未指定路径,按当前文件所处的目录进行搜索。

which 指令

which :用于查找命令的可执行文件路径。

复制代码
which 命令


示例:

which python
# → /usr/bin/python

which ls
# → /usr/bin/ls

whereis 指令

whereis :用于查找命令的二进制文件、源码文件、man手册位置。

复制代码
whereis 命令


示例:

whereis python
# → python: /usr/bin/python3 /usr/lib/python3.11 /usr/share/man/man1/python.1.gz

whereis ls
# → ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

alias 指令

alias: 用于查看命令 或 给命令创建别名(快捷方式)。

复制代码
alias 命令


#示例1:查看所有已定义的别名
alias

#示例2:查看指定别名
alias ll
# → alias ll='ls -alF'
复制代码
alias 命令 = '别名'


示例:定义别名

alias ll='ls -alF'
alias gs='git status'
alias ..='cd ..'
alias cls='clear'
alias rm='rm -i'        # 删除前确认
alias cp='cp -i'        # 覆盖前确认
alias mv='mv -i'        # 覆盖前确认

unlias 指令

unlias: 用于删除已定义的别名。

复制代码
unlias


#示例1:删除单个别名
unalias ll
unalias gs

#示例2:删除所有别名
unalias -a

#示例3:指令定义与指令删除

# 先定义
alias gs='git status'

# 使用
gs        # → 执行 git status

# 删除
unalias gs

# 再用就报错
gs        # → command not found

grep 指令

grep:在文件中搜索字符串,将找到的行打印出来(Global Regular Expression Print)。

复制代码
grep  "关键词" 文件

示例1:

假设 file1.txt 中包含内容:hello Linux

#1.输入指令
grep "hello" file1.txt

#2.输出结果
hello Linux 


示例2:

假设 file1.txt 中包含内容:hello Linux
假设 file2.txt 中包含内容:hello file
假设 file3.txt 中包含内容:hello world

#1.输入指令
grep "hello" *.txt

#2.输出结果
file1.txt:hello Linux 
file2.txt:hello file
file3.txt:hello world

grep -i:忽略大小写匹配,字母大写、小写视为完全一致。

复制代码
grep -i


示例:

假设 file1.txt 中包含内容:Hello Linux
假设 file2.txt 中包含内容:hello File
假设 file3.txt 中包含内容:Hello World

#1.输入指令
grep -i "hello" *.txt

#2.输出结果
file1.txt:Hello Linux
file2.txt:hello File
file3.txt:Hello World

grep -n : 显示行号

复制代码
grep -n


示例:

假设 file1.txt 中包含一下内容:
Hello Linux1
hello Linux2
Hello Linux3

#1.输入指令
grep -n "hello" file1.txt

#输出结果
2:hello Linux2

grep -v: 反选(显示不含关键词的行)

复制代码
grep -v


示例:

假设 file1.txt 中包含一下内容:
Hello Linux1
Hello Linux2
Hello C++
Hello World

#1.输入指令
grep -v "Linux" file1.txt 

#2.输出结果
Hello C++
Hello World

zip 指令

zip:用于压缩文件为 .zip 格式

复制代码
zip  压缩包名.zip 要压缩的文件/目录


示例1:打包单个文件

#1.压缩包名为:file1.zip
zip file1.zip file1.txt

#2.输出
adding: file1.txt (deflated 35%)


示例2:打包多个文件

#1.压缩包名为:file.zip   要压缩的文件名为:file1.txt file2.txt file3.txt
zip file.zip file1.txt file2.txt file3.txt

#2.输出
adding: file1.txt (deflated 35%)
adding: file2.txt (stored 0%)
adding: file3.txt (stored 0%)


示例3:只打包一个空目录,内容丢失

#1.压缩包名为:project.zip  空目录project/
zip project.zip project/

#2.输出
adding: project/ (stored 0%)

zip -r:压缩目录时包含所有子目录和文件(recursive 递归 )

复制代码
zip -r 压缩包名.zip 目录/

#注:压缩目录必须加 -r,否则只打包一个空壳。

示例1:

project
|-- file1.txt
|-- file2.txt
`-- file3.txt

# 加 -r:完整打包目录及所有内容
zip -r project.zip project/


示例2:

# 压缩当前目录中的所有内容
zip -r archive.zip .

unzip 指令

unzip:用于解压 .zip 压缩包

复制代码
unzip 压缩包名.zip


示例:

#假设有压缩包archive.zip 
unzip archive.zip                    # 将archive.zip的内容 解压到当前目录

unzip -d:用于解压 .zip 压缩包到指定路径位置

复制代码
unzip 压缩包名.zip -d 指定路径目标目录


示例1:

# 解压到当前目录下的 output 文件夹
unzip archive.zip -d output/


示例2:

# 解压到绝对路径
unzip archive.zip -d /home/user/documents/

示例3:

# 解压到上一级目录
unzip archive.zip -d ../

sz 指令

sz: 用于从远程服务器下载文件到本地电脑

复制代码
sz 文件


示例1:

sz filename.txt #执行后文件自动下载到本地电脑的默认下载目录


示例2:

sz file1.txt file2.txt file3.txt #下载多个文件到本地电脑

rz 指令

rz:用于从本地电脑上传文件到远程服务器。

复制代码
rz


示例:

#1.输入指令rz
rz

#2.执行任务
执行后弹出文件选择窗口 → 选择文件 → 自动上传到服务器当前目录。

tar 指令

tar:用于打包和压缩文件/目录,是 Linux 下最常用的归档工具(tape archive)。

复制代码
tar [选项] 归档包名 要打包的文件/目录


示例1:压缩

tar czf archive.tar.gz /home/project    

#命令:tar  选项:czf     压缩包名:archive.tar.gz     打包的目录:/home/project

#大白话: 把/home/project 打包成 archive.tar.gz 这个文件。

#解释1:选项czf
#1. c → create     创建一个新归档包
#2. z → gzip       用 gzip 算法压缩
#3. f → file       指定输出文件名(后面必须紧跟文件名)

#解释2:archive.tar.gz 
#1. archive为自定义名字
#2. tar为归档模式
#3. gz为压缩算法


示例2:解压

tar xzf archive.tar.gz

#命令:tar  选项:xzf     压缩包名:archive.tar.gz     

#大白话:用 gzip 解压 archive.tar.gz,提取所有文件到当前目录

#解释:选项czf
#1. x → extract     从归档包中提取文件
#2. z → gzip        用 gzip 算法解压
#3. f → file        指定输出文件名(后面必须紧跟文件名)
选项 含义 记忆
-c create 创建 create
-x extract 解压 extract
-z zip 用 gzip 压缩/解压 (后缀为.tar.gz ) gzip
-j zip 用 bzip2 压缩/解压(后缀为.tar.bz2) bzip2
-f file 指定文件名 file
-v verbose 显示过程 verbose
-t test 列出内容 list
-C 解压到指定目录 directory

bc 指令

bc:用于浮点数计算

uname 指令

uname:用来获取系统和内核信息 (Unix Name)

uname # 输出内核名称

uname -a # 输出所有信息(最常用)

二、Linux 常用热键

2.1 终端控制

热键 功能
Ctrl + C 强制终止当前进程
Ctrl + Z 将当前进程挂起到后台(可用 fg 恢复)
Ctrl + D 发送 EOF,退出当前 shell / 关闭输入
Ctrl + L 清屏(等同 clear)
Ctrl + S 暂停终端输出
Ctrl + Q 恢复终端输出

2.2 命令行编辑

热键 功能
Ctrl + U 删除光标前所有字符
Ctrl + K 删除光标后所有字符
Ctrl + W 删除光标前一个单词
Ctrl + Y 粘贴 Ctrl+U/K/W 删除的内容
Ctrl + R 反向搜索命令历史

2.3 进程管理

热键 功能
Ctrl + C 终止前台进程
Ctrl + Z 接着输入 bg 挂起并放到后台运行
Ctrl + Z 接着输入 fg 挂起后恢复前台运行
Ctrl + \ 发送 SIGQUIT,生成 core dump

2.4 常用系统操作

热键 功能
Tab 命令/路径自动补全
Tab Tab 列出所有可补全项
↑ / ↓ 浏览命令历史
!! 重复执行上一条命令
!$ 引用上条命令的最后一个参数
history 查看命令历史

三、Linux 权限

3.1 权限的简介

3.1.1 基本权限模型

Linux 中每个文件和目录都有三组权限,分别对应三类用户:

用户类别 含义
Owner (u) 文件所有者
Group (g) 文件所属组
Others (o) 其他用户(非文件所有者,且非文件所属组)

每组权限包含三种操作:

权限 对文件的含义 对目录的含义
r (read) 可读取文件内容 可列出目录内容 (ls、cat)
w (write) 可修改文件内容 可在目录中创建/删除文件(mkdir、touch)
x (execute) 可作为程序执行 可进入目录 (cd)

文件类型包含如下:

① - (普通文件 Regular File)

不管是 C++/Java 源代码、编译出来的可执行程序、还是压缩包、图片、纯文本,在 Linux 眼里都是普通文件。

②d (目录 Directory)

目录即文件夹,在 Linux 的底层逻辑中,目录本质上也是一种文件。

③l (软链接 Symbolic Link)

类似于 Windows 下的快捷方式。

④b (块设备 Block Device)

代表提供缓冲访问的存储介质,数据是以"数据块"(通常是 512 字节或 4KB)为单位进行读写的。

典型例子:硬盘、U 盘

⑤c (字符设备 Character Device)

代表提供无缓冲直接访问的外设,数据是按照"字符"(字节)顺序,一个接一个地进行传输的。

典型例子:键盘、鼠标、屏幕终端

⑥p (管道文件 Named Pipe / FIFO)

主要用于本地程序之间的数据传递。

可以认为是一根水管:一个进程往管道的一端写数据,另一个进程从管道的另一端读数据,数据遵循"先进先出"(FIFO)的原则。

⑦s (套接字文件 Socket)

这是一种非常强大的通信机制,通常用于网络通信或本地高速进程间通信。

3.1.2 查看权限

复制代码
#1.输入指令
ls -l example.txt
	
#2.输出结果:
-rw-r--r-- 1 alice developers 1024  5月 12 18:21 example.txt

#3.解释第一列输出的10 个字符 (-rw-r--r--)

A.第一个字符 - : 代表文件类型

B.后面9个字符每3个字符分为一组

  第一组:rw-  #代表文件所有者的权限
  第二组:r-x  #代表文件所属组的权限
  第三组:r--  #代表其他用户的权限
  
#注:
#文件/目录 可读用r表示 ,不可读用-表示
#文件/目录 可读用w表示 ,不可写用-表示
#文件/目录 可读用x表示 ,不可执行用-表示

#4. 解释 alice developers

A.拥有者: alice 代表文件的所有者(文件的创建者)
B.所属组: developers 代表文件的所属组(类似于管理文件的组长)

3.1.3 权限数字表示法

A. 数字表示法原理

r / - 中 r 可以被认为是二进制中的 1,- 可以被认为是二进制中的 0,所以权限可以用数字来表示

每组权限用三个字符来表示,所以可以用3个二进制数字来表示。

例如:rwx 可以被认为是 111

因为 r = 4, w = 2, x = 1 ,所以rwx可以被认为是4+2+1 = 7 。

B.权限缺省

默认文件权限数字表示为:666

复制代码
[hamber@VM-0-14-centos lesson4]$ touch test.txt
[hamber@VM-0-14-centos lesson4]$ ls -l
total 0
-rw-rw-r-- 1 hamber hamber 0 Jun  1 17:10 test.txt

默认目录权限数字表示为:775

复制代码
[hamber@VM-0-14-centos lesson4]$ mkdir mydir
[hamber@VM-0-14-centos lesson4]$ ls -l
total 4
drwxrwxr-x 2 hamber hamber 4096 Jun  1 17:12 mydir

为什么默认文件权限 和 默认目录权限是这样?

① 对普通文件而言:起始权限为 666(rw-rw-rw-),默认不带可执行

② 对目录文件而言:起始权限为 777 (rwxrwxrwx) , 默认携带x

③ 系统默认会出现权限掩码umask,最终权限 = 起始权限 & (~ umask)

C.权限掩码

权限掩码的查询:

复制代码
[hamber@VM-0-14-centos lesson4]$ umask
0002

验证公式: 最终权限 = 起始权限 & (~ umask)

复制代码
验证普通文件的默认权限:rw-rw-rw-

  110110110
& 111111101  -> ~(000 000 010)
-------------------
  110110110 -> 666(rw-rw-rw-)



验证目录文件的默认权限:rwxrwxr-x

  111111111
& 111111101  -> ~(000 000 010)
-------------------
  111111101 -> 775(rwxrwxr-x)


#注:计算时,需忽视umask掩码0002 的第一项0

问题一:umask的目的是什么?

根据公式:最终权限 = 起始权限 & (~ umask) ,告诉系统创建文件/目录时,哪些权限要被"屏蔽掉"。

问题二:为什么不直接硬编码"文件默认 644,目录默认 755"?

原因是不同场景需要不同的默认策略,umask 让这个策略可配置,而不是一刀切。

3.2 文件访问权限的更改

3.2.1 chmod指令

chmod:设置文件的访问权限

复制代码
chmod [who][op][perm] file


who  取值:  u / g / o / a  (所有者 / 组 / 其他人 / 全部)

op   取值: + / - / =  (添加 / 移除 / 设置为 )

perm 取值: r / w / x (读 / 写 / 执行)
复制代码
#实操演示1:

#操作前:
[hamber@VM-0-14-centos lesson4]$ ll
-r--rw-r-- 1 hamber hamber    0 Jun  1 17:10 test.txt

#输入指令:让u(文件所有者)添加w(写)权限
[hamber@VM-0-14-centos lesson4]$ chmod u+w test.txt 

#操作后:
[hamber@VM-0-14-centos lesson4]$ ll
-rw-rw-r-- 1 hamber hamber    0 Jun  1 17:10 test.txt
复制代码
#实操演示2:

#操作前:
[hamber@VM-0-14-centos lesson4]$ ll
-rw-rw-r-- 1 hamber hamber    0 Jun  1 17:10 test.txt

#输入指令:让g(文件所属组)去掉w(写)权限
[hamber@VM-0-14-centos lesson4]$ chmod g-w test.txt 

#操作后:
[hamber@VM-0-14-centos lesson4]$ ll
-rw-r--r-- 1 hamber hamber    0 Jun  1 17:10 test.txt
复制代码
#实操演示3:

#操作前:
[hamber@VM-0-14-centos lesson4]$ ll
-rw-rw-r-- 1 hamber hamber    0 Jun  1 18:48 test.txt

#输入指令:让u赋予空权限
[hamber@VM-0-14-centos lesson4]$ chmod u= test.txt 

#操作后:
[hamber@VM-0-14-centos lesson4]$ ll
----rw-r-- 1 hamber hamber    0 Jun  1 18:48 test.txt

#注:u= 默认让权限为空
复制代码
#实操演示4:

#操作前
[hamber@VM-0-14-centos lesson4]$ ll
----rw-r-- 1 hamber hamber    0 Jun  1 18:48 test.txt

#输入指令:让u赋予rw权限
[hamber@VM-0-14-centos lesson4]$ chmod u=rw test.txt 

#操作后:
[hamber@VM-0-14-centos lesson4]$ ll
-rw-rw-r-- 1 hamber hamber    0 Jun  1 18:48 test.txt

3.2.2 chown指令

chown:修改所有者

复制代码
chown [选项] [所有者][:组] 文件


注意事项

1. 只有 root 能改所有者:普通用户不能把文件的所有者改成别人
2. 普通用户能改组:前提是你是文件所有者,且目标组是你所属的组


[常见用法]:

# 只改所有者
chown alice file.txt

# 只改组(冒号前留空)
chown :developers file.txt

# 同时改所有者和组
chown alice:developers file.txt

# 递归修改目录及内容
chown -R alice:developers /project
复制代码
实例演示:

# 查看当前文件信息
ls -l file.txt
-rw-r--r-- 1 root root 1024 Jun 1 file.txt

# 改所有者为 alice
chown alice file.txt
-rw-r--r-- 1 alice root 1024 Jun 1 file.txt

# 改组为 developers
chown :developers file.txt
-rw-r--r-- 1 alice developers 1024 Jun 1 file.txt

3.2.3 chgrp指令

chgrp:修改文件所属组

复制代码
chgrp [选项] 组 文件


常见用法

# 修改文件所属组
chgrp developers file.txt

# 递归修改目录
chgrp -R developers /project

# 显示修改过程
chgrp -v developers file.txt

# 只在有更改时显示
chgrp -c developers file.txt

3.3 用户的切换

3.3.1 su指令

su:切换用户

复制代码
su — 用户名


# 切换到 root(需要 root 密码)
su

# 切换到 root 并加载其环境变量
su -

# 切换到指定用户
su alice

# 切换到指定用户并加载环境变量
su - alice

3.3.2 sudo指令

sudo:以 root 身份执行命令

复制代码
sudo 指令

常见用法

# 以 root 身份执行命令
sudo apt update

# 以 root 身份编辑文件
sudo vim /etc/hosts

# 查看当前 sudo 权限
sudo -l
复制代码
实例演示

# 安装软件
sudo apt install vim

# 重启服务
sudo systemctl restart nginx

# 修改系统配置
sudo vim /etc/fstab

# 查看受保护的日志
sudo tail -f /var/log/auth.log

# 以其他用户身份执行
sudo -u postgres psql

sudoers 配置

复制代码
# 安全编辑 sudoers 文件
sudo visudo

配置格式

# 语法
用户 主机=(身份) 命令选项


1.用户 :指定谁可以使用 sudo。

#单个用户
Alice ALL=(ALL) ALL

# 用户组(加 %)
%developers ALL=(ALL) ALL

#所有用户
ALL ALL=(ALL) ALL


2.主机:指定在哪些机器上生效。

# 本机生效
alice localhost=(ALL) ALL

# 指定主机名
alice webserver=(ALL) ALL

# 所有主机(最常用)
alice ALL=(ALL) ALL


3.身份:指定以谁的身份执行命令。

# 以 root 身份执行(最常见)
alice ALL=(root) ALL

# 以任意用户身份执行
alice ALL=(ALL) ALL

# 以指定用户身份执行
alice ALL=(postgres) ALL

# 以指定用户和组身份执行
alice ALL=(postgres:postgres) ALL


4.命令选项:指定能执行哪些命令。

# 所有命令
alice ALL=(ALL) ALL

# 只能执行 systemctl
alice ALL=(ALL) /usr/bin/systemctl

# 多个命令用逗号分隔
alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl

# 只能执行特定子命令
alice ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

# 命令别名
Cmnd_Alias SERVICES = /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php
alice ALL=(ALL) SERVICES

# 禁止执行某个命令(前面加 !)
alice ALL=(ALL) ALL, !/usr/bin/passwd root
复制代码
常见配置示例

# 用户 alice 可以执行所有命令
alice ALL=(ALL) ALL

# 用户 bob 只能执行 systemctl
bob ALL=(ALL) /usr/bin/systemctl

# 用户 carol 执行所有命令不需要密码
carol ALL=(ALL) NOPASSWD: ALL

# 开发组可以重启应用服务,免密
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app

# 允许用户在指定主机上执行
alice webserver=(ALL) /usr/bin/systemctl restart nginx

字段解释

alice   ALL=(ALL:ALL)   ALL
│       │   │           │
│       │   │           └── 允许执行的命令
│       │   └── 以什么用户:组身份执行
│       └── 在哪些主机上生效
└── 目标用户

sudo 密码缓存机制

复制代码
# 第一次执行需要输密码
sudo whoami
[sudo] password for alice: ****
root

# 15分钟内再次执行不需要密码
sudo whoami
root(无需输入密码)

# 手动清除缓存
sudo -k

# 下次执行又要输密码
sudo whoami
[sudo] password for alice: ****

3.4 目录权限的理解

rwx 对目录权限的含义

① r :可以列出目录内容 (若失去r权限,无法 ls)

② w :可以在目录中创建、删除、重命名文件 (若失去w权限,无法 touch、rm、mv)

③ x : 可以进入目录、访问目录下文件的元信息 (若失去x权限,无法 cd、无法查看文件属性)

由此可知,对于一个文件是否能够删除,不取决于文件的权限,反而取决于文件所处目录的权限。

3.5 多用户隔离的理解

核心思想: Linux 从设计之初就是多用户系统。一台机器可以同时被多人使用,但每个人只能看到和操作自己的东西。

文件系统隔离

复制代码
家目录隔离

# 每个用户有自己的家目录

/home/alice  → 只有 alice 能访问

/home/bob   → 只有 bob 能访问

/root     → 只有 root 能访问


核心原因:权限实现隔离

# 查看家目录权限

ls -ld /home/alice /home/bob

# drwx------ alice alice /home/alice    ← 只有自己能访问

# drwx------ bob   bob   /home/bob

3.6 Linux 权限匹配原则

核心原则: 当用户访问文件时,Linux 按固定顺序检查权限,只使用第一个匹配的规则。

匹配顺序:访问请求 → 是 root?→ 是所有者?→ 在组里?→ 其他人?→ 允许/拒绝

注:若用户既是文件的所有者,又是文件的所属组

Linux系统也只会匹配一次权限,给予用户文件所有者的权限,不会向下继续匹配。

特殊用户:root 用户不受权限约束

root拥有绝对的特权,无论文件权限怎么设置(哪怕是 ----------),root 都可以随意读写。

复制代码
实战演示:

# 文件信息
ls -l file.txt
# -rw-r----- 1 alice developers 4096 Jun 1 file.txt

#按照匹配顺序进行匹配
当 bob 访问这个文件时,Linux 依次检查:

1. bob 是 root 吗?          → 不是,跳过
2. bob 是文件所有者吗?       → 不是(alice 才是),跳过
3. bob 在 developers 组里吗? → 如果在,使用组权限 (r--),匹配结束
4. 以上都不是                → 使用其他人权限 (---)

关键:一旦匹配到某个分类,就不再往下检查。

3.7 粘滞位

粘滞位:是一种特殊权限位,用于目录,使目录中的文件只有文件所有者、目录所有者或 root 才能删除。

粘滞位权限的标志位:t

复制代码
drwxrwxrwt.   4 root root  4096 Jun  1 20:07 tmp

粘滞位设计的背景:

若需要进行团队合作进行共享目录,不能将目录放于任何一个人的私人账号下,需要使用根目录下的文件进行共享。

对于共享目录而言,任何用户都有rwx的权限,所有人均可删除共享文件,但如果设置为rw-,则用户不能够创建文件

这就导致了"目录可写"和"文件不可删"之间的矛盾。为了只能够让目录中文件的所有者删除,从而设计了粘滞位。

复制代码
场景1:临时文件目录

# /tmp 需要:
#  所有程序都能写入临时文件
#  不能删别人的临时文件
#  程序崩溃时文件还在,方便调试

drwxrwxrwt /tmp
复制代码
场景2:团队共享目录

# 团队共享上传目录
# - 每个人都能上传文件
# - 不能删别人的成果
drwxrwxrwt /shared/uploads

四、Linux相关知识点

4.1 Linux文件

复制代码
文件本质:

文件 = 内容 + 属性

内容包括:文本内容
属性包括:文件名称,文件的大小,文件的类型,文件的权限,文件修改的时间...

学习文件:

1.对文件内容操作

2.对文件属性操作
复制代码
Linux系统中,一切皆文件

普通文件    → 文件
硬盘       → /dev/sda      → 文件
键盘       → /dev/tty      → 文件(读)
显示器     → /dev/tty      → 文件(写)
进程信息   → /proc/pid/*   → 文件
网络       → socket        → 文件描述符

4.2 Linux下的路径信息

复制代码
#知识点1

在windows操作系统中:\表示路径分隔符

在Linux操作系统中:/表示路径分隔符

举例说明:

对于Linux的路径:/home/user/Documents/project

例如:/home/被操作符/ /所包裹的一定表示目录(文件夹) ,而最后一个project 则不能确定其为目录(文件夹)还是为文件
	
#解释:

/ (第一个斜杠): 代表 Linux 系统的根目录 

home/: 这是根目录下的一个标准文件夹。
	
user/: 这是 home 目录下的一个子文件夹,代表一个具体的用户主目录。	
	
Documents/: 这是 user 目录下的一个常见默认文件夹

project: 这是路径的终点。
复制代码
#知识点2

在Linux中的路径,对于只有单个/,表示Linux的根目录 
复制代码
#知识点3

ls + 路径:能够查看指定目录下的文件和文件夹的名称

例如,如下命令所示:ls /home/user/Documents/project
复制代码
#知识点4

A.绝对路径:绝对路径是指从文件系统的根目录(/)开始,完整描述到达目标文件或目录所需要经过的所有层级的路径。

1.核心特征: 永远以正斜杠 /(代表根目录)开头。

2.生活类比:中国 -> 北京市 -> 朝阳区 -> 某某路 -> 某某号

3.使用场景:在配置文件中使用


B.相对路径:相对路径是指从你当前所在的工作目录出发,到达目标文件或目录的路径。

1.核心特征: 不以斜杠 / 开头。它的起点是你当前的位置。

2.生活类比:基于当前位置指路:"出门左转,第二个路口右转"。

3.使用场景:在日常中使用
复制代码
#知识点5

对于任何一个Linux用户,用特定的用户名登录系统,默认在 "家目录" 下

家目录(主目录)的符号:~

4.3 Linux的文件结构

复制代码
Linux 的文件结构是一棵从根目录开始的多叉树

a. 叶子结点:一定是 "普通文件" 或 "空目录"

b. 非叶子结点: 一定是"非空目录"

Linux文件图示

4.4 Linux命令的本质

复制代码
A. 可执行文件(外部命令)

简介:

例如:tree、ls、cat、mkdir、python 等,它们的本质与 Windows 上双击运行的 .exe 游戏或软件,或者手机上的 App 没有任何区别。

1.本质:它们是实实在在存储在硬盘上的文件(通常是编译好的二进制程序,或者是带执行权限的脚本)。

2.存储位置:它们通常集中存放在系统的特定目录中,比如 /bin、/usr/bin、/sbin 等。

3.安装:实际上就是从网盘(软件源)下载这个文件并放进系统的可执行目录。
复制代码
B. Shell 的内置功能(内置命令)

简介:

它们没有对应的实体文件存放在硬盘上,它们是 Shell 或 bash 自身随身携带的技能。

1.代表命令:cd(切换目录)、pwd(显示当前路径)、echo(打印输出)。

2.内置原因:以 cd 为例,如果它是一个外部程序,当它运行完毕后,改变的只是它那个子程序的运行目录,而你当前的 Shell 终端目录并不会变。所以,像改变终端自身状态的操作,必须由终端程序自己(内置)来完成。

3.生活类比:

外部命令就像是"锤子"、"剪刀"(你需要去工具箱里拿出来用);

内置命令就像是你自己的"手"、"脚"(长在你身上,大脑直接调用)。
复制代码
C. 别名(Alias) 

简介:

这纯粹是你或者系统设置的"快捷方式"或"小名"。

1.代表命令:在很多系统中,你敲入 ll,会显示详细的文件列表,但系统里其实并没有一个叫 ll 的程序。
	
2.本质: 它只是 ls -alF(或类似参数)的别名,在敲 ll 时,Shell 在执行前会自动把它替换成那一长串真实的命令。
相关推荐
司南-70491 小时前
AI infra 学习笔记(三):预处理·第一步——QKV 投影到底算了多少
人工智能·笔记·学习
honsor1 小时前
PoE温湿度传感器:一根网线供电+通信,即插即用,机房/配电室/仓库温湿度监测首选
运维·服务器·网络·数据库·人工智能·安全
sevenez1 小时前
AiMaMi 介绍及与 CC Switch 对比
笔记
码上有光1 小时前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信
w01_02_031 小时前
cpu , 控制 ,计算。
linux
喜欢打篮球的普通人1 小时前
MiniMind 学习笔记(十):优化器、学习率和数据设置——训练稳定性的三块基石
笔记·python·学习
醇氧1 小时前
uvicorn 详细介绍
linux·运维·python·python3.11
Qwier2 小时前
Win Srv 2019 安装补丁后重启
运维·服务器·windows
海宇服务2 小时前
零信任架构实战:基于海宇车辆出险记录核验构建自动化车险流转网关
运维·人工智能·架构·自动化