IMPORTANT

此文档仍需调整补充。

Info

  • 以下内容大多经由 Ubuntu20.04 测试,不同版本可能有细微差异;
  • 文档给出的选项用于速查,只列出较常用的部分;使用 Ctrl+F 快速查询;
  • 大多数指令可以使用选项、功能等以适应需求,它们会在指令下方给出;
  • 选项和它需要的值一般以空格分隔,如果一段字串中有空格,那么需要将它们用双引号括起。

0 Linux内核及其发行版简要区别

Linux本身只是一个操作系统内核,是一个大型的程序,仅具备对计算机最底层硬件进行交互的功能。在缺乏驱动程序和一些例如bash的系统程序时,内核几乎不能直接使用。发行版 (Release version) 就是把内核和许多系统程序等工具类程序封装在一块,这就构成了一个较完整的操作系统。

Linux常见的发行版本有:Debian, Ubuntu, CentOS, Fedora, Arch Linux, RedHat

1 基本目录&目录表示符

/                   -- 访问文件系统的入口,必须挂载
>   /bin            -- 真实路径在 /usr/bin
3   /boot           -- 操作系统启动文件,必须挂载
    /dev            -- 设备文件
    /etc            -- 全局配置文件
5   /home           -- 一般用户的主目录
>   /lib            -- 真实路径在 /usr/lib
>   /lib32
>   /lib64
>   /libx32
    /lost+found     -- 存储操作系统异常停止或文件系统故障时的恢复文件
    /media          -- 挂载可移动媒体设备
    /mnt            -- 挂载外部硬盘设备
    /opt            -- 通常存储大型应用程序
*   /proc           -- 存储操作系统与进程信息,是虚拟文件系统
    /root           -- root 用户的主目录
    /run            -- 运行时文件,例如套接字文件
>   /sbin           -- 真实路径在 /usr/sbin
!   /snap           -- (仅Ubuntu)snap 应用程序
    /srv            -- 网络服务端程序
*   /sys            -- 配置 Linux 内核的文件,是虚拟文件系统
    /temp(or /tmp)  -- 临时文件,每次重启时会清除
    /usr            -- 用户级程序主目录
        /bin        -- 用户级程序(包括一般 Shell 指令)
        /include    -- 存储 C/C++ 编写的系统头文件
        /lib        -- 通用系统共享库
        /lib32      -- 32位系统共享库
        /lib64      -- 64位系统共享库
        /libexec    -- 不通过 Shell 运行的系统库
        /libx32     -- 面向 32 位 ABI (x86) 的系统库
        /local      -- 用户自主安装的应用程序
        /sbin       -- 系统级应用程序
        /share      -- 共享数据
        /src        -- 操作系统内核源代码
5   /var            -- 经常发生修改的文件,例如服务程序工作目录
3   swapfile        -- Linux 交换文件,用于虚拟内存,必须挂载为 /swap

= = = 注释 = = =
* 虚拟文件系统目录
> 软链接目录

Info

  • 路径是标识唯一一个目录或文件的一段字符串,分为绝对路径和相对路径; 绝对路径始终从根目录的斜线 / 开头,例如 /home/yukaling, /usr/local

    相对路径不以斜线开头,将 Shell 工作目录作为查找起点,例如若 Shell 此时在 /etc 下,使用 cd nginx 就会切换到 /etc/nginx 下。

  • 操作系统的目录表示简写:

    • 波浪号 ~:当前用户的主目录;
    • 短横线 -:上一个工作目录;
    • 点号 .:当前目录;
    • 两个点号 ..:上级目录。

2 快捷键

  • Ctrl+Alt+T 启动终端
  • Ctrl+D 关闭终端 / 从终端断开
  • Ctrl+L 清除当前屏幕;要清空终端输出,使用指令 clear
  • Ctrl+Alt+F1 进入图形用户登入界面
  • Ctrl+Alt+F2 进入图形界面
  • Ctrl+Alt+F3~F6 进入虚拟终端 TTY3~TTY6 (TeleTYpe)
  • Ctrl+Alt+F7~F12 进入备选虚拟终端 TTY7~TTY12

3 Shell 指令

Shell 指令是由许多存在于 /usr/bin/usr/sbin 和环境变量 PATH 中的可运行程序,以及由 Shell 内部定义的指令(例如 echo, cd, alias, type)组成的,如果希望可运行文件能够直接以 Shell 指令形式访问而不需要指明目录,需要添加环境变量。

环境变量是特别指定的一组目录路径,告诉操作系统应该在这些指定路径查询可用的程序并让它们能直接通过可运行程序的文件名被访问,称作 PATH;Windows 的环境变量称为 Path。Linux 的可运行程序文件通常没有扩展名,例如 vim, wget

操作系统自环境变量的编写顺序向后搜索,如果多个路径中有相同文件名称的可运行程序,会使用最先从环境变量目录中搜索到的。

绝大多数指令皆可使用 --helpman <指令名称> 查看帮助信息。

Info

为了防止用户意外地运行了当前目录下可能的恶意程序(例如一个与操作系统工具程序 ls 同名的恶意程序),当前目录的可运行程序搜索优先级低于环境变量;

如果环境变量中有和当前目录下同名的程序:

  • 要运行环境变量找到的程序,直接输入程序名称;
  • 要运行当前目录中的程序,输入 ./<program>

使用 type <command> 可以查看 Shell 指令的来源,例如 cat 来自于环境变量,会显示:

cat is /usr/bin/cat

例如 echo 是 Shell 内建指令,运行 type -a echo,会显示:

echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

优先级最高的会排在第一个。

* type 也是一个 Shell 内建指令 :D

3.1 指令操作符

Info

