Linux 文件权限
1
2
# 列出文件信息
ls-l

1
2
# 修改文件权限
chmod [选项] 用户属性+权限属性 文件名

用户
1
2
3
4
5
6
7
8
9
10
# 查看当前登录用户
whoami
# 查看所有登录用户
who
# 简洁显示登录用户
users
# 详细查看用户活动
w
# 查看当前终端设备
tty
系统信息
1
2
3
4
5
6
7
8
# 显示基本系统信息
uname
# 显示主机名
uname -n
# 显示硬件平台(平台架构)
uname -i
# 显示全部系统信息
uname -a
时间/日历
1
2
3
4
# 显示当前完整时间
date
# 自定义时间显示格式
date "+%Y-%m-%d %H:%M:%S"
1
2
3
4
5
6
# ubuntu 安装 bsdmainutils(包含cal)
sudo apt install bsdmainutils
# 显示当前月份日历
cal
# 查看指定年月日历(如2024年12月)
cal 12 2024
切换用户
1
2
3
4
5
6
7
8
# 启用root用户,设置root密码
sudo passwd root
# 切换至root用户(不切换目录)
su root
# 切换至root用户(同时切换到root根目录)
su - root
# 切换回普通用户(同时切换到普通用户根目录)
su - user # user 替换为实际的普通用户名
whatis - 从系统的man手册数据库中提取命令/函数的一句话简介
1
2
3
4
# 查看 ls 命令的简介
whatis ls
# 查看 mkdir 命令和 passwd 配置文件的简介
whatis mkdir passwd
help - 查询 Bash Shell 内置命令的帮助
1
2
# 查看 cd 命令的帮助
help cd
man - 系统的命令/工具 手册页
  • 翻页:PageUp/PageDownCtrl+F(下翻)/Ctrl+B(上翻)
  • 退出:按 q
  • 搜索:/关键词(向下搜)、?关键词(向上搜),按 n 继续下一个结果
1
2
3
4
# 查看 man 手册页自身的使用帮助
man man
# 查看 ls 命令的完整手册(默认打开第1章)
man ls
info - 命令的结构化 文档
  • 进入子节点:按 Enter(点击带有 *[...] 的节点名称)
  • 返回上一级节点:按 u
  • 查看目录(所有节点):按 d
  • 搜索关键词:按 s 输入关键词
  • 退出:按 q
1
2
3
4
5
6
# 查看 info 文档
info
# 查看 info 工具自身的使用帮助
info info
# 查看 ls 命令的 info 文档
info ls
echo - 显示一行文本
1
2
# 显示内容:The shirt costs $23.50.
echo 'The shirt costs $23.50.'
1
2
3
4
5
6
# 使用 echo 显示环境变量
echo $USER
# 显示用户家目录
echo $HOME
# 显示系统命令搜索路径
echo $PATH
printf - 格式化并打印数据
1
2
3
4
# 格式化并打印数据
printf 'Hello, World!'
# 句末添加换行符'\n',打印后自动换行
printf 'Hello, World!\n'

touch - 新建文件
1
2
3
4
5
6
# 创建一个新文件
touch 1.txt
# 同时创建多个文件
touch 1.txt 2.md 3.py
# 指定时间戳
touch -t 202509230830 1.txt
file - 查看文件类型
1
2
3
4
5
6
7
8
# 查看单个文件类型
file 1.txt
# 查看多个文件类型
file 1.txt 2.md 3.py
# 查看可执行文件类型
file /bin/ls
# 检查压缩包
file archive.tar.gz
gedit - 图形化文本编辑器
  • 使用 Ctrl+S 保存
1
2
3
4
5
# 下载安装 gedit
sudo apt install gedit
# 使用 gedit 打开文件
# -&:在后台启动 gedit,可以继续在终端输入其他命令
gedit 1.txt &
vim - 终端式文本编辑器
  1. 打开后,默认在 命令模式,先按 i 进入 插入模式 以输入。

  2. 输入完后,按 Esc 返回命令模式。

  3. 输入 :wq 保存并退出。

1
2
3
4
# 下载安装 vim
sudo apt install vim
# 使用 vim 编辑文件
vim 1.py
cat - 合并/合并显示文件内容
1
2
3
4
# 依次把两个文件的内容合并输出到终端
cat 1.txt 2.txt
# 将两个文件合并保存到一个新文件
cat 1.txt 2.txt > all.txt
Ubuntu 系统软件源 位置
1
2
3
4
# Ubuntu 22.04 版本前
/etc/apt/sources.list
# Ubuntu 22.04 版本及以后
/etc/apt/sources.list.d/ubuntu.sources
more - 一页一页显示大文件
  • 空格键 翻页,q 退出
