Linux基础笔记-知识点
本文最后更新于 2025-12-27,文章内容可能已经过时。
知识点
重定向与管道
标准输入和输出
Linux系统中的三个最基本的IO设备
- 标准输入设备(stdin):对应终端键盘
- . 标准输出设备(stdout):对应终端的显示器
- 标准错误输出设备(stderr):对应终端的显示器
在Linux系统中,一切皆文件,所以,这三个设备也是以文件的形式存在于系统中;
程序从标准输入设备中获取数据,再将运行结果和错误信息输出到标准输出设备和标准错误输出设备;
在虚拟终端中,标准输入输出设备都是当前的终端窗口
这些符号链接用于 I/O 重定向。
/dev/stdin---> 标准输入流,指向/proc/self/fd/0/dev/stdout---> 标准输出流,指向/proc/self/fd/1/dev/stderr---> 标准错误流,指向/proc/self/fd/2
linss@ubuntu24-13:~$ ll /dev/std*
lrwxrwxrwx 1 root root 15 10月 17 14:51 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 10月 17 14:51 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 10月 17 14:51 /dev/stdout -> /proc/self/fd/1
文件描述符(fd)
ll /proc/self/fd/显示了当前进程的文件描述符,每个文件描述符代表一个打开的文件或流。
0 -> /dev/pts/1:文件描述符 0 代表标准输入流(stdin),它连接到终端设备/dev/pts/1。这表示当前进程从终端/dev/pts/1获取输入。1 -> /dev/pts/1:文件描述符 1 代表标准输出流(stdout),它连接到终端设备/dev/pts/1。这表示当前进程的输出会显示在终端/dev/pts/1。2 -> /dev/pts/1:文件描述符 2 代表标准错误流(stderr),它也连接到终端设备/dev/pts/1。这表示当前进程的错误信息会显示在终端/dev/pts/1。- 3 及以上------普通文件、socket、管道、设备等
linss@ubuntu24-13:~$ ll /proc/self/fd/
总计 0
dr-x------ 2 linss linss 4 10月 17 16:12 ./
dr-xr-xr-x 9 linss linss 0 10月 17 16:12 ../
lrwx------ 1 linss linss 64 10月 17 16:12 0 -> /dev/pts/1
lrwx------ 1 linss linss 64 10月 17 16:12 1 -> /dev/pts/1
lrwx------ 1 linss linss 64 10月 17 16:12 2 -> /dev/pts/1
lr-x------ 1 linss linss 64 10月 17 16:12 3 -> /proc/4962/fd/
文件描述符本身不占用Inode,但是它间接持有Inode
I/O重定向 redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
标准输出和标准错误重定向
STDOUT和STDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件
COMMAND OPERATOR FILE|DEVICE
# 覆盖操作符,如果文件存在,会被覆盖
> # 把STDOUT重定向到文件
1> # 同上
2> # 把STDERR重定向到文件
&> # 把标准输出和错误都重定向
>& # 和上面功能一样,建议使用上面方式
# 追加操作符,在原有文件的基础上追加内容
>> # 追加标准输出重定向至文件
1>> # 同上
2>> # 追加标准错误重定向至文件
范例:标准输出到其他终端
# 在终端窗口1查看
[root@ubuntu2204 ~]# tty
/dev/pts/1
# 在终端窗口3查看
[root@ubuntu2204 ~]# tty
/dev/pts/3
# 在终端开窗口1执行
[root@ubuntu2204 ~]#echo "hello" 1> /dev/pts/3
# 在终端窗口3显示
[root@ubuntu2204 ~]# hello # 这里显示的hello,是从窗口1发送过来的
合并标准输出和错误输出为同一个数据流进行重定向
&> # 覆盖重定向
&>> # 追加重定向
COMMAND > /path/to/file.out 2>&1
COMMAND >> /path/to/file.out 2>&1
# 标准输出重定向至 out.log,标准错误输出重定向至标准输出
ls fstab null > out.log 2>&1
# 与2>&1等价
ls fstab null &> out.log
补充: & 符号的作用
- 表示要操作的是文件描述符而非文件或命令。
- 例如 &1 这里指的是文件描述符1
管道 |
使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;
注意:STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现,格式如下
COMMAND1 2>&1 | COMMAND2
COMMAND1 |& COMMAND2
命令行展开
- ~ : 自动替换为用户家目录
- ~USERNAME : 自动替换为指定用户的家目录
- {} : 可包含一个以逗号分隔的字符串或序列,能够将其展开为多个字符串
a{d,c,b}e # ade, ace, abe
/tmp/{a,b,c} # /tmp/a, /tmp/b, /tmp/c
/tmp/{a,b}/z # /tmp/a/z, /tmp/b/z
{1..6} # 1,2,3,4,5,6
{1..10..2} # 1,3,5,7,9
{a..d} # a,b,c,d
正则表达式
特殊单字符
| 符号 | 含义 | 示例 | 匹配结果说明 |
|---|---|---|---|
. | 任意单个字符(不含换行符) | a.c | 匹配 "abc"、"axc"、但不匹配 "ac" |
\d | 任意数字 0–9 | \d\d | 匹配 "23"、"09" |
\w | 任意字母、数字或下划线 | \w+ | 匹配 "abc_123" |
\s | 任意空白符(空格、Tab、换行) | \s+ | 匹配 " " 或 "\t" |
[abc] | 字符集合(多选一) | [abc]at | 匹配 "bat"、"cat"、"aat" |
[^abc] | 取反,不包含 a/b/c | [^abc]at | 匹配 "dat"、"zat" |
量词
| 符号 | 含义 | 示例 | 匹配说明 |
|---|---|---|---|
* | 重复 0 次或多次 | a*b | 匹配 "b"、"ab"、"aaab" |
+ | 重复 1 次或多次 | a+b | 匹配 "ab"、"aaab",但不匹配 "b" |
? | 0 次或 1 次 | colou?r | 匹配 "color" 或 "colour" |
{n} | 恰好 n 次 | \d{3} | 匹配 "123" |
{m,n} | 重复 m 至 n 次 | \d{2,4} | 匹配 "12"、"123"、"1234" |
分组引用
| 符号 | 含义 | 示例 | 说明 |
|---|---|---|---|
( ) | 分组 | (abc)+ | 匹配 "abc"、"abcabc" |
\1, \2 | 引用前面第几个括号 | (\w+)\s\1 | 匹配重复单词,如 "go go" |
\0 & | 引用整个正则表达式匹配内容(部分实现支持) | — | 在替换中常用,如替换整体内容 |
嵌套括号 | 按左括号出现顺序编号 | ((ab)c)\1 | 第一个括号是 ((ab)c),第二个是 (ab) |
断言
| 符号 | 含义 | 示例 | 说明 |
|---|---|---|---|
^ | 行首匹配 | ^abc | 匹配以 "abc" 开头的行 |
$ | 行尾匹配 | abc$ | 匹配以 "abc" 结尾的行 |
\b | 单词边界 | \bcat\b | 匹配完整的 "cat",不匹配 "scatter" |
\< \> | 单词边界(旧写法,用于部分 grep/sed) | \<cat\> | 同上,常见于 Linux 工具 |
匹配模式
仅适用与PCRE
- i----不区分大小写
- g----多行匹配模式(是^$匹配每行的开头结尾)
正则练习
# 精准匹配IP地址 xx.xx.xx.xx
"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$"
# 匹配思路:250-255,200-299.100-199.10-99,0-9
250-255 25[0-5]
200-249 2[0-4][0-9]
100-199 1[0-9][0-9]
0-99 [1-9]?[0-9]?
# 邮箱地址检测
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
# 中国大陆手机号检测
^1[3-9]\d{9}$
# 空白行
^\s*$
# ip地址
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
# 强密码检测(字母大小写、数字、特殊符号、总长至少8位)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
| 分类 | 流派 | 常见命令或工具 | 是否默认支持 PCRE |
|---|---|---|---|
| POSIX 流派 | BRE / ERE | grep、sed、awk、find、expr | ❌ 否(传统工具默认 POSIX) |
| PCRE 流派 | Perl 风格 | grep -P、perl、nginx、php、python、logstash、prometheus 等 | ✅ 是(更强大) |
系统命令(grep/sed/awk)多为 POSIX 流派;程序/脚本(Perl/Python/PHP)多为 PCRE 流派。
看命令结尾
没加参数 → POSIX BRE
加了-E→ POSIX ERE(扩展)
加了-P→ PCRE(最强)
![[assets/Pasted image 20251018143209.png]]
文件系统
操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。
文件系统统一管理磁盘与内存中的数据访问过程,其中所有权威元数据都永久存储在磁盘上,而内存中通过缓存(如inode cache、dentry cache)提升访问效率
文件系统目录
![[assets/Pasted image 20251015192022.png]]
文件系统的三大职责
| 模块 | 功能说明 |
|---|---|
| 元数据管理 | 管理 inode、目录项、权限、时间戳等信息 |
| 数据块管理 | 负责分配/释放数据块,维护块映射结构(如 extents、indirect) |
| 日志机制(可选 | 提供崩溃一致性保障,如 ext4 的 journal 区 |
文件系统的实现

①:mkfs.ext4 → 磁盘介质
这是用户态的mkfs.ext4工具直接通过系统调用(如open、write)对/dev/sdX块设备写入ext4文件系统结构(如 superblock、inode 表、块位图等)。
它不依赖内核中的ext4模块,而是通过内核通用的块设备驱动将数据写入物理盘。
格式化的本质即写入文件信息的管理信息
②:用户程序 → VFS虚拟文件系统
用户程序通过系统调用(如 open() , read() , write() )访问文件。内核首先通过 VFS(虚拟文件系统) 作为中间层进行处理。VFS 提供统一的文件操作接口,不关心底层具体使用的ext4还是xfs还是btrfs。
③:VFS → 文件系统内核模块(如 ext4.ko)
VFS 在识别出文件属于某个挂载点后,会调用对应的文件系统模块(ext4/xfs等)的具体实现。比如ext4_read_inode()、ext4_lookup() 等,这些函数知道如何解析ext4 格式的磁盘结构。
④:文件系统模块 → 磁盘介质
ext4/xfs 等模块调用底层 块设备接口(通过 submit_bio() 等)读写磁盘扇区。比如要读取 inode 或写入数据块,会最终通过块设备层 + I/O 调度器 + 驱动完成真实磁盘访问。
| 编号 | 路径描述 | 执行层 | 说明 |
|---|---|---|---|
| ① | mkfs.ext4→磁盘 | 用户态→块设备驱动 | 用户工具直接构造文件系统结构写入裸设备 |
| ② | 用户程序→VFS | 用户态系统调用 | 程序调用文件操作,进入内核的虚拟文件系统接口层 |
| ③ | VFS→文件系统模块 | 内核态 | VFS 调用 ext4/xfs 驱动具体实现读取结构 |
| ④ | 文件系统模块→磁盘 | 内核态→块层+驱动 | 实际的数据读写,最终落地磁盘扇区 |
深入理解目录与文件
Inode详解
inode 是一个数据结构,它包含了多种信息,包括文件的元数据和指向数据块的指针。因此,inode 的主要作用是管理文件的元数据,而不仅仅是指向文件的物理位置。
truct inode {
umode_t i_mode; // 文件的类型和权限(如文件、目录、符号链接等)
unsigned short i_opflags;
kuid_t i_uid; // 文件的用户 ID(所有者)
kgid_t i_gid; // 文件的组 ID(所属组)
unsigned int i_flags;
struct timespec64 i_atime; // 最后访问时间
struct timespec64 i_mtime; // 最后修改时间
struct timespec64 i_ctime; // 元数据最后修改时间
unsigned int i_nlink; // 硬链接数
blkcnt_t i_blocks; // 分配给该文件的块数
loff_t i_size; // 文件的大小(字节)
struct super_block *i_sb; // 指向超级块的指针
struct address_space *i_mapping;// 关联文件数据的地址空间
// ... 其他成员
};
认识Inode表
当在文件系统中创建一个新文件或目录时,文件系统会在 inode 表 中分配一个 inode,并为该文件生成一个 inode 结构体,存储该文件的元数据。这些 inode 是在 文件系统初始化时(通常是格式化时)预留的,保存在磁盘上的 inode表中。
- 文件系统初始化(格式化):
- 当文件系统(如 ext4)被初始化或格式化时,文件系统会在磁盘上划分出一定的空间,用来存储 inode表。
- inode 表中的 inode 数量是有限的,是在文件系统创建时确定的。例如,如果你创建一个文件系统并指定 10,000 个 inode,那么这个文件系统最多只能支持 10,000 个文件或目录(即使磁盘空间没有用完)。
- inode 表会被分配固定大小的空间。例如,一个 inode 大约占用 128 或 256 字节,这取决于文件系统的配置。格式化时会计算 inode 表所需的空间,并在磁盘上预留这些空间。
- 创建文件时的 inode 分配:
- 每当你创建一个新文件或目录时,文件系统会从 inode 表中分配一个空闲的 inode,用于存储该文件的元数据。
- inode 分配后,文件系统会将文件的相关元数据(如权限、所有者、时间戳、数据块指针等)填入该inode,并更新文件系统的目录项,将文件名与该 inode 关联。
- inode 表的有限性:
- inode 表在文件系统创建时确定大小,之后通常不可动态调整。这意味着文件系统可以存储的文件数量受限于 inode 数量,而不仅仅是磁盘容量。对于存储大量小文件的场景,inode 数量可能比磁盘容量更早耗尽。因此在格式化文件系统时,可以通过调整 inode 数量来优化文件系统的使用。
认识inode位图
inode 位图用于管理 inode 表的使用状态,指示哪些 inode 是空闲的、哪些被占用。
目录本质详解
目录就是一种特殊的文件,其内容是一个个“目录项记录”(directory entries)组成的结构数组,用于表示“文件名 →inode号”的映射关系
// 示例结构体(ext4)
struct ext4_dir_entry {
__le32 inode; // 4 bytes
__le16 rec_len; // 2 bytes:当前目录项总长度
__u8 name_len; // 1 byte:文件名长度
__u8 file_type; // 1 byte:文件类型(ext4 专有)
char name[]; // 不定长:文件名(不含 '\\0' 结尾)
};
字段解析说明:
Linux7种文件类型
| 类型符号 | 文件类型 | 常见颜色 | 说明 |
|---|---|---|---|
- | 普通文件 | 白色 | 文本文件 file.txt、日志文件 var.log二进制可执行文件等 |
d | 目录文件 | 浅蓝色 | 存放其他文件或目录的容器。 |
l | 链接文件 | 亮蓝色(带闪烁) | 软链接(符号链接),类似快捷方式。可用 ln -s target link_name 创建 |
p | 命名管道文件 | 暗黄色 | 用于进程间单向通信(FIFO) 一个进程写,另一个读。创建方式: mkfifo mypipe 或 mknod mypipe p |
s | Socket 文件 | 紫色 | 用于进程间双向通信,常用于网络通信或本地套接字(如 MySQL 的 /tmp/mysql.sock) |
c | 字符设备文件 | 明黄色 | 以字符为单位进行 I/O 操作,无缓冲。例如:/dev/ttyS0(串口)、/dev/input/mouse0(鼠标) |
b | 块设备文件 | 明黄色 | 以数据块为单位进行 I/O 操作,有缓冲。例如:/dev/sda(硬盘)、/dev/sda1(分区) |
文件系统分类
![[assets/Pasted image 20251015164456.png]]
ext4
ext4是Linux系统中广泛使用的文件系统,它继承了ext3的优点,并在性能和稳定性方面有所提升。
ext4支持大文件和大容量存储设备,具备日志功能以防止数据损坏,并支持延迟分配以减少文件碎片
适用场景:
ext4最适合用于Linux系统的硬盘分区,以及需要高性能和稳定性的服务器环境。
XFS
XFS(eXtended File System)
XFS是一个高性能的64位文件系统,最初由SGI开发,用于高负载服务器和数据存储。
它支持大文件和高并发的读写操作,具有动态空间分配和高效的空间管理能力
Swap
Swap不是一种传统的文件系统,而是一种虚拟内存机制。当操作系统预测到内存分配可能会变得困难时,就会提前触发swap机制,以预防内存不足的情况。这有助于确保系统的稳定性和性能
当操作系统预测到物理内存不足时,Swap允许系统将部分内存数据写入磁盘上的Swap空间中,以释放物理内存给其他进程使用。Swap空间可以是专门分配的分区,也可以是文件系统中的文件。Swap的使用有助于提升系统的稳定性和性能,尤其是在内存资源紧张的情况下。
iso9660
ISO 9660(正式名称:ECMA-119)
ISO 9660 是为 CD-ROM 设计的只读文件系统格式,它是操作系统安装盘、LiveCD、镜像文件(.iso)的标准文件结构。通过扩展(如 Joliet, Rock Ridge),它可支持更丰富的文件名和权限信息。
适用场景:
ISO 9660 正是光盘(CD-ROM)标准的文件系统格式,它被广泛用于光盘的内容分发、操作系统安装镜(如 .iso 文件)等场景。
FAT
FAT(File Allocation Table)文件系统
FAT是一种简单且广泛使用的文件系统,主要包括FAT12、FAT16和FAT32等版本。
它使用文件分配表来管理文件的位置和状态,具有跨平台性和良好的兼容性,几乎支持所有主流的操作系统。
然而,FAT文件系统不支持高级的文件权限控制。
适用场景:
- FAT32常用于U盘、存储卡等移动设备,因其简单结构和广泛兼容性而受欢迎。
NTFS
NTFS(New Technology File System)文件系统
NTFS是Windows操作系统的标准文件系统,支持高级功能,如文件权限、加密、压缩和磁盘配额。
它提供了更高的安全性和稳定性,支持大文件和分区,并具有文件系统日志,有助于防止数据丢失。
适用场景
- NTFS最适合用于Windows操作系统的硬盘分区,以及需要高级文件管理功能的场景。
extFAT
exFAT 是 SDXC(64GB及以上SD卡)的官方推荐格式
exFAT 是为闪存存储设备优化的现代文件系统,兼具 FAT32 的广泛兼容性和对大文件的支持,适合相机、U盘、大容量SD卡等场景。但不适合用作系统盘或高可靠场合。
支持 Windows(Vista SP1+)、macOS(10.6.5+)、Linux(需要 exfat-utils 支持)
UFS(unix)
UFS是UNIX文件系统的简称,几乎是大部分UNIX类操作系统默认的基于磁盘的文件系统
查看内核支持的文件系统模块
#查看当前内核支持的文件系统
ls /lib/modules/`uname -r`/kernel/fs
#查看当前系统可用的文件系统
cat /proc/filesystems
#支持≠可用

临时网络代理
export http_proxy=http://172.22.100.2:7980
export https_proxy=http://101.35.250.82:18888 #
export https_proxy=http://代理IP:端口
网络
查看和修改网卡配置文件
Ubuntu
ls /etc/netplan/
Rocky9/10
ls /etc/sysconfig/network-scripts/
以ubuntu2404为例
sudo cat /etc/netplan/50-cloud-init.yaml
network:
version: 2 # 版本号
ethernets:
ens33: # 以太网接口名称
dhcp4: no # 对于IPV4是否开启DHCP自动分配
addresses: # 静态IP地址配置区块
- "10.0.0.19/24"
nameservers: # DNS服务配置区块
addresses:
- 10.0.0.2
routes: # 静态路由配置区块
- to: default # 默认路由
via: 10.0.0.2
修改后让新配置生效
netplan apply
OSI和TCP/IP模型关系
![[assets/osi-tcp-ip 1.png]]
OSI七层模型
- 物理层
- 负责在物理介质上传输原始比特流(0和1),定义了电压、接口、线缆标准、传输速率等物理特性。
- **数据链路层
- 在同一局域网内的节点之间提供可靠的数据传输,包括错误检测与纠正、流量控制以及MAC地址的使用。
- **网络层
- 处理分组在网络中的活动,如路由选择、数据转发、IP地址的使用等,确保数据能够跨越多个网络到达目的地。
- 传输层
- 提供端到端的通信服务,保证数据完整无误地从源端传送到目的端。TCP和UDP协议工作在此层,分别提供可靠的连接导向服务和不保证送达的快速消息传递服务。
- **会话层
- 管理会话,即两个节点之间的对话控制,包括会话的建立、管理和终止,支持远程过程调用等功能。
- **表示层
- 关注数据的表现形式,负责数据格式转换、加密解密、压缩解压缩等,确保接收方能正确理解发送方的数据内容。
- **应用层
- 直接面向用户的应用程序,提供网络服务给应用程序,比如HTTP、FTP、SMTP等协议,用于支持文件传输、电子邮件、网页浏览等网络功能。
TCP/IP四层模型
- 网络接口层----物理层 + 数据链路层。
- 功能:在物理网络上传输数据。
- 对应 OSI 层:
- 作用:处理 MAC 地址、网线或 Wi-Fi 上的数据帧收发。
- 网际层----网络层。
- 功能:实现数据包跨网络传输。
- 核心协议:IP、ICMP、ARP。
- 作用:通过 IP 地址进行路由和转发。
- 传输层-----传输层。
- 功能:提供端到端数据传输。
- 核心协议:TCP(可靠)、UDP(快速)。
- 作用:确保数据完整、有序传输,用端口号区分应用。
- 应用层----会话层 + 表示层 + 应用层。
- 功能:为应用提供网络服务。
- 常见协议:HTTP、FTP、DNS、SMTP、SSH。
- 作用:支持上网、发邮件、文件传输等日常网络操作。
TCP/IP
- 作用:提供可靠的、面向连接的端到端数据传输。
- 特点:
- 面向连接(三次握手建立连接)。
- 可靠传输(确认、重传、校验)。
- 流量控制和拥塞控制。
- 数据有序到达。
- 应用场景:网页浏览(HTTP/HTTPS)、文件传输(FTP)、电子邮件(SMTP)等对数据完整性要求高的场景。
UDP
- 作用:提供简单的、无连接的数据传输服务。
- 特点:
- 无连接(无需建立连接)。
- 不可靠(不保证送达、不重传、可能乱序)。
- 传输速度快、开销小。
- 应用场景:视频会议、在线游戏、DNS 查询、直播等对实时性要求高、能容忍少量丢包的场景。
命令分类与执行过程
shell中可以执行的两类命令
内部命令
- 内部命令:指集成在特定shell中的命令,当用户登陆时,会自动启用shell,而对应的shell程序中包含一些常见工具。默认的
/bin/bash shell中就集成了很多内部命令 - 使用[[#enable]]查看内部命令
外部命令
- 没有集成在shell程序中。具体表现为一个独立的可执行文件。所以外部命令都能在磁盘中找到对应文件
- 统查看外部命令的方式:
echo $PATH - 查看外部命令存放路径: [[#which]] [[#whereis]]
- 当第一次执行外部命令,系统会将外部的路径记录到内存缓存区中,下次再执行此外部命令,将会从缓存区中找到路径, 直接到对应的磁盘路径找到此命令并执行。通过[[#hash]]命令可以查看到已执行过的外部命令及路径
shell的hash表机制主要用于跟踪和缓存$PATH环境变量指定的目录中找到的命令的位置。非$PASH记录的路径下的程序,执行后不会记录在hash中
hash 只对当前用户的当前终端进程有效,是一组临时数据;
指令执行过程
- 先判断是内部命令还是外部命令
- 如果是内部命令:直接执行
如果是外部命令:先去hash里找,是否有该命令记录,如果没有,去PATH路径下找,如果还没有,则报错,command not found;如果找到, 则直接执行,并将可执行文件的路径记录到hash中 - 如果hash中有该指令路径,但是该指令路径已经转移,即使转移到了PATH路径下,仍然会报错,不存在该文件/目录,此时应清空hash值,重新执行指令
命令执行优先级:别名>内部命令>hash>外部命令
扩展问题
echo是shell内置命令,但是/usr/bin/echo,也存在独立与shell的外部命令echo,存在这个现象的原因,主要是为了提供兼容性、标准化以及在特定情况下的灵活性。
Unicode编码方案
- UTF-8: 变长,1到4个字节
- UTF-16:变长,2或4个字节
- UTF-32:固定长度,4个字节
语言环境
# 查看当前语言
echo $LANG
#临时修改
LANG=zh_CN.UTF-8
Prompt提示符
# 示例:
PS1="\[颜色开始\]文字\[重置\]文字\$ "
# 无颜色
PS1="\u@\h \W \$ "
\u-用户名 \h-主机名 \W-当前目录 \$-提示符(普通用户是$,root是#)
#简单颜色
PS1="\[\e[32m\]\u@\h \W \$ \[\e[0m\]"
# 格式如下:
PS1="\[\e[ 样式 + 内容 \e[0m\] "
# 格式命令如下:
\[ <提示符样式> \] # 这个提示符样式外的\[ \] 可以省略
# 提示符样式如下:
\e[ 样式 + 内容 \e[0m # 以 \e[ 开始,\e[0m 表示关闭设置
# 样式分3部分
格式:F;B;Sm
F: 表示前景色
30 黑色,31 红色,32 绿色,33 黄色,34 蓝色,35 紫色,36 青色,37 白色
B:表示背景色,背景色数值 = F + 10
S:显示的样式如下
0:表示关闭颜色设置
1:表示粗体
4:表示加下划线
5:表示闪烁
7:表示前景色,背景色互换
8:表示隐藏
# 内容:
CentOS系列
Ubuntu系列
\u: 表示当前用户
\h: 表示主机名简称
\W: 表示当前工作目录基名
\$: 表示提示符(普通用户$ root用户#) 实测在rocky9不好用
\H: 表示完整主机名
\w: 表示完整工作路径
\t: 表示24小时时间格式为:时:分:秒
\A: 表示24小时时间格式为:时:分
\#: 表示开机命令历史数
\d: 表示日期,格式为:星期 月 日
\v: 表示BASH的版本信息
注意:
实测\$不好用,可以直接在root的目录下的.bashrc文件中改为#
默认ubuntu禁用root用户ssh
解决:目录/etc/ssh下的sshd_config文件,找到PermitRootLogin
#PermitRootLogin prohibit-password
PermitRootLogin yes
关闭防火墙
- Ubuntu关闭防火墙
#关闭防火墙
systemctl disable --now ufw
- Rocky关闭防火墙
#关闭selinux
vim /etc/selinux/config
SELINUX=disabled #将SELINUX的值设置为disabled
#关闭防火墙
sysytemctl disable firewalld.service
换源更改为国内源
- Ubuntu
#以ubutnu2404为例
vim /etc/apt/sources.list
#更换为以下网址-----https://mirrors.aliyun.com/ubuntu/
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
#更新
apt update
- Rocky
mkdir -p /etc/yum.repos.d/backup #创建备份文件夹
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
vim rocky.repo
# rocky.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[baseos]
name=Rocky Linux $releasever - BaseOS
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?
arch=$basearch&repo=BaseOS-$releasever$rltype
baseurl=https://mirrors.aliyun.com/rockylinux/10/BaseOS/x86_64/os/gpgcheck=1 enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-10
[AppStream]
name=Rocky Linux $releasever - AppStream - Debug
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?
arch=$basearch&repo=BaseOS-$releasever-debug$rltype
baseurl=https://mirrors.aliyun.com/rockylinux/10/AppStream/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-10
[extras]
name=Rocky Linux $releasever - Extras - Source
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=source&repo=BaseOS-$releaseversource$rltype
baseurl=https://mirrors.aliyun.com/rockylinux/10/extras/x86_64/os/gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-10
[epel] #添加epel
name=Rocky Linux $releasever - EPEL - Source
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=source&repo=BaseOS-$releaseversource$rltype
baseurl=https://mirrors.aliyun.com/epel/10/Everything/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-10
修改登陆提示
- 登陆前提示
修改文件/etc/issue - 登陆后提示
配置文件 /etc/motd
用户和组的配置文件
用户和组的主要配置文件
- /etc/passwd:⽤⼾及其属性信息(名称、UID、主组ID等)
- /etc/shadow:⽤⼾密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshadow:组密码及其相关属性
passwd文件格式
#文件格式
#login name:password:UID:GID:GECOS:directory:shell
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell,一般用 chsh 命令修改 chsh -s /bin/cshmage
shadow⽂件格式
| 序号 | 名称 | 说明 |
|---|---|---|
| 1 | 用户名 | 与 /etc/passwd 中的用户名对应 |
| 2 | 加密密码 | 通常是用 SHA-512 加密的哈希值;如果是 ! 或 * 表示账户被锁定| |
| 3 | 最近修改密码的日期 | 从 1970-01-01 起的天数 |
| 4 | 最小天数 | 两次修改密码之间的最少天数 |
| 5 | 最大天数 | 密码有效期的最大天数 |
| 6 | 警告天数 | 密码过期前多少天开始警告用户 |
| 7 | 不活动天数 | 密码过期后多少天禁用账户 |
| 8 | 账号过期日期 | 从 1970-01-01 起的天数,超过后账号会被禁用 |
| 9 | 保留字段 | 一般为空,预留给将来使用 |
sudo cat /etc/shadow
linss:$y$j9T$.K3J8DhFGq/YIn6Q0UnZx.$7G.NKqWj1fjEZzvE5sBnmtB7eV7fW/vPkSTShROQeC/:20372:0:99999:7:::
用户名:密码:最近修改日期:最小天数:最大天数:警告天数:不活动天数:账号过期日期:保留字段
# 密码字段格式解析
$<id>$<salt>$<hashed>
# $ 分隔符
# id 加密算法
# salt 加盐值
# hashed 哈希值
所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账号,可以直接在密码字段前加
| 标识符 | 加密方式 | 备注 |
|---|---|---|
| $6$ | SHA-512 | 标准传统方式 |
| $y$ | yescrypt | 更安全,支持内存加密,抵抗GPU暴力破解,现代系统推荐 |
查看系统加密⽅式
# Ubuntu中查看当前的加密方式
root@magedu:/etc/pam.d# cat common-password
# Rocky中查看当前的加密方式
[root@bogon pam.d]# cat /etc/pam.d/system-auth
⽤⼾和组管理命令
⽤⼾管理命令
useradd
usermod
userdel
组账号维护命令
groupadd
groupmod
groupde
实验
问题解决
重置root密码
适用于 Rocky/CentOS/RHEL/Fedora/Anolis
以Rocky 10为例
1. 重启系统
- 重新启动 Linux 系统
- 看到 GRUB 引导菜单时,立即按
e进入编辑模式
![[assets/Pasted image 20251021161036.png]]
2. 修改内核启动参数
进入编辑界面后,找到以 linux 或 linuxefi 开头的那一行(通常是第二行)。
在这行文字的末尾删去多余参数添加以下参数
init=/bin/bash
示例:
# 找到以下内容:
linux ($root)/vmlinuz-6.12.0-55.37.1.el10_0.x86_64 root=/dev/mapper/r1_bogon-root ro crashkernel=20-64G:256M,64G::512M resume=UUID=...
# 删除一部分并在末尾添加
linux ($root)/vmlinuz-6.12.0-55.37.1.el10_0.x86_64 root=/dev/mapper/r1_bogon-root ro init=/bin/bash
![[assets/Pasted image 20251021192118.png]]
3. 启动进入 Root Shell
根据底部提示使用ctrl+x或F10启动,进入root shell
![[assets/Pasted image 20251021191117.png]]
4. 挂载根文件系统为可写
系统会启动并进入一个根 shell,但此时文件系统是只读的。必须改为可写才能修改密码。
执行以下命令:
mount -o remount,rw /
5. 修改密码
使用以下命令修改root密码:
passwd root
6. 触发 SELinux 重新标记
Rocky Linux 10 默认启用 SELinux,它通过安全上下文(security context)控制文件访问权限。
当使用 init=/bin/bash 绕过正常引导流程时,SELinux 可能无法正确识别文件的安全标签,所以需要让 SELinux下次启动时重新扫描并标记所有文件的上下文。
touch /.autorelabel 就是这个标志文件,它会触发一次完整的 SELinux relabeling 过程。
touch /.autorelable
7. 重启
使用以下命令重启系统:
exec /sbin/init
重启后使用新密码登陆即可`
常用命令
vim
- 编辑模式:i-向前插入,a-向后插入,o-向下插入
- 视图模式:整行选中:shift+v
- 单字选中: ctrl+v
- 在vim中输出彩色字体
1、在插入模式下
2、使用ctrl+v进入特殊字符插入模式
3、ctrl+[ ,会插入一个 ^[ (转义字符)
4、输入[32;1m
5、输入文本
6、ctrl+v,ctrl+[
7、输入[0m结束色彩输出
8、示例:^[ [32;1mHello, Welcome To My Home - Mystical^[ [0m
非编辑模式下:
dd 删除一行
5dd 删除5行
dG 从光标所在行到最后一行
dgg 第一行到光标所在行
| Ctrl + A | 光标迅速回到行首 |
|---|---|
| Ctrl + E | 光标迅速回到行尾 |
| Ctrl + k | 删除光标到行尾的内容 |
| Ctrl + u | 删除光标到行首的内容 |
| Ctrl + y | 粘贴删除的内容 |
grep
作⽤:⽂本搜索⼯具,根据⽤⼾指定的 “模式” 对⽬标⽂本逐⾏进⾏匹配检查;打印匹配到的⾏
模式:由正则表达式字符及⽂本字符所编写的过滤条件
grep [OPTIONS...] PATTERN [FILE...]
面试重点
-rni ----> 递归文件,显示行号。忽略大小写
# 常用选项
-E|--extended-regexp # 使用ERE,相当于egrep
-P|--perl-regexp # 支持Perl格式的正则表达式
-i|--ignore-case # 忽略字符大小写
-v|--invert-match # 显示没有被匹配上的行,即取反
-n|--line-number # 显示匹配的行号
-q|--quiet|--silent # 静默模式,不输出任何信息,结果要从变量 $? 拿
$?的值为0表示查到,为1则表示无
-r|--recursive # 递归目录,但不处理软链接
-m|--max-count=N # 只匹配N行,是行,不是次数,一行可能匹配两个,但是,这里是行
-c|--count # 统计匹配的行数,是行数,一行可以匹配一次到多次
-e|--regexp=PATTERN # 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
-A|--after-context=N # 显示匹配到的字符串所在的行及其后n行
-B|--before-context=N # 显示匹配到的字符串所在的行及其前N行
-C|--context=N # 显示匹配到的字符串所在的行及其前后各N行
示例
# 从passwd中查找root用户信息
grep root /etc/passwd
cat /etc/passwd | grep root
# 显示匹配内容的前三行 -m
grep -m 3 bin /etc/passwd
# 显示不匹配的行 -v
grep -v nologin /etc/passwd
# 不看注释行
grep -v "#" /etc/fstab
# 静默模式
grep -q root /etc/passwd
echo $? # 输出0
# 仅显示匹配的内容 -o
grep -o root /etc/passwd
# 递归
grep -r root /etc/*
sed
Sed是从⽂件或管道中读取⼀⾏,处理⼀⾏,输出⼀⾏;再读取⼀⾏,再处理⼀⾏,再输出⼀⾏,直到最后⼀⾏。
⼀次处理⼀⾏的设计模式使得sed性能很⾼,sed在读取⼤⽂件时不会出现卡顿的现象
![[assets/Pasted image 20251018163638.png]]
sed [OPTION]... [script-only-if-no-other-script] [input-file]...
# 常用选项
-n|--quiet|--silent # 不输出模式空间内容到屏幕,即不自动打印
-i[SUFFIX]|--in-place[=SUFFIX] # -i 直接修改文件,-i.bak 以.bak后缀备份源文件
-E|-r|--regexp-extended # 扩展正则表达式
-ir # 此组合不支持,及组合使用-i不能放在最前面
-ri # 支持
-i -r # 支持
-ni # 此组合危险,会清空文件
格式: sed 选项 '范围 动作' 文件
范围格式
| 形式 | 示例 | 含义 |
|---|---|---|
| —— | sed 's/a/b' file | 处理整份的文件 |
N | 3d | 仅处理第三行 |
$ | $p | 处理最后一行 |
/pattern/ | /root.p | 匹配到root的行 |
M,N | 2,5 | 从第2行到第5行(包含) |
M,+N | 3,+4p | 从第三行到第7行 |
/pat1/,/pat2/ | /BEGIN/,?END/p | 从第一次匹配到 BEGIN 的行开始, 到第一次匹配到 END 的行结束 |
1~2 | 1~2p | 步长选择(奇数行) |
2~2 | 2~2p | 步长选择(偶数行) |
/^$/
^表示“行开始
$表示“行结束
^$合起来表示:一行中从头到尾什么都没有 → 空行
范围可以组合:例如/root/,$d表示从匹配 root 的行开始一直删除到文件末尾。
步长选择功能是 GNU sed 扩展,部分系统的 BSD/macOS 自带 sed 不支持。
动作格式
| 命令 | 作用 | 示例 | 说明 |
|---|---|---|---|
p | 打印匹配行 | sed -n '/bash/p' file | 常与 -n 连用 |
Ip | 忽略大小写打印 | sed -n '/root/Ip' file | GNU sed 扩展 |
d | 删除匹配行 | sed '/nologin/d' file | 删除并立即进入下一循环 |
a text | 在行后追加 | sed '/daemon/a ### SYSTEM USER ###' file | 用 \n 可多行追加 |
i text | 在行前插入 | sed '/daemon/i ### SYSTEM USER ###' file | 插入文本 |
c text | 替换整行 | sed '/guest/c This is a guest user' file | 整行替换为指定文本 |
w file | 保存匹配行 | sed -n '/bash/w bash_users.txt' file | 将匹配行写入文件 |
r file | 读入文件内容 | sed '/guest/r newtext.txt' file | 在匹配行后插入新文件内容 |
= | 打印行号 | sed -n '/bash/=' file | 输出匹配行的行号 |
! | 取反匹配 | sed '/bash/!d' file | 打印不包含 bash 的行 |
查找替代
| 格式 | 示例 | 说明 |
|---|---|---|
s/pattern/replace/ | s/root/admin/ | 将 root 替换为 admin |
| 使用其它分隔符 | `s | /bin/bash |
g | s/bash/sh/g | 行内全局替换 |
p | s/bash/sh/p | 打印替换成功的行 |
w file | s/bash/sh/w out.txt | 替换成功的行写入文件 |
I 或 i | s/bash/sh/I | 忽略大小写替换 |
分组与引用
| 表达式 | 含义 | 示例 |
|---|---|---|
\(...\) | 定义分组 | s/\(bash\)/[\1]/ → [bash] |
\1, \2 | 引用分组内容 | s/\(.*\):x:\(.*\)/\1(\2)/ |
& | 引用整个匹配内容(等价于 \0) | s/bash/[&]/ → [bash] |
范例
akw
报告⽣成器,格式化⽂本输出
⽬前主流发⾏版LINUX中使⽤的都是GAWK,
语法:awk 选项 处理动作 file
tree
# 查看指定目录的层级
tree -L 1 /etc
# 每个文件和目录前显示完整的相对路径
tree -f
-D 每个文件和目录前显示最新更改时间
-s 每个文件和目录前显示文件大小
-u 每个文件和目录前显示文件/目录拥有者
-p 每个文件和目录前显示权限标示
tree使用通配符筛选
tree -P pattern # 这里的pattern不支持正则表达式,仅支持通配符
[Sun Oct 15 10:33:09 26] root@rocky9:~ #tree -P 'r*.txt' /Storage/
/Storage/
└── test
├── rename.txt
└── robots.txt
1 directory, 2 files
#常用通配符:
匹配任意数量的字符(包括零个)。
? 匹配任意一个字符。
[...] 匹配方括号中的任意一个字符。
cat
-n|--number #对显示出的每一行进行编号
-E|--show-ends #显示行结束符$
-A|--show-all #显示所有控制符
-b|--number-nonblank # 非空行编号
-s|--squeeze-blank # 压缩连续的空行成一行
head
#默认查看前10行
-n|--lines=N #指定获取前N行,N如果为负数,表示从文件头取到倒数第N前
-c|--bytes=N #指定获取前N字节
tail
-n|--lines=N #指定获取后N行,如果写成+N,表示从第N行开始到文件结束
+N # 表示从第N行开始到文件结束
-c|--bytes=N #指定获取后N字节
-f|--follow=descriptor #跟踪显示文件fd新追加的内容,常用日志监控
more
# 分页读取
常用选项
-d # 在底部显示提示
-s # 压缩连续空行
常用动作
空格键 # 翻页
回车键 # 下一页
q # 退出
其他动作
!cmd # 执行命令,在查看文档的时候,执行相关的命令
h # 显示帮助
:f # 显示文件名和当前行号
= # 显示行号
less
常用选项
-e #显示完成后自动退出
-N #显示行号
-s #压缩连续空行
-S #不换行显示较长的内容
查看动作
:h # 显示帮助
/string # 搜索
:!cmd # 执行命令
b # 向上翻
q # 退出
export
export 是一个 Shell 内置命令,用于将一个全局变量导出到子进程环境中,使得子进程能够继承该变量。
man
# 搜索某个命令的关键字
man -k keyword
# 查看特定章节的手册
man 5 passwd # 查看 /etc/passwd 文件格式
- 方向键:上下滚动
- PageUp/PageDown:翻页
- /:搜索(如/option)
- n:跳到下一个搜索结果
- q:退出 `man` 页面
| 章节 | 内容 |
|---|---|
| 1 | 用户命令(如 ls, cp, grep) |
| 2 | 系统调用(如 open, read) |
| 3 | C 库函数(如 printf, malloc) |
| 4 | 设备文件(如 /dev/null, /dev/sda) |
| 5 | 文件格式(如 /etc/passwd, /etc/fstab) |
| 6 | 游戏(很少用) |
| 7 | 杂项(如 ascii, units) |
| 8 | 管理员命令(如 fdisk, shutdown) |
screen
# 创建一个会话
screen -S 会话名
# 查看所有会话
screen -ls
# 恢复某个会话:
screen -r 会话名 或 PID
# 结束会话
exit
| 快捷键 | 功能 |
|---|---|
Ctrl+A c | 创建一个新的窗口(shell) |
Ctrl+A n | 切换到下一个窗口 |
Ctrl+A p | 切换到上一个窗口 |
Ctrl+A " | 列出所有窗口(可视化选择) |
Ctrl+A w | 显示窗口列表(底部) |
Ctrl+A d | 分离会话(detach)——退出 screen 但不中断程序 |
Ctrl+A k | 关闭当前窗口(确认后) |
Ctrl+A ? | 查看所有快捷键帮助 |
Ctrl+A [ | 进入复制模式(可滚动、复制文本) |
tmux
# 启动一个新会话
tmux new -s 会话名
# 列出所有会话
tmux ls
# 恢复会话
tmux attach -t 会话名
# 结束指定会话
tmux kill-session -t 会话名
# 重命名会话
tmux rename-session -t 原会话名 新会话名
# 关闭所有会话
tmux kill-server
| 快捷键 | 功能说明 | 使用场景 |
|---|---|---|
Ctrl+B c | 创建一个新窗口 | 开始新任务,比如打开新 shell、运行服务 |
Ctrl+B n | 切换到下一个窗口 | 在多个窗口之间顺序前进 |
Ctrl+B p | 切换到上一个窗口 | 顺序后退,与 n 配合使用 |
Ctrl+B 0~9 | 直接切换到编号为 0~9 的窗口 | 快速跳转,比 n/p 更高效 |
Ctrl+B , | 重命名当前窗口 | 给窗口起个有意义的名字,如 logs、server、vim |
Ctrl+B & | 关闭当前窗口(会提示确认) | 结束一个任务或清理不用的窗口 |
Ctrl+B w | 显示所有窗口的可视化列表 | 查看所有窗口,用方向键选择并进入 |
mkdir
语法格式:mkdir [pv] [-m mode] directory_name...
# 创建多级目录
mkdir -p dir1/dir2/dir3
#一次创建多个同级目录用空格隔开
mkdir dir1 dir2 dir3
-v 会显示创建每个目录的详细信息
enable
# 查看已启用的内部命令
enable
# 禁用某个内部命令(如time)
enable -n time
# 启用被禁用的内部命令
enable time
alias
#设置别名
alias ll='ls -l'
#查看当前所有别名
alisa
#删除别名(以删除ll为例)
unalisa ll
#示例 将rm命令设置为将所有要删除的文件,移动到创建的垃圾箱目录中
alias rm='dir=/Storage/backup/data`date +%F-%H-%M-%S`;mkdir -p $dir;mv -t $dir'
永久保存方法:
对当前用户有效:写入~/.bashrc
对所哟用户有效:写入etc/.bashrc
启用配置文件:source .bashrc或. .bashrc
ls
语法格式:ls [OPTION]... [FILE].
-a 显示所有隐藏文件
-i 显示文件索引节点(inode)
-l 以长格式显示目录下内容列表
长格式输出信息:文件名、文件类型、权限、硬链接数、所有者、组、文件大小、修改时间
ls -l #默认显示文件的mtime--最后一次文件数据部分的修改时间
ls -l --time=ctime #显示文件的ctime--最后一次元数据的修改时间
ls -l --time=atime #显示文件的atime--最后一次访问时间
-t 用文件目录的更改时间排序
-S 按文件大小,从大到小排序
-d 可查询目录信息
#ls后面支持通配符过滤,不加单引号
ls -l *.txt
#关于文件的时间属性详解
atime: 记录最后一次的访问时间
mtime: 记录最后一次文件数据部分的修改时间
ctime: 记录最后一次文件元数据的修改时间
history
![[assets/Pasted image 20251016164317.png]]
# 查看历史命令
history
# 清空历史命令,仅清空命令缓存区的命令,不影响.bash_history
history -c
ctrl+r # 搜索模式
touch
如果文件存在则刷新时间,如果不存在则创建空文件
touch -a #改变atime, ctime
touch -m #改变mtime, ctime
touch -h #刷新链接文件本身,默认刷新目标文件
touch -c #只刷新已存在的文件,如果文件不存在,也不会创建文件
touch -r #使用某个文件的修改时间作为当前文件的修改时间
touch -t
# 修改atime,mtime到指定日期时间
# 比如01020304,指2024-01-02 03:04:00
# 比如0102030405, 指2001-02-03 04:05:00
cp
**
-b 覆盖已存在的目标前先对其做备份,后缀为~
-S 指定备份文件的后缀名
-i 覆盖前会先询问用户(推荐使用)
-r 递归处理,将目录及其中的为文件一同复制
-a 复制特殊文件,使用-a,例如:cp -a /dev/zero .
mv
语法:mv 目标文件 目标路径
-t 反转目标文件与目标路径
-i 如果会覆盖文件则提示
-b 覆盖文件时会备份被覆盖的文件
rm
-f 强制删除文件,即在删除文件时不提示确认,并自动忽略不存在的文件
-r 递归删除,目标是目录的话,整个目录文件全部删除
pwd
pwd -P # 输出真实物理路径
pwd -L # 默认,输出链接路径
basename
#只输出文件名
basename `which cat`
# 输出:cat
dirname
# 只输出路径
dirname `which cat`
# 输出:/usr/bin
tldr
TLDR: Too Long;Didn’t Read(太长不看),也可以叫作 “偷懒的人“
https://github.com/tldr-pages/tldr
# 安装Node.js和npm
apt update
apt install nodejs npm
# 安装 tldr 命令行客户端
npm install -g tldr
# 安装完成后,验证tldr是否安装成功。在终端运行以下命令
tldr
# 使用示例
# 第一次会先下载数据,因此会比较慢
tldr ls
which
# 查看外部命令存放路径
which man
/usr/bin/man #结果
whereis
# 除了命令外,显示和命令相关的帮助文档等文件路径
whereis man
# 结果
man: /usr/bin/man /usr/local/man /usr/share/man /usr/share/man/man7/man.7.gz /usr/share/man/man1/man.1.gz
hash
hash # 显示当前终端进程中的 hash 缓存
hash -r # 清空所有 hash
hash -l # 显示详细创建此条 hash 的命令,可作为输入使用
hash -p path name # 手动创建 hash
hash -t name # 输出路径
hash -d name # 删除指定 hash
tr
用于转换字符、删除字符和压缩重复的字符,从标准输入读数据并将结果输出到标准输出
tr [OPTION]... SET1 [SET2]
#常用选项
-c|-C|--complement # 取字符集的补集
-d|--delete # 删除所有属于第一字符集的字符
-s|--squeeze-repeats # 把连续重复的字符以单独一个字符表示,即去重
-t|--truncate-set1 # 将第一个字符集对应字符转换为第二个字符集对应的字符,如果第一 个字符集的字符数量多于第二字符集 数量,超出部分忽略
# 文件重定向
# 替换大小写
[root@ubuntu2204 ~]#tr 'a-z' 'A-Z' < /etc/issue
UBUNTU 22.04.1 LTS \N \L
# 保留所需字符
[root@ubuntu2204 ~]#tr -dc 'a-z0-9A-Z' < /dev/random |head -c 10
72waODnf7x
#常用通配符
[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符
bc
任意精度计算器语言
# 例:不开启小数计算1/2
bc < <(echo "1/2")
0 # 输出
# 例:开启小数计算/2
bc < <(echo "scale=4; 1 / 2")
.5000 # 输出
tee
既要有要,执行命令同时把内容打印到控制台
tee [OPTION]... [FILE]...
# 常用选项
-a|--append # 内容追加到给定的文件而非覆盖
-i|--ignore-interrupts # 忽略中断信号
-p # 对写入非管道的行为排查错误,其使用的是 warn-nopipe
--output-error[=模式] # #设置写入出错时的行为 (warn|warn-nopipe|exit|exit-nopipe)
cmd1 | tee [-a ] filename | cmd2
# 使用方式
echo "hello" | tee 1.txt
# tee.log 和终端输出都是大写
echo hello | tr 'a-z' 'A-Z' | tee tee.log
HELLO
useradd
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
-u|--uid UID #指定UID
-g|--gid GID #指定用户组,-g groupname|--gid GID
-c|--comment COMMENT #新账户的 GECOS 字段
-d|--home-dir HOME_DIR #指定家目录,可以是不存在的,指定家目录,并不代表创建家目录
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以查看
-r|--system #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后ID<1000,不会
创建登录用户相关信息
-m|--create-home #创建家目录,一般用于登录用户
-M|--no-create-home #不创建家目录,一般用于不用登录的用户
-p|--password PASSWORD #设置密码,这里的密码是以明文的形式存在于/etc/shadow 文件中
-G|--groups GROUP1[,GROUP2,...] #为用户指明附加组,组须事先存在
-D|--defaults #显示或更改默认的 useradd 配置,默认配置文件
是/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定账户的过期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁
用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目录模板,创建家目录,会生成一些默认文件,如果指定,就从该目录复制文件,默认/etc/skel/,要配合-m
usermod
usermod [options] LOGIN
#常见选项
-c|--comment COMMENT #修改注释
-d|--home HOME_DIR #修改家目录
-e|--expiredate EXPIRE_DATE #修改过期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不
使用此功能
-g|--gid GROUP #修改组
-G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时
使用-a选项
-a|--append GROUP #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
-l|--login LOGIN #新的登录名称
-L|--lock #锁定用户帐号,在/etc/shadow 密码栏的增加 !
-m|--move-home #将家目录内容移至新位置,和 -d 一起使用
-s|--shell SHELL #修改 shell
-u|--uid UID #修改 UID
-U|--unlock #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉
userdel
userdel [options] LOGIN
#常见选项
-f|--force #强制删除,哪怕用户正在登录状态
-r|--remove #删除家目录和邮件目录
groupadd
格式:groupadd [OPTION]... group_name
# 常见选项:
-g GID 指明GID号; [GID_MIN,GIDMAX]
-r 创建系统组,CentOS6之前:ID<500, CentOS 7以后:ID<1000
#注意:
#如果你知道你要创建的是一个系统组,并且你想确保它在系统组的 GID 范围内,那么使用 -r 选项是一个好的实践。如果你
#只是想创建一个具有特定 GID 的组,不管它是否是系统组,那么只使用 -g 选项就足够了。
#添加 -r 选项是为了明确表达你的意图,并确保组被正确地分类为系统组。不过,如果你手动指定了一个在系统组 GID 范围
#内的 GID,即使没有使用 -r 选项,该组在某种程度上也被视为系统组。
#范例:
groupadd -g 48 -r apache
groupmod
格式:groupmod [OPTION]... group
#常见选项:
-n <新组名> <原组名>: 新名字
-g GID : 新的GID
#示例:
groupmod -n www apache
groupdel
groupdel group_name 删除用户组
chmod
chown
# 将file文件的用户权限改为user_name
chown user_name file_name
#将该文件所属的用户名,组名一起变更。
chown user_name.group_name file_name
chown user_name:group_name file_name
#将文件夹下,所有文件的所属账号和组都一起变更,危险命
chown -R user_name.group_name dir
chgrp
仅更改文件所属组权限
chgrp group_name file
umask
修改新建文件/文件夹的权限
# 查看当前umask的值
umask
-- root权限的默认umask值022
-- 普通用户的默认umask值002
-----------------------------------------------
# 修改默认权限的实现方式
# 指定新建文件的默认权限
# 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变将权限+1的原因:
# 文件的执行时危险的!!!,如果没有执行权限,root也无法直接执行,但是没有读写权限,root依然能够进行读写
# 基于安全考虑,默认新建的文件不允许有执行权限!!
umask 的内在机制
666
123 -- umask值
文件权限为:644
------------------------------------------------
指定新建目录的默认权限
777-umask
------------------------------------------------
# 修改默认权限 -- 临时修改
umask <更改后的数字>
永久修改:
root目录下,.bashrc文件内修改,添加umask <数值>,保存退出后,. .bashrc或者重启
-- 全局设置:/etc/bashrc 不建议,这里修改会影响全局所有用户
-- 用户设置:~/.bashrc 只影响当前用户
hostname
hostname临时设定主机名。不会将名字写入 /etc/hostname 文件
命令格式:
hostname [-b] {hostname|-F file} set host name (from file)
hostname [-a|-A|-d|-f|-i|-I|-s|-y] display formatted name
hostname display host name
一般选项
-a|--alias #显示别名
-F|--file #从文件中读取
-i|--ip-address #显示IP地址,仅显示能解析的地址
-I|--all-ip-addresses #显示所有IP地址,但不显示IPV6地址,不显示回环地址
临时定制主机名
root@ubuntu24:~# hostname ubuntu-test
root@ubuntu24:~# hostname
ubuntu-test
立刻生效
root@ubuntu24:~# exec /bin/bash
root@ubuntu-test:~#
hostnamectl 永久设置主机名
命令格式:
hostnamectl [OPTIONS...] COMMAND
子命令
status # 查看配置
hostname [NAME] # 获取|设定主机名
set-hostname # 作用等同于 hostname,目前已被废弃
- 感谢你赐予我前进的力量