指令操作符始终由当前 Shell 完成,若涉及需要 sudo 权限的文件操作,I/O交互操作符可能无法完成;在缺乏权限时,要尝试写文件就需要使用 [tee 指令](# 将标准输入重定向到多个输出)。

I/O交互操作

  • 覆盖写文件 <command> > <file_path>

    将指令的运行输出写入文件,覆盖原内容;

  • 追加写文件 <command> >> <file_path>

    将指令的运行输出写入文件,从新行追加;

  • 从文件读 <command> < <file_path> 将文件内容传递给指令;

  • 管道符 <command> | <command> 前一个指令运行完成后,将其输出结果传到后一个指令作为输入;

  • 写错误消息 <command> 2> <file_path>

  • 写标准输出与错误消息 <command> &> <file_path>

联结

  • 顺序运行 <command>; [command_2]; ...
  • 成功时接续运行 <command> && <command> 仅在前一个指令运行成功(返回0,OK),后一个指令才会运行;
  • 失败时接续运行 <command> || <command> 仅在前一个指令运行失败,后一个指令才会运行;

运行序

  • 后台运行 <command> ; [command_2]... & 在一段指令后添加,然后此指令会在后台运行而不必使终端等待;

  • 建立子Shell并运行 ( <command>; [command_2]; ... ) 为指令添加圆括号,使其在子Shell运行,不影响当前Shell; 例如,使用 cd 只影响子Shell;

  • 在当前Shell运行 { <command>; [command_2]; ... } 在右花括号前,必须以 ;& 结尾

3.2 操作系统类指令

关闭系统

poweroff
shutdown <now|(HH):(MM)|+(minute)>  # Example: shutdown 12:35
init 0
 
# 仅旧版本内核
halt

重启系统

reboot
shutdown -r <time>
init 6
 
# 若用于虚拟终端,仅刷新虚拟终端
reset

查询指令用法

man <cmd>

查询系统版本

uname

选项

-a 显示完整信息

查询系统运行时间

uptime

选项

-p | --pretty 以进制形式显示系统已运行时长

-s | --sine 显示系统启动时间,与上方选项冲突且此项优先级更高;

*查看历史运行指令

这是一条 Shell 内建指令。

history [count=all]

选项

-c 清空当前用户会话指令记录

-d <id> 删除指定编号的记录

-a 立刻将此次会话写入历史文件 ~/.bash_history

-r 从历史文件重载

系统时间与日期

date

选项

+<format> 手动指定需要输出的格式,支持的占位符: %Y 年,%m 月,%d 日,%H 时,%M 分,%S%F 日期 = (%Y-%m-%d),%T 时间 = (%H:%M:%S)

-d <string> | --date=<string> 显示确定的日期与时间,已定义字符串: last/next (second|minute|hour|day|week|<week_day>|month|year) yesterday / tomorrow

[需要root] -s <string> | --set=<string> 设置系统日期与时间

-r <file_path> | --reference <file_path> 查看文件修改时间

-u | --utc | --universal 以世界协调时形式查看

Info

日期标准样式示例:2025-01-29 15:30:26

若指定的格式 format 中有空格,需要使用括号围起整个选项:"+<format>"

以上占位符均输出完整的位数,使用24小时制。

系统时区

timedatectl [function]

功能

[默认] status 查看当前时间及时区属性

show 显示 systemd 风格的时间及时区属性

[需要root] set-time <string> 设置新的时间,仅在自动同步时间关闭时可用

[需要root] set-timezone <string> 设置新的时区

list-timezones 查看可用的时区名称

Info

使用 tzselect 可以通过多个步骤引导以完成时区名称选择。

查看指令的简易帮助信息

whatis <command>

查看静态进程列表

ps

未提供选项时,只输出当前用户在此控制台建立的进程。

选项

进程选择

-A | -e 显示全部进程

-a 显示全部进程,但排除没有TTY的进程

a 显示全部进程,包含其他用户的进程

-N | --deselect 反向选择

-C <command> 按指令名选择

-G <group_id> 按组ID选择

-p <process_id> 按进程ID选择

-u <user_id> 按用户ID选择

-s <session_id> 按会话ID选择

-t <tty> 按终端号选择

--ppid <process_id> 按上级进程ID选择

r 显示运行中的进程

格式

未填写 显示少量信息 (PID TTY TIME CMD)

-j 作业格式 (PID PGID SID TTY TIME CMD)

-f 显示更多信息 (UID PID PPID C STIME TTY TIME CMD)

-F 显示更多信息 (UID PID PPID C SZ RSS PSR STIME TTY TIME CMD)

-l 显示更多信息 (F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD)

-x 显示进程状态

f | --forest 以ASCII风格显示进程树

-H 以缩进形式显示进程树

-o <(list_field),...> 按指定的进程列表字段显示

--sort=<list_field> 按字段排序;若在字段前添加 -,降序

进程列表字段

字段说明
pid进程ID
ppid父进程ID
user用户名
comm指令名(被[]括起的为内核线程)
cmd完整命令行
%cpuCPU 使用率
%mem内存使用率
rss常驻内存大小(KB)
vsz虚拟内存大小(KB)
tty控制终端
stat进程状态
start进程启动时间
time累计CPU时间
ni优先级(nice值)
pri进程优先级
psr进程运行的CPU

进程状态符

代码说明
R运行中或可运行(在运行队列中)
S可中断的睡眠(等待事件完成)
D不可中断的睡眠(通常与IO相关)
T停止状态(由作业控制信号或被追踪)
Z僵尸进程(已终止但未被父进程回收)
X已死亡(不应该看到)
<高优先级
N低优先级
L有页面锁定在内存中
s会话首进程
l多线程
+前台进程组
I[仅内核线程] 空闲

查看动态进程列表

top

选项

-d <seconds> 设置刷新间隔

-n <count> 在指定刷新次数后退出

-p <pid> 只显示指定 PID 的进程

-u <user_name> 只显示指定用户的进程

-H 显示线程详细信息

-i 不显示空闲进程

-b 将结果作为文本输出

-c 显示完整的运行指令

-s 停用该指令的内部操作指令功能

进程信息

缩写名说明
PID进程标识符
USER进程对应用户
PR优先级
NI优先级调整
VIRT虚拟内存使用量
RES物理内存使用量
SHR共享内存使用量
%CPUCPU 使用率
%MEM使用的内存使用率
TIME+总计 CPU 使用时间

查看进程关系树状图

pstree

暂停/休眠进程

sleep <time_second>

终止或暂停进程(向进程发送信号)

kill <process_id>

选项

-l 查看终止信号列表

-<SIGNAL> 要向进程发送的信号,常使用为 -9 或不使用

信号编号信号名默认动作触发场景
1SIGHUP终止终端挂起(如关闭终端窗口),通常用于通知守护进程重新加载配置。
2SIGINT终止键盘中断Ctrl+C),用户主动终止前台进程。
3SIGQUIT终止+核心转储键盘退出Ctrl+\),类似 SIGINT 但会生成核心转储文件(core dump)。
4SIGILL终止+核心转储非法指令(如执行了错误的机器代码)。
6SIGABRT终止+核心转储abort() 函数触发,用于异常终止(如断言失败)。
8SIGFPE终止+核心转储浮点异常(如除以零)。
9SIGKILL强制终止立即终止进程(不可捕获、阻塞或忽略)。
11SIGSEGV终止+核心转储段错误(非法内存访问)。
13SIGPIPE终止管道破裂(如写入无读端的管道)。
14SIGALRM终止定时器超时(由 alarm()setitimer() 设置)。
15SIGTERM终止优雅终止(默认的 kill 命令信号),进程可清理资源后退出。
19SIGSTOP暂停进程强制暂停进程(不可捕获、阻塞或忽略,与 SIGKILL 类似但用于暂停)。
20SIGTSTP暂停进程键盘暂停Ctrl+Z),将前台进程放入后台并暂停。