1
2
# 使用 more 在命令行中一页一页地显示大文件
more 1.txt
less - 更强大的分页显示
  • 上下方向键 翻页,支持搜索(输入 /关键词),用 q 退出
1
2
# 使用 less 单独地显示大文件
less 1.txt
head - 显示文件开头几行
1
2
# 显示 1.txt 的前X行
head -n X 1.txt
tail - 显示文件结尾几行
1
2
# 显示 1.txt 的后X行
tail -n X 1.txt
grep - 在文件中搜索关键词
1
2
3
4
# 显示 1.txt 中带有"xx"的内容行("xx"标红)
grep "xx" 1.txt
# 附带行号
grep -n "xx" 1.txt
find - 查找文件
1
2
3
4
5
6
7
# (如果没有的话)先创建几个以main开头的文件
touch main1.txt main2.py main_test.txt
echo "This is main1" > main1.txt
echo "print('hello from main2')" > main2.py
echo "main file test" > main_test.txt
# 查找当前目录下所有以 main 开头的文件,并显示文件内容
find . -type f -name "main*"
diff - 比较文件
1
2
# 比较两个文件
diff 1.txt 2.txt

例:

  • 1c1:表明 1.txt 的第1行 和 2.txt 的第1行不同。
  • < 表示左边文件(1.txt)的内容
  • > 表示右边文件(2.txt)的内容
cat - 显示文件内容
1
2
# 显示 1.txt 内容
cat 1.txt
sort - 显示排序后的文件内容
1
2
# 对文件的行内容进行 字典序排序 显示
sort 1.txt
wc - 统计文件信息
1
2
3
4
5
6
7
8
# 统计行数
wc -l 1.txt
# 统计单词数
wc -w 1.txt
# 统计字节数
wc -c 1.txt
# 统计文件的 行数、单词数、字节数
wc 1.txt

cp - 复制
1
2
# 根据 1.txt 复制出 1_copy.txt 
cp 1.txt 1_copy.txt
mkdir - 创建文件夹
1
2
# 创建文件夹 example
mkdir example
mv - 移动
1
2
# 移动 a文件夹、b.txt 至 c文件夹
mv a b.txt c
ls - 列出当前目录相关内容
1
2
3
4
# 列出当前目录及其所有子目录中的文件和目录
ls -R
# 以长格式(详细信息)列出文件(权限、所有者、大小、修改时间等)
ls -l
rmdir - 删除文件夹
1
2
# 删除文件夹 example
rmdir example
pwd - 显示当前所在的绝对路径
1
2
# 显示当前所在的绝对路径
pwd
chmod - 修改用户对文件的权限

用户

user - 文件拥有者

group - 用户组

others - 其他人

文件权限

r - read - 可读 - 4

w - write - 可写 - 2

x - execute - 可执行 - 1

1
2
3
4
5
6
# 设置一个文件权限为:所有人可执行、拥有者和用户组可度取、拥有者可写
chmod u+rwx g+rx o+x 1.txt
# 方法二
chmod u=rwx g=rx o=x 1.txt
# 方法三(推荐)
chmod 751 1.txt
umask - 设置文件默认权限

User File Creation Mask (用户文件创建屏蔽码),它决定了当你 新建文件或目录时默认的权限

Linux 创建文件/目录的默认权限:

  • 普通文件:666(rw-rw-rw-)
  • 目录:777(rwxrwxrwx)
1
2
# 查看当前 umask
umask

例:输入 umask 输出 0022,意味着屏蔽了组和其他用户的写权限。

1
2
# 临时设置 umask 为 xxxx (关闭终端后失效)
umask xxxx

永久设置 umask

作用范围 修改文件
当前用户 ~/.bashrc~/.profile
全局生效 /etc/profile/etc/bash.bashrc

添加一行:

1
umask 0022

保存后执行:

1
source ~/.bashrc
tar - 归档

用户(组)信息管理与用户(组)的增删

1. 用户信息文件 /etc/passwd
1
2
# 查看用户信息文件 /etc/passwd
cat /etc/passwd
1
2
3
4
# 示例输出
# 用户名:x(表示密码已存储):UID:GID:用户说明:主目录:登录Shell
root:x:0:0:root:/root:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash

/etc/passwd 文件的每一行共有7个字段,以冒号:为分隔,含义如下:

字段位置 字段名称 示例值 含义
1 用户名 user1 登录系统时使用的用户名
2 密码占位符 x 表示密码已加密存储在 /etc/shadow 文件中
3 UID 1001 用户 ID(0 为 root,普通用户从 1000 起)
4 GID 1001 用户所属主群组的 ID
5 用户说明 (空) 可存放用户描述或备注
6 主目录 /home/user1 用户登录后的默认目录
7 登录 Shell /bin/bash 用户登录后使用的命令解释器
2. 用户密码信息文件 /etc/shadow
1
2
# 查看密码信息文件 /etc/shadow
sudo cat /etc/shadow
1
2
3
# 示例输出
root:$6$8cFp9b...$FHYyADw...:19931:0:99999:7:::
user1:$6$ABc123...$xyZpQe...:19931:0:99999:7:::

/etc/shadow 文件的每一行包含9个字段,以冒号:为分隔,含义如下:

字段位置 含义 示例值 说明
1 用户名 user1 /etc/passwd 对应
2 加密密码 $6$ABc123… $6$ 表示使用 SHA-512 加密算法
3 上次修改密码的日期 19931 从1970-01-01起的天数
4 最短改密间隔 0 多少天后才能修改密码
5 最长改密间隔 99999 密码最长有效天数
6 提前警告天数 7 密码过期前几天开始警告
7 账号不活动天数 (空) 过期后多少天禁用账号
8 账号失效日期 (空) 从1970起的天数,表示账号失效时间
9 保留 (空) 暂未使用
用户 - 增删改查
增加用户 - useradd/adduser
1
2
3
# 使用 useradd 增加用户,自动创建主目录,自动输入新密码 
sudo useradd -m usera
sudo passwd usera
1
2
# 使用 adduser 创建用户,自动创建主目录、设置权限、交互式输入密码和用户信息
sudo adduser usera
删除用户 - userdel/deluser
1
2
3
4
# -r:使用userdel删除用户userc,连同/home/userc一并删除
sudo userdel -r userc
# 使用deluser将userc及其主目录一并删除
sudo deluser userb --remove-home
修改用户信息 - usermod
1
2
3
4
5
6
# 修改用户名 usera 为 userc
sudo usermod -l userc usera
# 修改 userb 主群组为 sudo
sudo usermod -g sudo userb
# 把 userb 加入附加群组 adm
sudo usermod -aG adm userb
id - 显示用户的 ID、GID以及所属的用户组信息
1
2
3
4
5
6
7
# 显示 userb 的 ID、GID以及所属的用户组信息
id userb
# 可能的输出示例
uid=1002(userb) gid=27(sudo) groups=27(sudo),4(adm)
# uid=1002(userb) -> 用户ID是1002,用户名是userb
# gid=27(sudo) → 主组ID是27,组名是sudo
# groups=... → 所属的所有组(主组 + 附属组)
检验用户数据
1
2
3
4
# 1.查看用户信息文件 /etc/passwd
cat /etc/passwd
# 2.查看 /home/ 目录中生成的主目录(有多少用户)
ls /home/
3. 用户组信息文件 /etc/group
1
2
# 查看用户组信息文件
cat /etc/group

/etc/group 文件的每一行有4个字段,以冒号:分隔

字段位置 字段名称 示例值 含义
1 组名 testgroup 群组名称
2 密码占位符 x 表示加密密码存储在 /etc/gshadow 文件中
3 GID 1002 群组 ID
4 组成员 user1,user2 属于该组的用户列表(多个用户以逗号分隔)
4. 用户组密码信息文件 /etc/gshadow
1
2
# 查看用户组密码信息文件
sudo cat /etc/gshadow
1
2
3
4
# 示例输出
root:*::
sudo:*::
testgroup:!:user1,user2:

testgroup:!:user1,user2: 为例,/etc/gshadow 文件每行包含 4 个字段,含义如下:

字段位置 字段名称 示例值 含义
1 组名 testgroup 群组名称,与 /etc/group 对应
2 密码 ! 表示群组无密码(通常为空或!
3 组管理员 user1,user2 有权管理该组的用户
4 组成员 (空) 组中普通成员列表
用户组 增删改查
1
2
3
4
5
6
7
8
9
10
# 添加用户组
sudo groupadd xxx
# 删除用户组
sudo groupdel xxx
# 修改用户组名xxx为yyy
sudo groupmod -n yyy xxx
# 修改用户组ID
sudo groupmod -g 1200 xxx
# 查看检验用户组
cat /etc/group
1
2
3
4
5
6
# 为用户组添加用户
sudo usermod -aG xxx user1
# 验证
id user1
# 输出示例
uid=1001(user1) gid=1001(user1) groups=1001(user1),1200(xxx)
文件所属群组修改
1
2
3
4
5
6
7
8
9
10
# 新建
touch testfile.txt
# 查看文件初始属性
ls -l testfile.txt
# 示例输出(更改前):
-rw-r--r-- 1 user1 user1 0 Oct 11 09:00 testfile.txt
# 更改文件所属群组为xxx
sudo chgrp xxx testfile.txt
# 示例输出(更改后)
-rw-r--r-- 1 user1 xxx 0 Oct 11 09:05 testfile.txt

磁盘管理

1.添加虚拟硬盘

  • 关机状态下,在 VMware - 虚拟机管理中添加一块新的虚拟硬盘,大小10GB
  • 启动系统
1
2
sudo apt install util-linux
lsblk

新磁盘显示为 /dev/sdb

2.使用 fdisk 工具对新磁盘进行分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo fdisk /dev/sdb
n # 新建分区
p # 主分区
1 # 分区号1
回车 # 起始位置默认
+5G # 分区大小5G

n
p
2
回车
回车

w # 保存退出

3.重新读取分区表

1
2
sudo partprobe /dev/sdb
lsblk

1
2
3
# 两个分区都格式化为 ext4 文件系统
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
1
2
3
4
5
6
7
# 创建挂载点目录
sudo mkdir /web /data
# 挂载分区
sudo mount /dev/sdb1 /web
sudo mount /dev/sdb2 /data
# 查看挂载结果
mount | grep sdb
1
2
3
4
5
6
7
sudo nano /ect/fstab
# 在 /ect/fstab 末尾添加两行
UUID=af34b98d-8f38-438c-8a4c-1d4d6c917361 /web ext4 defaults 0 0
UUID=cac848c8-1a2d-4501-9739-91fd55ead002 /data ext4 defaults 0 0
# 保存并测试配置,若无错误输出,说明配置正确
sudo mount -a

无误后重启系统,验证是否挂载:

1
2
lsblk
mount | grep sdb

设置磁盘配额并测试
1
df -h

1
2
3
4
5
6
7
8
9
10
# 编辑 /etc/fstab 文件
sudo nano /etc/fstab
# 为 /data 挂载项添加 usrquota 标志
UUID=af34b98d-8f38-438c-8a4c-1d4d6c917361 /web ext4 defaults 0 0
UUID=cac848c8-1a2d-4501-9739-91fd55ead002 /data ext4 defaults,usrquota 0 0
# 重新挂载该分区
sudo mount -o remount /data
# 验证挂载参数中是否包含 usrquota
# (输出应包含/dev/sdb2 on /data type ext4 (rw,usrquota,...)
mount | grep data

建立配额数据库文件并启动配额功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 进入 /data 目录
cd /data

sudo apt insatll quota

# 创建配额数据库文件
sudo quotacheck -cum /data
#
-c:创建新的配额文件。
-u:为用户启用配额。
-m:忽略挂载点的只读标志

# 查看是否生成两个文件
ls -l /data | grep quota

# 启动配额功能
sudo quotaon /data
# 验证
sudo repquota /data

Linux 编程

1
2
# 安装 GCC 编译器
sudo apt install gcc
1
2
3
4
5
6
# 使用 gcc 编译.c文件,生成指定名称的可执行文件
# -o:指定输出文件的名称
gcc xxx.c -o xxx

# 执行存在于当前工作目录的 可执行文件xxx
./xxx
1
2
3
# 
# -c:仅编译,仅预处理、编译和汇编,生成目标文件.o/.obj,不进行链接操作(不会生成可执行文件)
gcc -c xxx.c -o xxx.o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo apt update

# 安装 SDL 基本库
sudo apt install libsdl1.2-dev

# 安装SDL图像处理库(支持BMP等图片格式加载)
sudo apt install libsdl-image1.2-dev
# 安装SDL字体处理库(支持文字显示功能)
sudo apt install libsdl-ttf2.0-dev
# 安装SDL绘图扩展库(支持圆、曲线等图形绘制,用于任务四)
sudo apt install libsdl-draw1.2-dev

# 验证SDL核心库版本
sdl-config --version
# 验证SDL图像库是否存在
dpkg -l | grep libsdl-image
1
2
3
4
5
6
# 查看并显示 SDL 目录中所需头文件
sdl-config --cflags
# 进入SDL头文件目录
cd /usr/include/SDL
# 列出目录中的核心头文件(过滤无关文件,显示主要开发用头文件)
ls -l SDL.h SDL_video.h SDL_surface.h SDL_events.h SDL_draw.h