apt 安装程序管理器

Info

apt 常见于 Debian 及衍生系统。

apt [function]
apt-get [function]

功能

update 更新软件包版本列表

upgrade 根据软件包版本列表,更新已下载的软件包

full-upgrade 更新软件包时,检索并处理软件包依赖关系

install <package> [package]... 安装新的实用软件

remove <package> 卸载软件,但保留软件配置文件

purge <package> 彻底卸载软件,包括配置文件

autoremove 清理未使用的依赖软件包

search <text> 按名称查找软件包

show <package> 查看软件包信息

list [--installed] [--upgradable] 列出 [已安装] [可升级] 的软件包

[仅Debian及衍生] deb 安装包管理器

dpkg

选项

-i <package> 安装指定路径的 .deb 安装包

-r <package> 删除

TIP

如果位于Ubuntu图形界面,可直接打开 .deb 文件进行安装。

查看内核启动信息

内核启动信息文件位于 /var/log/kern.log

dmesg [option]

选项

-l <MSG_TYPE> 只显示指定级别的信息,可用逗号分隔多个; 支持的值:emerg, alert, crit, err, warning, notice, info, debug

3.3 文件系统类指令

*显示当前工作目录 (Print Working Directory)

这是一条 Shell 内建指令。

pwd

选项

-P 显示物理路径,适用于显示符号链接目录指向的实际目录

*切换 Shell 工作目录

这是一条 Shell 内建指令。

cd [new_dir=~]

*列出文件与目录

这是一条 Shell 内建指令。

ls [dir_path=.] [filter=none]

选项

-a | --all 列出全部文件和目录,包括隐藏的和目录指示符

-A | --almost-all 列出全部文件和目录,但不包括目录指示符

-l 列出文件详细信息,包括文件类型(符号)、读写执行权限(所有者+所有组+其他用户)、硬链接计数、所有者:所有者组、占用大小(目录x4096B)、最后修改时间*[默认]*

-L | --dereference 列出符号链接文件和目录时,显示被链接对象信息而不是符号链接文件和目录

-i | --inode 显示文件索引节点

-m [与 -l 冲突] 以逗号分隔列出的文件和目录

-u 显示文件最近读取时间

-c 显示文件元数据变更时间

-h | --human-readable 将占用大小以进制形式展示

-d | --directory 仅列出目录

-r | --reverse 翻转列表排序

-R | --recursive 递归列出文件

-s | --size 显示文件占用的块大小

-1 每行只输出目录下的一个文件或目录,适用于脚本处理

Info

  • 只能列出一种时间。要同时查看3个时间,需查看单个文件或目录属性;
  • 对于软链接文件,它只占用链接的路径名称长度;

TIP

文件符号标识:

  • - 普通文件
  • c 字符设备文件 (char_dev) 键盘、打印机
  • l 软链接文件 (softlink)
  • b 块设备文件 (block_dev) 大容量存储设备
  • d 目录文件 (directory)
  • s 套接字文件 (socket) 网络通信链接接口
  • p 管道文件 (pipe_dev) 进程通信接口

列出文件或目录属性

stat <path>

Info

列出属性:文件名、大小(B)、占用的硬盘块数、IO读写最小单位(B)、文件存储设备的编号HEX和DEC值、文件索引号、硬链接数、文件类型、权限值、所属用户和所在组、内容访问时间、Modify 内容修改时间、Change 元数据或内容修改时间。

列出详细的文件类型

file <path>

创建目录

mkdir <dir_path>

选项

-p 当上级目录不存在时,可连续创建多级目录

创建文件

touch <file_path> [file_path]...

Info

  • 若文件名或文件夹已存在,此文件的访问日期及修改日期将更新;
  • 若文件夹不存在,运行失败;
  • 可连续创建多个文件,以空格分隔。

删除目录

rm -r <dir_path>
rmdir <dir_path>				-- 仅在目录为空时运行成功

删除文件

rm <file_path>

选项

-i 删除前询问

-v 删除完成后给予提示

复制

cp <source> <dest_path|dest_path_with_file_name>
cp <source> <source_2> [source_3]... <dest_dir>

选项

-r | -R | -recursive 递归复制,复制目录下所有内容

Info

  • 如果目标路径以 / 结尾,则认为是一个目录,该目录必须存在;

  • 如果目标路径不以 / 结尾:

​ → 有同名目录,则复制到此同名目录下;

​ → 有同名文件,则覆盖;

​ → 无此名称的文件或目录,将使用此新名称复制文件到此处;

  • 复制结果不能存在文件夹和文件同名,如有此情况,运行失败。

移动

mv <source> <destination>

选项

-b 在覆盖同名文件前,建立备份

-i 询问是否覆盖同名文件

-f 直接覆盖同名文件*[默认]*

-n 不覆盖任何文件和目录

-u 被移动文件修改时间更近时,覆盖

Info

移动目录时,如果目标目录不存在,将会视为移动并重命名为此目标目录;

如果目标目录存在,将移动到目标目录下。

建立链接

ln <target_file> <file_name>		-- hard link
ln -s <target_abs_path> <name>		-- soft link

选项

-s 建立符号链接(aka. 软链接、快捷方式)

-f 若已存在链接文件,覆盖

Info

  • 建立硬链接后,此文件的索引节点硬链接数+1,在硬链接数>1时,删除任何一个文件均不影响真实文件内容;
  • 硬链接不能跨越不同文件系统,因为各文件系统的存储结构存在差异; 不可通过此指令建立目录的硬链接,因需要避免用户建立环状链,引发查找时无限循环;
  • 目录的硬链接数初始为2,来自于:
    1. 链接到此目录文件索引节点的目录路径本身;
    2. 目录文件下指向自己的当前目录 .
    3. 如果在目录下建立目录,上级目录硬链接数+1。
  • 硬链接是链接真实文件(文件的索引节点),是动态的,改变链接文件位置依旧有效;
  • 设置软链接时,应当给出相对于软链接位置的目标文件相对路径,或者给出目标文件绝对路径;
  • 软链接实质上是存储文件路径,是静态的,改变链接文件位置可使其失效,类似Windows的快捷方式。

创建有名管道

mkfifo

快速读写文件

cat <file_path> [file_path]...			-- read file(s) (one by one)
cat [file_path]... > <file_path>		-- write content from left oprand(s), if there is no left oprand, write from stdin

-n 连续地显示行号

-b 仅为非空行设置行号

-s 连续的空行仅显示一行

显示文件内容

more <file_path>						-- non-interactive
less <file_path>						-- interactive

显示文件前/后n行

head [line_num=10] <file_path>
tail [line_num=10] <file_path>

显示文件行数

wc <file_path>

将标准输入重定向到多个输出

只使用重定向符和管道符会使指令的运行结果不能在标准输出中看到,如果希望输出既能在标准输出上看到,又能传给下一条指令或文件;或者希望同时输出到多个文件,那么需要使用这个管道分流指令;

若希望输出内容到需要 root 权限的目录或文件,可将 tee 的权限提升,而这是指令输出不能直接通过重定向符做到的,因为重定向符以当前用户身份运行 Shell,而不是以 root 身份。

tee [file_path=/dev/null] [file_path...]

这条指令经常以这些形式使用:

<command segment> | tee <file_path>
# OR
<command segment> | tee <file_path> | <command_segment>

其中左右两侧均为其他指令,tee 不仅能从管道前取得指令输出并保持控制台输出,还能将这个输出传递给管道后的指令(也可以使用 >>> 继续处理输出)。

选项

-a | --append 将输出追加到指定文件,而不是覆盖它

-i | --ignore-interrupts 忽略信号

文本匹配查询 (Global Regular Expression Print)

grep <regex> <file_path>

选项

-n 显示有匹配字符串的行号

-C <number> 同时显示匹配行的前后n行

-i | --ignore-case 忽略大小写

-v | --invert-match 反转匹配结果

Info

  • 如果有字符串匹配正则表达式规则,该行会被显示,且匹配的字符串会红色高亮。

  • grep 通过管道符连接其他指令时,可用于过滤输出条目;

  • grep 用于文件时,可用于在文件中搜索匹配的字符串。

将文本文件按行排序

sort <file_path>					-- sort by letter ascendingly

选项

-b | --ignore-leading-blanks 忽略行首空行

-R | --random-sort 随机排序(仅在不完全相同的行间)

-V | --version-sort 按版本号计数法排序

查找指定文件或目录

find <dir_path> "<regex>"

Info

find 默认从当前目录递归查找,查找到以后显示文件绝对路径。

查找指令的可运行文件位置

显示的目录表示系统已通过环境变量找到此可运行文件,无法查找 Shell 内建指令。

whereis <command>

也可使用:

which [-a] <command>

比较文件差异

diff <file_path> <file_path_2>

选项

-u 输出有差异位置的上下文;

-w 忽略所有空格;

-b 忽略空格变化;

简易比较文件差异

cmp <file_path> <file_path_2>

选项

-l 显示所有有差异的部分。

Info

当两个文件间有不同时,仅输出第一个不同的位置;

若两个文件没有差异,这两个指令默认不返回任何可见消息。

将文件或目录封装与压缩

tar -cf <target_file_path> <source> [source_2]...
tar -xf <target_file_path> [archive_file_path]...
# 要解压特定的目录或文件,在指定压缩包后依次写入

选项

-c | --create 封装或压缩文件

-x | --extract 解封装或解压缩文件

-f | --file=<target_file_path> 需要(解)封装或(解)压缩的目标文件路径,此选项之后需紧跟目标文件路径

-z | --gzip 使用gzip方法 (.gz)

-j | --bzip2 使用bzip2方法 (.bz)

-J | --xz 使用xz方法 (.xz)

[仅解封装或解压] -C <file_path> 指定解封装或解压后的输出目录

-v | --verbose 运行时输出文件处理状态

-t | --list 仅查看归档内容,不进行解压缩

--exclude <file_path> 排除指定的文件或目录,可用通配符 *

--exclude-from <file> 从文件中取得需要排除文件和目录的列表

Info

  • 创建归档文件与压缩文件时,<source> 中给出的路径会作为构建归档或压缩文件的结构;
  • 单次运行指令仅能使用一种压缩方法;选项 -c-x 互斥且必须包含;-f 必须包含;
  • 解压时,可不指定压缩方法。

压缩文件

  • gzip/gunzip <file_path> [file_path]... 以gzip方法压缩/解压
  • bzip2/bunzip2 <file_path> [file_path]... 以bzip2方法压缩/解压
  • xz/unxz <file_path> [file_path]... 以xz方法压缩/解压

选项

-k | --keep 不删除原文件;

-f | --force 如果文件已存在,覆盖;

-d | --decompress [仅压缩指令] 解压文件;

-1 ... -9 压缩度;数值越高,压缩率越低,压缩后文件越小,压缩与解压缩耗时越久;

-r | --recursive [仅gzip] 递归处理目录下的文件

Info

压缩文件指令仅限对文件进行操作。

检查指定目录是否为挂载点

mountpoint <file_path>

挂载与查看挂载信息

mount <dev_path> <mount_target_path>

选项

-t <file_system> 指定挂载分区的文件系统。

Info

挂载目标路径常位于 /mnt 目录下的一个目录。

卸载

umount <mounted_path>

3.4 访问控制与安全类指令

列出登入用户

who

查看用户及其组ID

id [user_name=${current_user}]

查看过去登入信息

last

添加用户

adduser <user_name>				-- (script) automatically create home dir
useradd <user_name>				-- wont create home dir, no password creation request

选项(仅 adduser

--disabled-login 不调用 passwd 设置密码,用户将不可登录

--disabled-password 不设置密码,但用户可通过 SSH 非对称密钥登录,适用于高安全性要求的用户

--uid <user_id> 手动设定用户的ID,不能已存在

--gid <group_id> 手动指定用户的组ID,该组需存在

--no-create-home 不创建主目录,适用于服务程序

--shell <full_path> 指定登入的Shell,默认为 /bin/bash,要禁用登入,可设置为 /usr/sbin/nologin

--system 创建系统用户,UID常<1000,用于一些服务程序,例如 nginx

选项(仅 useradd

-m 创建用户时创建主目录

Info

  • 添加用户时会要求设置密码;

  • 新增用户默认无 sudo 升权指令。

删除用户

userdel <user_name>

选项

-r | --remove 删除用户的主目录和邮件池

-f | --force 强制删除

--remove-all-files 删除该用户拥有的所有文件

更改当前 Shell 的用户

su [username=root]

Info

使用此指令改变用户实质上是建立一个新子进程,为避免子进程层级过大,在使用后应用 exit 退出。

修改用户密码

passwd [user_name=${current_user}]

修改用户属性

usermod <user_name>

选项

-c | --comment <comment> 修改用户备注信息

-d | --home 修改用户主目录

-m | --move-home 移动主目录,与上一个选项一同使用

-e | --expiredate <(YYYY-MM-DD)> 设置用户过期日期

-l | --login <new_name> 修改用户名

-u | --uid <user_id> 修改用户UID

-g | --gid <group> 修改用户主要组

-G | --groups <sub_group[,sub_group_2]...> 修改并覆盖用户附加组

-a | --append 新增用户的附加组而不是覆盖,需要与上一个选项一同使用

-L | --lock / -U | --unlock 锁定/解锁用户,锁定后账户不能登录,实质上是在 /etc/shadow 的加密密码字段前添加 !

修改用户密钥过期策略

chage <user_name>

选项

-d | --lastday <(YYYY-MM-DD)|(day)> 修改最近密码变更日期;

-E | --expiredate <(YYYY-MM-DD)|(day)> 修改账户过期日期;

-I | --inactive <day> 修改密码过期后的宽限天数;

-m | --mindays <day> 修改密码变更后冷却天数;0 为不限制;

-M | --maxdays <day> 修改密码的过期天数;99999 为永不过期;

-W | --warndays <day> 修改密码过期前的警告开始天数。

修改文件权限

chmod <[0-7]{3}> <path>
chmod <[a]{0,1}[u,g,o]{1,3}[+,-]{1}[r,w,x]{1,3}> <path>

选项

-c | --changes 如果权限已变更,显示

-f | --silent | --quiet 隐藏错误消息

-R | --recursive 递归处理

a -> all *DEFAULT*, u -> user(owner), g -> group, o -> others

修改文件所有者

chown <[user][:group]> <path>

修改文件所有组

chgrp <group> <path>

3.5 网络与远程管理类指令

检查与外部主机的连通性

ping <IP>

选项

-b 若目标地址是广播地址,确认进行广播

网络配置实用工具

ifconfig [net_dev]								-- info browsing
ifconfig <net_dev> <operation>					-- control
ifconfig <net_dev> <IP> netmask <netmask>		-- set network IP
ifconfig <net_dev> broadcast <IP>				-- set broadcast IP
ifconfig <net_dev> hw ether <MAC>				-- set MAC address
ifconfig <net_dev> [-]promisc					-- enable/[disable] Promiscuous Mode

选项 [仅用于显示信息时]

-a 显示全部网卡

-s 以列表形式显示简略信息

操作

add 设置网卡IP;del 删除网卡IP;up 启用网卡;down 停用网卡

Info

首次使用此工具可能需安装 net-tools

新版网络配置实用工具

ip <items> <operation>

选项

-s, -stats, -statistics - 输出更详细的信息

-d, -details - 输出详细信息

-r, -resolve - 使用系统名称解析器打印 DNS 名称

-f, -family - 指定协议族 (inet, inet6, bridge, ipx, dnet, link)

-4 - 等同于 -family inet

-6 - 等同于 -family inet6

-0 - 等同于 -family link

-o, -oneline - 单行输出

-t, -timestamp - 显示当前时间

-b, -batch - 从文件或标准输入读取命令

-rc, -rcvbuf - 设置 netlink 接收缓冲区大小

-n, -netns - 切换到指定网络命名空间

items 可用项目

link - 网络设备

address - 网络协议地址 (IPv4/IPv6)

route - 路由表

neigh - ARP/NDISC 缓存表

netns - 网络命名空间

maddress - 多播地址

mroute - 多播路由缓存

tunnel - IP 隧道

tuntap - 管理 TUN/TAP 设备

xfrm - IPsec 策略

网络连接管理

nmcli [function] [operation]

功能及操作

TIP

以下内容均可缩写。

networking 网络与网络状态→显示NetworkManager是否接管了网络设置

connectivity 检查网络连接:full 已连接、limited 连接但无网络、portal 需认证、none 未连接网络、unknown

on / off 开启/关闭网络

general 通用

status [默认操作] 显示系统网络状态概况

STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          enabled  enabled  enabled  enabled

hostname 显示主机名

[new_host_name] 更改主机名

connection 网络硬件连接状态

show [默认操作] 显示网络硬件连接状态

NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  5892f0a8-cb9e-3321-8259-e5b28b7e09d2  ethernet  ens33

up / down <dev_name> 开启/关闭网络设备

列出当前网络连接

netstat

选项

-a 显示所有连接

-t 只有TCP连接

-u 只有UDP连接

-n 以数字形式显示地址

-l 只有监听中连接

-p 显示进程ID和程序名*[需要root]*

-r 显示路由表(~route -n

-s 网络统计信息

-e 显示额外信息

-c 动态更新

4 权限

类型读 4写 2运行 1
文件读取文件修改文件运行文件
目录列出目录内容创建或移除内容设为工作目录

创建时使用的默认值

创建项目基准权限一般用户root
文件666 rwxrwxrwx664 rw-rw-r--644 rw-r--r--
目录777 rw-rw-rw-775 rwxrwxr-x755 rwxr-xr-x
遮罩值
高位填0代表八进制
-00020022

Info

root 创建的文件或目录,所属组默认不可写;

遮罩值使用指令 umask [number(0~0666(USER),0~0777(ROOT))=null] 进行修改;

实际权限值的计算方法:基准权限 & ~遮罩值;

手动计算的快速方法为:基准权限字串 rwxrwxrwx (目录)或 rw-rw-rw- (文件)减去遮罩权限字串。

图形界面权限标识

❌红叉 - 不可读;🔒锁 - 不可写

5 外部存储系统

Linux将所有外部设备和文件统一到一个目录下进行管理。

5.1 外部存储设备

Linux将设备抽象化为文件,并挂载于 /dev 目录下;在本章只讲述存储设备。

常见的硬盘标识:

  • hd - IDE (ATA)/PATA 硬盘
  • sd - SATA/Flash USB/SCSI/SAS 硬盘
  • fd - 软盘

紧跟硬盘标识的字母是设备序,随后的数字指明该硬盘的分区,没有数字标识的代表设备本身

例如 /dev/sda,表明这个设备是一个固态硬盘,且分得设备序列标识 a;这个设备还将有至少一个分区 /dev/sda1

任何外部存储设备均需挂载以后才可以访问。

现代Linux系统将对接入的外部存储设备自动完成挂载到 /media/<device_name>

5.2 分区

Linux的设备主分区以数字1~4标识,扩展及逻辑分区以5及以上数字标识。

安装Linux时,需设置3个基本分区:

  1. 根分区 /,所有文件访问的入口,在没有其他进一步细分分区的情况下,此分区应该尽可能大。
  2. 启动分区 /boot,存储操作系统引导程序GRUB,系统将从此处启动,一般设置为300MB+,最低不应低于200MB;
  3. 内存交换分区 swap,此分区无挂载点,常设置为内存大小的1倍或2倍;

还可设置其他分区:

  1. [仅UEFI BIOS芯片主板] EFI启动分区 /boot/efi,一般设置为200MB,系统有可能会自动设置其挂载;
  2. 经常更新的文件(如日志文件) /var,一般设置为2GB+,最低应为500MB;
  3. 一般用户主目录 /home,根据需求而定,建议设置为20GB+。

Info

  • 分区在实际使用时互不影响,独占各自存储空间;但在挂载上会呈现层次关系;
  • 交换分区无挂载点,因为内存交换是由操作系统全权管理,对用户是透明的,用户无需访问;
  • 对于根分区,应当进行合适的细分。例如必须分出3个基本分区,而不能只设置一个根分区,避免根分区故障而导致整个系统无法启动及文件损坏。

5.3 文件系统

在设置分区后,常需根据选定的文件系统对每个分区进行格式化以后才可使用。

  • Linux常规文件系统

    ext4,XFS,Btrfs,ZFS

  • Linux虚拟文件系统

    tmpfs (/tmp),proc (/proc),sysfs(/sys),devtmpfs

5.4 挂载

挂载的通常概念是,将外部设备连接到根文件系统下任意一处目录的过程。

Info

静态启动挂载文件位于 /etc/fstabswap 虽然会在启动时挂载,但因其对用户透明,不设挂载点。

一般挂载流程

仅未挂载的设备分区可挂载。

  1. 接入前后使用 ls /dev/${dev_type}* 检查设备及分区; 接入设备,且设备正常识别,设备及其分区将置于 /dev/* 的一个硬盘类型目录下

    # Hard Drive Disk // 机械硬盘
    ls /dev/hd*
    # Solid State Disk // 固态硬盘
    ls /dev/sd*
  2. /mnt 建立空目录;使用 mount 进行挂载;注意,应当挂载设备分区!

    mkdir /mnt/<pick_a_name>
    mount /dev/${dev_part_id} /mnt/<pick_a_name>

    TIP

    如需指定文件系统,使用 -t <file_system>; 对于NTFS,使用 ntfs-3g,将使用FUSE用户文件系统;

  3. 检查挂载状态,挂在后通过 /mnt/<pick_a_name> 访问该设备的文件; 如果输出过多,使用 mount | grep sd? 筛选接入的固态硬盘/Flash USB

    mount | grep sd?				-- 根据分到的设备分区名决定
    # OR
    findmnt | grep sd?
  4. 使用完毕后,卸载;卸载前确保工作目录不在待卸载的目录下

    umount /mnt/<pick_a_name>
    # OR
    umount /dev/${dev_part_id}

WARNING

  • 不应将设备分区挂载到非空目录,挂载到非空目录会使原挂载分区的内容被隐藏;
  • 不要挂载设备,而是挂载设备分区。

自动挂载

现代Linux在接入设备时会自动将设备分区挂载到 /media/${user_name}/${part_name} 目录下;

要手动设置开机时自动挂载,需在 /etc/fstab 中添加待挂载的设备分区信息。

6 常用功能Tips

6.1 查看主机信息

hostnamectl status

6.2 获取 sudo 使用权限

# --- Method 1 (RECOMMENED) ---
# Check if sudo does exist
grep '^sudo' /etc/group
# Add user to sudo groups
usermod --append --groups sudo ${user_name}
 
# --- Method 2 ---
# go to /etc/sudoers, recommend using visudo instead of vim manually, in order to get rid of potential error
sudo visudo
# Regular
${user_name} ALL=(ALL:ALL) ALL
# Directly access sudo without passwd
${username} ALL=(ALL:ALL) NOPASSWD: ALL
# Use only in specified executable(s)
${username} ALL=(ALL:ALL) /usr/bin/apt, /usr/bin/systemctl

7 常见系统与服务程序

  • systemd Linux 系统服务管理器,入口指令为 systemctl
  • service 旧版 Linux 服务管理器
  • sshd SSH 服务程序
  • cron 任务计划程序
  • ufw / firewalld / iptables 防火墙

8 经常需要接触的文件

/etc/passwd					-- user simple info
/etc/shadow					-- storing password after encrypted, permit someone's login by
                                password, add # before a line, login request will be 
                                prohibited
/etc/group					-- 
/etc/sudoers				-- indicates that who can elevate privilege by using sudo
/etc/skel					-- user config files
/home/<user>/.bashrc		-- user shell env-var path
/etc/.profile				-- global shell env-var path

9 简单正则表达式

9.1 通用正则

此处内容适用于所有能够查找字符串的指令。

${char(s)}		-- 匹配具体的字符
*				-- 匹配任意数量的任意字符
?				-- 匹配一个任意字符
!				-- 排除字符(其后的字符必须以括号包含)
[${char(s)}]	-- 匹配方括号内列举的一个字符
	方括号支持的表示方法:
		- 指定的字符:e.g.[abc123]			在a,b,c,d,1,2,3中匹配一个字符(也可使用逗号分隔)
		- 指定的字符范围:e.g.[a-zA-Z]			匹配任何一个字母
		- 排除的字符:e.g.[^a-z]				匹配任何一个非小写字母(此处^可替换为!)
(${char(s)})	-- 匹配圆括号内的完整字符

9.2 用于文本内容查找的正则

此处内容适用于能够查找文本中字符串的指令,例如 grep

^				-- 标记行开始
$				-- 标记行结束

10 文本编辑器 vim

vim <file_path> [go_to_line=1]

编辑模式

  • 普通模式:只读,进入文件后为此状态,此时可输入vim指令;按 Esc 回到此模式;
  • 插入模式,可编辑内容,有3种进入方式,能改变光标位置; i - 光标位置不变;a - 光标后移;o - 光标所在行之下新增空行
  • 选择模式;v - 字符选择模式;Shift+v - 行选择模式;

指令 [仅普通模式可用]

TIP

在指令之后添加 ! 强制运行; 大小写字符的功能不同,例如 G 表示 Shift+g; 在终端内,当前字符是指矩形光标覆盖的字符;若在插入模式,字符会插入矩形光标左侧。

一般指令

指令动作
:w写入修改后的文件(有权限时)
:q退出(未修改文件时)
:wqShift+z *2写入并退出

光标移动与折叠指令

指令光标动作
h j k l左/下/上/右移动
w / b跳到下一个/上一个单词
0 / ^ / $行首/行首字符/行尾
gg / G文件开头/结尾
50G跳转到第 50 行
zo展开光标处折叠内容
zR展开所有
za展开/折叠(折叠时,光标需落在花括号内)
zf建立折叠(需先选区)

快速编辑指令

指令动作
x删除当前字符
dd / D删除当前行/仅删除行可见字符
yy复制当前行
p / P粘贴到光标后/前
u / Ctrl+R撤销/重做
:%s/<old>/<new>/g全局替换文本g,替换确认c

搜索指令

Info

搜索词输入完成后,应按 Enter

动作
/<regex>从光标处/文件头向下搜索
?<regex>从光标处/文件尾向上搜索
n / N转到下一个/上一个匹配
\c[在搜索词中使用] 忽略大小写
:noh / :nohlsearch关闭搜索结果高亮
\* \. \/搜索 * . /

搜索正则

符号说明示例
^行首/^hello
$行尾/world$
.任意单个字符/h.llo
*前一个字符0次或多次/hel*o
\+前一个字符1次或多次/hel\+o
\=前一个字符0次或1次/hel\=o
[]字符集合/[Hh]ello
\s空白字符(空格、制表符)/hello\sworld
\w单词字符(字母、数字)/\w\+

配置

Info

配置条目在 .vimrc 设置,或在普通模式使用 : 开头并输入条目。

内容条目解释
set number(nu) / set nonumber(nonu)显示/隐藏行号
set cursorline / set nocursorline显示/隐藏光标行下划线
set smartcase若搜索词有大写,则匹配大小写
set hlsearch / set nohlsearch启用/禁用搜索结果高亮
set incsearch实时搜索
set autoindent / set noautoindent启用/禁用自动缩进

11 Shell 批处理工具 Bash

Bash是实现更高的自动化并通过指令管理系统的一种工具,Shell脚本将多个指令、条件、运算组合起来以满足多种自动化任务需求;本质上是在终端运行指令的另一种形式。与Windows的 .bat 文件相似。

在Linux,脚本文件的扩展名通常是 .sh.bash

TIP

要在字符串中内嵌指令段,使用反引号括起。反引号位于制表符键之上,需在英文状态时输入。

创建Shell脚本

Shell脚本常以以下内容作为首行,指定Shell解释器路径:

#!/bin/bash

语法体系

WARNING

Bash高度依赖空格区分参数,例如不能使用空格格式化变量赋值行,Bash会将第一段视为指令。

  • 变量

    NAME="Perfect"
    ps -aux | grep $NAME
     
    # 一种特别的变量:位置变量;
    # 来自于运行bash文件之前,置于指令之后的参数。
    # 其以空格分隔,按照输入顺序依次为$0, $1, $2, ...

    以下是一些占位符变量:

    • $PWD 返回当前工作目录;
  • 输入

    read -p "THIS IS PROMPT: " NAME

    要隐藏用户输入,使用选项 -s

  • 条件判断

    if [$NAME -eq 12]; then
    	<command>;
    	...;
    elif [$NAME -gt 24]; then
    	<command>;
    	...;
    fi
    # OR
    if (($NAME = 12)); then
    	<command>;
    	...;
    elif (($NAME > 24)); then
    	<command>;
    	...;
    fi
  • 循环(必须是能被遍历的对象:数值范围、以换行符分隔的文本)

    for i in {1..6}; do
    	<command>;
    	...;
    done
  • 函数

    function() {
    	<command>;
    	...;
    }
  • 行注释

    # YOUR COMMENT

数值比较运算符

-eq 等于;-ne 不等于;-gt 大于;-ge 大于等于;-lt 小于;-le 小于等于。

Info

Bash的数值运算符与Python的类似。

对于数值比较,如果需要使用数学符号,需使用两对圆括号而不是方括号将表达式括起。

字符串比较运算符

字符串比较可以使用数值比较中的等于、不等于、大于、小于号。

以下是单变量比较符:

-z 字符串为空;-n 字符串非空。

关键字 let

使用let可以直接进行数学运算,而不需要在输出时转换字面值;

let关键字不能向变量赋值比较结果

val=10+5
echo "Value + 5 is: $val"			-> "10+5"
echo "Value + 5 is: $[val + 5]"		-> 20
 
let val_2=10+5
echo "Value + 5 is: $val"			-> 15
echo "Value + 5 is: $((val + 5))"	-> 20

隐藏用户输入

stty [-]echo					-- 显示/隐藏全局输入

括号类型

[ ] 一般测试容器,可用于数学运算,字符串比较,其中的任何字符串均需使用双引号,对象间以空格分隔;

[[ ]] Bash测试容器,支持正则;

(( )) 用于数的运算与比较,可直接使用变量名而不需括号和 $ 修饰。

赋值运算

正常的赋值操作,Bash会将其当作字符连接处理,并作为字面值;要输出数学运算结果,需用方括号或两对圆括号括起数对象

若数学运算符连接错误,将报告异常;若存在非数,则自动忽略;若使用不存在的变量,视为0;若条件判断括号使用不正确,此处判断视为false。

score=25+62
bad=12+"R"
$score					-- 输出字面值    -> "25+62"
$[score + 5]			-- 数学运算      -> 92
$((bad + 5))			-- 数学运算      -> 17
$((bad * 5))			-- 数学运算      -> 60
$((ls))					-- 数学运算		 -> 0
((score > 65))			-- 逻辑运算		 -> (TRUE)
[score -le 65]			-- 逻辑运算		 -> (FALSE)
$(ls)					-- 指令处理

文件检查

运算符描述示例
-e文件/目录是否存在if [ -e "/path/file" ]
-f是普通文件if [ -f "/path/file" ]
-d是目录if [ -d "/path/dir" ]
-s文件大小非空if [ -s "/path/file" ]
-r文件可读if [ -r "/path/file" ]
-w文件可写if [ -w "/path/file" ]
-x文件可执行if [ -x "/path/file" ]
-L是符号链接if [ -L "/path/link" ]

调试Shell脚本

bash -n script.sh				-- 仅检查语法
bash -x script.sh				-- 输出指令及运行结果

12 缩写注释

GNU

POSIX

可移植操作系统接口 (Portable Operating System Interface) 的缩写。它是 IEEE 1003 标准,为不同的操作系统确定了一套完整的应用程序接口 (Application Program Interface),例如访问文件、进程管理与通信,甚至是部分Shell指令的统一标准(同一个名称ID、同样的行为),为应用程序在不同操作系统上的移植带来了便利,并且使应用程序在不同操作系统上的行为基本相同。

Unix、Linux和macOS基本都遵循此标准,Windows上的Linux子系统 (Window Subsystem for Linux) 也遵循此标准。