Linux 基础与常用命令

本文合并自:01-Linux基础.md、01-Linux基础命令.md、1-1-Linux基础与命令行使用手册.md、04-Linux常用命令与工具.md

适用系统:CentOS 6 / CentOS 7 / RHEL 6-7 系列(版本差异处已单独标注) 核心场景:Linux 日常操作、终端使用、目录与文件管理、文件内容查看、重定向与管道、系统信息查询


本章要点

  • 认识 Linux 控制台与终端,掌握打开终端、解读命令提示符、中文 locale 设置、字体/颜色/透明度配置、关机重启等基本操作。
  • 理解 Shell 命令的格式、参数(长选项/短选项、选项值)以及内部命令与外部命令的区别。
  • 熟练使用 man、info、--help 查阅帮助。
  • 熟悉 Linux 根文件系统(FHS)下各级目录的作用。
  • 掌握目录命令 pwd、cd、mkdir、rmdir,文件命令 ls、stat、ln、touch、cp、mv、rename、rm。
  • 掌握文件阅读命令 cat、head、tail、less、more。
  • 理解标准输入/输出/错误输出,掌握 >、>>、2>、&>、<、<<、<<< 重定向以及 | 管道。
  • 掌握通配符、大括号展开、引号规则与批量操作技巧,会用 alias / unalias / which 管理命令别名。
  • 掌握系统信息与常用工具:uname、hostname、date、cal、uptime、who、w、id、df、du、free、echo、seq、wc、sort、uniq、cut、tr、diff、clear、bc、read。
  • 掌握 tmux(以及早期的 screen)的会话、窗口、窗格管理与复制粘贴。
  • 了解 /dev/null、/dev/zero、/dev/urandom 等常用设备文件。
  • 学会通过 NFS 简单挂载远程共享目录,便于获取课堂素材。

一、Linux 与终端环境简介

1.1 为什么 Linux 运维围绕命令行

Linux 主要通过命令行进行操作。在 Linux 中,无论是 CPU、内存、磁盘、键盘、鼠标还是用户,几乎所有资源都以文件形式呈现,因此 Linux 的运维本质上是围绕“文件”进行的:查看文件、修改文件、复制移动删除文件、给文件设置权限。

控制台(终端)是以后学习和工作的主要工具,负责接收用户输入的命令并把执行结果反馈给用户。Linux 下的所有操作几乎都可以在终端中通过命令完成。

用户输入的命令由 Shell(命令解析器) 负责解释执行,CentOS 6/7 默认 Shell 均为 Bash:

echo $SHELL
/bin/bash

1.2 打开终端

方式 操作
鼠标方式 在桌面空白处右键,选择“打开终端”/“在终端中打开”
快捷键方式 可自定义设置,如 Ctrl + Alt + T
纯文本模式 系统未安装图形界面时,登录后直接进入命令行

GNOME 默认没有直接打开终端的快捷键,需要手动设置:

  1. 点击屏幕左上角“活动”或右上角菜单,进入 Settings(设置)。
  2. 进入最下方的 Devices(设备) → Keyboard(键盘)。
  3. 拉到最右侧最下方,点击 + 号添加自定义快捷键:
    • Name:Open Terminal
    • Command:/bin/gnome-terminal
    • Shortcut:按下 Ctrl + Alt + T

1.3 登录后的命令提示符

[root@qianyun ~]#
组成部分 含义
root 当前登录用户
qianyun 主机名
~ 当前所在目录(~ 代表当前用户的家目录)
# 当前为 root 用户(普通用户显示为 $)

家目录说明:每个用户都有自己的家目录。root 的家目录是 /root,普通用户的家目录是 /home/用户名。除 root 外,普通用户默认只能进入自己的家目录,除非有权限授权。

用户、组、权限的完整管理(useradd、passwd、chmod、chown 等)详见 阶段02 用户与权限管理。

1.4 把语言环境设置为中文

查看当前语言环境:

locale
LANG=en_US.UTF-8        # 当前为英文环境

查看系统已安装/支持的语言环境(字符集):

sudo locale -a                  # 列出全部字符集
sudo locale -a | grep zh_CN     # 过滤出中文字符集

确认其中是否包含 zh_CN.utf8(简体中文)。如果没有,先安装中文语言包:

sudo yum install kde-l10n-Chinese -y

编辑语言环境配置文件:

  • CentOS 7:配置文件为 /etc/locale.conf

    sudo vim /etc/locale.conf
    # 注释掉原来的英文配置
    #LANG="en_US.UTF-8"
    LANG="zh_CN.UTF-8"
  • CentOS 6:配置文件为 /etc/sysconfig/i18n,写法同样是 LANG="zh_CN.UTF-8"。

重启系统使配置生效:

reboot

重启后若提示“是否更新目录名称为中文”,建议选择“以后不再提示”并保留原来的英文目录名,以避免命令行下中文路径带来的麻烦。

1.5 终端基础使用

操作 快捷键/命令
放大字体 Ctrl + Shift + =
缩小字体 Ctrl + -
新建终端窗口 Ctrl + Shift + N
在终端内新建标签 Ctrl + Shift + T
在标签之间切换 Alt + 1 ~ Alt + 9
清屏 clear 或 Ctrl + L
关闭终端 exit

1.6 终端外观配置

在终端中选择 右键 → 配置文件 → 配置文件首选项,可以设置字体、字号、颜色和透明度:

  • 字体推荐:DejaVu Sans Mono Bold,字号 14。
  • 颜色建议取消“使用系统主题中的颜色”,选择黑底白字。
  • 透明度不建议调得过大,以不影响阅读为准。

1.7 关机和重启

reboot          # 重启
init 6          # 重启(切换运行级别 6)
init 0          # 关机(切换运行级别 0)

init N 切换运行级别的方式在 CentOS 6 与 CentOS 7 上都可用;CentOS 7 已改用 systemd,推荐使用 systemctl reboot / systemctl poweroff,运行级别对应 target。系统启动流程与运行级别详见 阶段05 内核编译与系统启动过程。

1.8 修改命令提示符 PS1

编辑当前用户的 Bash 配置文件:

vim ~/.bashrc

在文件末尾添加:

export PS1='\[\033[01;31m\]root@\[\033[01;33m\]$HOSTNAME\[\033[01;35m\] \w\n\[\033[00m\]$ '

让配置立即生效:

source ~/.bashrc
# 或者
. ~/.bashrc

该 PS1 配置将 root 显示为红色、主机名显示为黄色、当前路径显示为紫色,并在新行输出 $ 提示符。


二、命令行基础

Linux 命令严格区分大小写。

2.1 命令是什么

Linux 命令是对 Linux 系统进行管理的指令。执行命令时,Shell 负责解析命令名、查找对应程序、传递参数并输出结果。

2.2 命令格式

命令名 参数1 参数2 ... 参数n

更常见的写法:

命令名 [选项] [参数]
元素 说明
命令名 要执行的命令,如 ls、cp
选项 以 - 或 -- 开头,用于“修正命令的输出方式”/控制命令行为
参数 多为路径或目标对象,是命令处理的对象

书写规则:

  • 所有英文必须使用半角字符(全角字符光标会占两个位置)。
  • 命令名与选项、选项与参数之间必须有一个以上空格分隔,连续的多个空格会被自动当作一个分隔符处理。
  • 如果参数中包含空格,需要使用单引号或双引号括起来,例如 touch "my file.txt"。

在 man 手册中常见的语法符号:

符号 含义
[] 其中的内容可有可无
... 前面的内容可以有多个(不限个数)
| 多选一
{} 分组

例如 man mv、man ip 中可以看到这些符号的具体使用。

2.3 命令的参数与选项分类

  • 选项:以 - 或 -- 开头,用于控制命令的行为。
    • 长选项:以 -- 开头,后跟单词,可读性高,如 --help、--list。
    • 短选项:以 - 开头,后跟单个字符,便捷性高;多个短选项可以合并,如 -l -a 可以写成 -la。
    • 选项值:
      • 无值选项(单独表示开关):-l / --list
      • 有值选项:-t utf8 / --to=utf8
      • 可选值选项:--color=auto / --color
  • 普通参数:多为路径或文件名,是命令处理的对象。
类型 示例 说明
短选项 -l、-a 单个字符,可组合使用
长选项 --help、--list 可读性强
无值选项 -l 单独表示开关
有值选项 -t utf8 需要附带参数值

2.4 内部命令与外部命令

类型 说明
内部命令 由 Shell 内部代码实现(Shell 内置),如 cd、type、echo
外部命令 Shell 之外的独立可执行文件,如 mount、ls

使用 type 命令可以判断一个命令属于哪一类:

type cd
# cd is a shell builtin        <- 内部命令

type mount
# mount is /usr/bin/mount      <- 外部命令,并显示其位置(CentOS 6 为 /bin/mount)

使用 man type 可以查看 Bash 自带的内部命令清单。

2.5 帮助命令

man(最常用)

man 注重于命令的使用方法,是最常用的帮助方式:

man ls
man mv
man 5 passwd        # 查看配置文件格式说明

手册文件位于 /usr/share/man,并按类别分为 9 节:

节号 内容
1 普通用户命令
2 系统核心调用的函数工具(系统调用)
3 常用函数与函数库
4 设备文件说明
5 配置文件及其他格式文件
6 游戏相关
7 网络协议相关
8 管理员可操作的命令
9 系统内核相关文件

可以指定节号查阅,例如 man 1 ls 查看第 1 节中的 ls。

在 man 中常用操作:

按键 功能
/关键字 向后搜索关键字
n 跳到下一个匹配
N 跳到上一个匹配
空格 向下翻一页
q 退出 man

info

info 注重于对软件/概念的介绍,使用相对较少,文档位于 /usr/share/info:

info            # 进入 info 目录页
info ls         # 直接查看 ls 的 info 文档

在 info 界面中:

按键 功能
? 查看 info 自身帮助
空格键 向下翻一页
Tab 在节点(以 * 标记)之间移动,回车进入节点
b 移动到当前文章第一个节点
e 移动到当前文章最后一个节点
n 前往下一个 info 页
p 前往上一个 info 页
u 向上移动一层
s 或 / 在 info 中搜索
h 显示帮助菜单
q 退出

--help

Shell 内置命令可用 help 命令名 查看,绝大多数外部命令支持 --help 输出简要用法:

ls --help
ll --help
help cd         # 查看 Bash 内置命令 cd 的帮助

说明:man 对内部命令与外部命令都可查阅(内部命令会跳转到 bash 手册的相应段落),而 --help 主要由外部命令自身实现,输出更精简,适合快速回忆选项。


三、Linux 文件系统目录结构(FHS)

Linux 文件系统呈树状结构,根目录 / 是顶级目录,所有目录、文件、设备都挂在这棵树上。CentOS 6 默认文件系统为 EXT4,CentOS 7 默认为 XFS(EXT4 仍然完全支持)。

可以这样理解:根目录相当于整套房子,家目录相当于自己的房间,子目录相当于房间里的衣柜,cd 就是开门进入某个房间。

目录 作用
/ 根目录,系统所有目录的起点
/bin 系统可执行的二进制文件,即普通用户可用的常用命令
/sbin 管理员可执行的二进制文件(管理员命令)
/home 普通用户的家目录
/root 超级管理员 root 的家目录
/boot 系统启动引导目录(内核、引导程序)
/etc 系统配置文件
/dev 设备文件
/var 运行过程中经常变化的数据,如日志、邮件、缓存
/lib、/lib64 系统使用的函数库
/usr 用户安装的软件及其各种目录
/tmp 临时目录,存放程序执行产生的临时文件
/lost+found 分区出现问题时存放遗失片段,仅存在于独立分区(EXT 系文件系统)
/proc 虚拟目录,实时记录当前系统状态(内存中,不占磁盘)
/opt 扩展软件包存放位置
/sys Linux 设备模型文件夹,统一表示和操作设备
/run 运行时数据目录,CentOS 7 自动挂载(CentOS 6 中对应 /var/run)
/media 默认用于挂载光盘、U 盘等可移动介质
/mnt 默认用于临时/手动挂载
/misc 默认用于 autofs 自动挂载目录

CentOS 7 起,/bin、/sbin、/lib、/lib64 均为指向 /usr/bin、/usr/sbin、/usr/lib、/usr/lib64 的软链接;CentOS 6 中它们是独立的真实目录。因此在 CentOS 7 上 type mount 显示 /usr/bin/mount,而 CentOS 6 上显示 /bin/mount。

磁盘分区、挂载、文件系统类型等内容详见 阶段03 磁盘与文件系统管理。


四、路径与目录操作

4.1 绝对路径与相对路径

  • 绝对路径:从根目录 / 开始书写,与当前所在位置无关。

    cd /root/Desktop
    cd /etc/sysconfig/network-scripts/
  • 相对路径:以当前所在目录为起点书写。

    cd root/                              # 进入当前目录下的 root 子目录
    cd sysconfig/network-scripts/         # 当前已在 /etc 下时

特殊路径符号:

符号 含义
. 当前目录
.. 当前目录的父目录(上一级目录)
- 上一次所在的目录
~ 当前登录用户的家目录
~用户名 指定用户的家目录(普通用户受权限限制,一般 root 使用)
/ 根目录

4.2 pwd:显示当前所在目录

pwd
# /root

4.3 cd:切换目录

cd 是 change directory 的缩写,是 Shell 内部命令。

命令 作用
cd 目录名 切换到指定目录(可用绝对路径或相对路径)
cd 不带参数,直接回到当前用户的家目录
cd ~ 返回当前用户的家目录
cd ~用户名 进入指定用户的家目录(仅限 root 或有权限时使用)
cd - 在上一次工作目录和当前目录之间来回切换
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd / 切换到根目录

4.4 mkdir:创建目录

# 在当前目录下创建 test 目录
mkdir test
mkdir ./test

# 一次创建多个目录
mkdir aaa bbb ccc

# 在 /tmp 下创建 test 目录
mkdir /tmp/test

# 回到家目录
cd ~

# 在当前目录下批量创建 file1 ~ file100 共 100 个目录
mkdir file{1..100}

# 创建名为 "file{1..100}" 的单个目录(用引号阻止大括号展开)
mkdir "file{1..100}"

# 递归创建多级目录树 a/b/c(不加 -p 会因中间目录不存在而报错)
mkdir -p a/b/c
选项 作用
-p 递归创建多级目录;目标已存在时也不报错
-v 显示创建过程
-m 创建时直接指定权限,如 mkdir -m 755 dir

提示:原始讲义中出现的 mkdier 为笔误,正确命令是 mkdir。

一次性创建复杂目录树的写法:

mkdir -p test/a/b/c/d/{c,e,v,x,z} test/a/b/c/{h,i,j} test/a/b/g test/a/f

4.5 rmdir:删除空目录

rmdir 只能删除空目录:

rmdir test                # 删除当前目录下的空目录 test
rmdir /tmp/test           # 删除 /tmp 下的空目录 test
rmdir file{1..100}        # 批量删除空目录
rmdir "file{1..100}"      # 删除名为 file{1..100} 的目录
rmdir -p a/b/c            # 递归删除空目录链 c、b、a

目录非空时请使用 rm -r(见下一节)。


五、文件操作

5.1 ls:列出目录内容

ls                # 列出当前目录下的文件和子目录
ls /etc           # 列出指定目录内容
ls -a             # 显示所有文件,包括隐藏文件(以 . 开头)
ls -l             # 以详细列表(长格式)形式显示
ls -l /etc        # 长格式列出指定目录
ls -R             # 递归显示所有子目录内容
ls -al            # 组合使用:所有文件的详细信息
ls -lt            # 按修改时间排序
ls -lh            # 以 KB/MB/GB 等人类可读单位显示大小
ls -ld /etc       # 查看目录本身的详细信息,而不是目录内的内容
ls -i             # 显示 inode 号

常用组合速查:

命令 作用
ls -al 列出所有文件(含隐藏文件)的详细信息
ls -lt 按修改时间排序
ls -lh 以人类可读的单位显示大小
ls -ld 目录名 查看目录本身的详细信息
ll ls -l 的别名(系统预置)

5.2 ls -l 输出字段详解

-rw-r--r--. 1 root root 62486 8月 16 23:10 install.log
drwxr-xr-x  2 root root  4096 8月 18 03:22 jiami
-rwxr-xr-x  1 root root  2062 9月 20 17:30 0_env.txt
-rwxr-xr-x 1 root root 2062 Sep 20 17:30 file.txt
|权限      |链接|用户|组  |大小 |修改时间     |文件名
位置 / 字段 含义
第 1 位 文件类型(见下表)
第 2-10 位 文件权限,共 9 位,分三组(属主/属组/其他),每组 rwx(读、写、执行)
第 11 位的 . 表示该文件带有 SELinux 安全上下文
链接数 硬链接次数;目录的链接数与其子目录数量相关
属主 文件所有者(owner)
属组 文件所属组(group)
大小 文件大小,默认单位为字节
时间戳 最近一次被修改的时间(modify time)
文件名 文件名称

文件类型标识

字符 类型 说明
- 普通文件 一般的文本、二进制文件等
d 目录文件 directory
c 字符设备文件 character,如终端、串口等按字符访问的接口设备
b 块设备文件 block,如硬盘及其分区,一般不手动创建
l 符号链接文件 软链接,指向另一个文件路径
s socket 文件 套接字,用于进程间/网络数据通信
p 命名管道文件 pipe,用于进程之间的通信

权限位的读法与修改(chmod、chown、umask、特殊权限)详见 阶段02 用户与权限管理。

三种时间戳

  • Access(atime):访问时间,读取文件内容时更新。
  • Modify(mtime):修改时间,文件内容发生改变时更新,ls -l 默认显示的就是 mtime。
  • Change(ctime):改变时间,文件元数据(属性)发生改变时更新,如权限、属主、链接数变化。

5.3 stat:查看文件元数据

stat 文件名
File: `1'
Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d   Inode: 4718598     Links: 1
Access: (0644/-rw-r--r--)  Uid: (0/root)   Gid: (0/root)
Access: 2015-07-02 15:32:50.951967259 +0800
Modify: 2015-07-02 15:32:50.951967259 +0800
Change: 2015-07-02 15:32:50.951967259 +0800

关键概念:

  • block(块):操作系统一次 I/O 的最小单位,系统块默认大小为 4096 字节(类似 Windows 的簇)。
  • inode:文件系统给每个文件分配的编号,类似门牌号,保存文件的元数据(权限、属主、大小、数据块位置等),但不保存文件名。

块大小的权衡:

  • 块大:一次 I/O 数据量大,吞吐量大,但小文件的空间浪费多。
  • 块小:空间利用率高,但 I/O 吞吐量小。

inode 耗尽、块大小调整、文件系统格式化参数等内容详见 阶段03 磁盘与文件系统管理。

5.4 链接文件与 ln

硬链接

硬链接不为文件新建 inode,而是为原文件创建一个额外的目录项,与原文件共用同一个 inode。每创建一个硬链接,ls -l 第二列的链接数加 1。只要链接数不为 0,文件数据就不会被真正删除。

限制:

  • 不能对目录创建硬链接。
  • 不能跨文件系统(跨分区)创建硬链接。

软链接(符号链接)

软链接类似 Windows 的快捷方式,是一个独立的新文件,拥有自己的 inode,其内容指向源文件的路径。删除软链接不影响源文件;删除源文件后软链接会失效(变为“断链”),但如果在同路径重建同名文件,软链接会自动恢复指向。

lrwxrwxrwx 1 root root 7 9月 28 10:02 234 -> 234.txt

创建链接:ln

ln [选项] 源文件 [目标文件]
命令 作用
ln /test/1.txt /1 创建硬链接
ln -s /test/1.txt /1 创建软链接(-s 表示 symbolic)
ln -s 源文件 链接文件 软链接,指向文件系统中的路径
ln 源文件 链接文件 硬链接,指向硬盘上的同一 inode

示例:

vim test.txt
ln -s test.txt test_link    # 为 test.txt 创建软链接
ls -l test_link             # 观察 l 类型与 -> 指向

5.5 touch:创建文件或更新时间戳

touch file                  # file 不存在则创建空文件;存在则更新存取/修改时间,不覆盖内容
touch 1                     # 创建名为 1 的空文件
touch -c file               # 仅在 file 存在时更新时间,不存在则不创建
touch -r file1 file         # 让 file 的时间与 file1 相同
touch -a file               # 仅更新存取时间(atime)
touch -m file               # 仅更新修改时间(mtime)
touch -t 202601011200 file  # 指定时间戳(格式 YYYYMMDDhhmm)
touch 2 3 4 5               # 一次创建多个文件
touch file2 file3 file4     # 同时创建多个文件
touch file{2,3,4}           # 同上,使用大括号展开
touch "file{2,3,4}"         # 创建名为 file{2,3,4} 的单个文件
touch {1..10}               # 创建 1~10 共 10 个文件
touch {1..100}.php          # 创建 100 个 .php 文件

5.6 cp:复制文件或目录

cp 源文件 目标位置          # 拷贝文件
cp file dirs                # 把 file 复制到 dirs 目录下
cp 1 1.txt                  # 拷贝的同时重命名
cp -r 源目录 目标位置       # 拷贝目录必须加 -r(递归)
cp -r dir1 dir2             # 把目录 dir1 递归复制到 dir2
cp -a file dir2             # 复制时保留文件原属性(归档模式)
cp -rf file dir2            # 强制复制,不提示
cp -rvf dir1 dir2           # 递归复制并显示复制过程
cp -u dir1/* dir2/          # 仅复制更新过的文件

常用选项:

选项 作用
-r / -R 递归复制目录
-i 覆盖前提示确认(系统默认别名中常被启用)
-u 仅当源文件比目标文件新时才复制(update)
-v 显示复制过程
-t 指定目标路径,适合一次复制多个文件
-f 强制覆盖,不提示
-a 归档模式,保留权限、时间戳、属主等属性,等同于 -dR --preserve=all
-p 保留权限、时间戳等属性
-d 复制软链接本身而不是其指向的文件

5.7 mv:移动或重命名

mv 源文件 目标位置          # 移动文件
mv file dirs/               # 把 file 移动到 dirs 目录下
mv abc /tmp/                # 移动目录(不需要 -r)
mv file file2               # 将 file 重命名为 file2
mv 1 2                      # 重命名(同目录下移动即重命名)
mv -u dir1/* dir2/          # 仅在源文件比目标文件新时才移动
mv -i file dir/             # 覆盖前提示
mv -f file dir/             # 强制覆盖

mv 在同一文件系统内只修改目录项,不搬运数据,因此移动大目录非常快;跨文件系统移动则等价于“复制 + 删除”。

5.8 rename:批量重命名

rename .conf .html *.conf
rename .txt .php *.txt

三个参数依次为:原字符串、新字符串、要处理的文件匹配规则。例如 rename .txt .php *.txt 会把当前目录下所有 .txt 文件的后缀替换为 .php。

需要注意:

  • 只作用于当前目录下的文件名(匹配规则由 Shell 通配符展开)。
  • 一个文件名中如果出现多个待替换串,命令每执行一次只会替换其中第一个,因此多执行几次会逐段替换。

5.9 rm:删除文件或目录

rm 文件名             # 删除文件(系统默认别名 rm -i,会提示确认)
rm -i file            # 删除前提示确认
rm -f file            # 强制删除,不提示
rm -r dir             # 递归删除目录
rm -rf 目录名         # 强制递归删除目录(危险!)
rm file* -rf          # 强制递归删除所有 file 开头的文件/目录
rm *.txt              # 删除所有 .txt 结尾的文件
rm -rfv dir           # 递归、强制并显示删除过程

常用参数组合为 -rfv:递归、强制、显示过程。

警告:rm -rf 是高危命令。滥用可能导致系统关键目录被删、系统无法开机。使用前务必确认目标路径没有写错,尤其注意不要在路径中误加空格(如 rm -rf / tmp 与 rm -rf /tmp 后果完全不同)。

5.10 文件操作速查

任务 命令
创建文件 touch file
创建目录 mkdir -p dir
复制 cp -r src dst
移动/重命名 mv old new
删除文件 rm file
删除目录 rm -rf dir
查看内容 cat file
实时看日志 tail -f file
查找文件内容 grep keyword file
按条件查找文件 find /path -name "*.log"

grep、sed、awk、find 的完整用法详见 06-02-文本处理与文件查找.md。 tar、gzip、zip 等压缩与归档命令详见 阶段05 进程管理与压缩归档。


六、文件内容查看

命令 说明 示例
cat 一次性输出整个文件内容 cat /etc/passwd
head 查看文件开头前 N 行/字符 head -n 30 /etc/passwd
tail 查看文件末尾后 N 行/字符,可实时跟踪 tail -f /var/log/messages
more 分屏查看(主要向下) more /etc/passwd
less 分屏查看,支持上下翻页 less /etc/passwd

6.1 cat:一次性输出整个文件

cat /etc/passwd              # 查看文件内容
cat /etc/hosts
cat -n /etc/passwd           # 显示行号(包括空行)
cat -b /etc/passwd           # 仅给非空行编号
cat -s /etc/passwd           # 将多个连续(相邻)空行合并成一个空行
cat -A /etc/passwd           # 显示所有不可见字符(制表符、行尾 $)
cat file1 file2 > file3      # 合并多个文件到 file3

cat 适合查看短文件;文件很长时会瞬间刷屏,应改用 less、head 或 tail。

6.2 head:查看文件开头

head /etc/passwd             # 默认查看前 10 行
head -5 /etc/passwd          # 显示前 5 行(简写形式)
head -n 20 /etc/passwd       # 查看前 20 行
head -n 30 /etc/passwd       # 查看前 30 行
head -c 30 /etc/passwd       # 查看前 30 个字符
head -n 1 /etc/issue         # 查看操作系统版本信息(第一行)

6.3 tail:查看文件末尾

tail /etc/passwd             # 默认查看后 10 行
tail -5 /etc/passwd          # 显示最后 5 行
tail -n 30 /etc/passwd       # 查看后 30 行
tail -c 30 /etc/passwd       # 查看后 30 个字符
tail -f /var/log/messages    # 实时跟踪文件内容变化(常用于监控日志)
tail -f 1_passwd             # 实时跟踪指定文件
tail -n +10 /etc/passwd      # 从第 10 行开始显示到文件末尾

tail -f 实验:开两个终端,一个执行 tail -f 1.txt,另一个执行 echo hello >> 1.txt,第一个终端会实时显示新增内容。按 Ctrl + C 结束跟踪。

6.4 more:分屏查看(只能向下)

more /etc/passwd
more -10 /etc/passwd         # 每屏显示 10 行
more -dc /etc/passwd         # 显示前先清屏,并在底部显示详细提示

操作按键:

按键 作用
Space 下一页
Enter 下一行
b 上一页
h 帮助
q 退出

6.5 less:分屏查看(可上下翻页,推荐)

less 可以上下自由滚动,比 more 更灵活,是 man 手册所使用的分页器:

less /etc/passwd             # 查看文件
less -N /etc/passwd          # 显示行号
less -m /etc/passwd          # 显示类似 more 的百分比进度
按键 作用
PageUp / PageDown 上下翻页
空格 下一页
↑ / ↓ 上下滚动一行
/关键字 向后搜索,n / N 切换匹配
g / G 跳到文件开头 / 结尾
q 退出

七、输入输出重定向与管道

7.1 三个标准流

名称 文件描述符 默认设备
标准输入(stdin) 0 键盘
标准输出(stdout) 1 屏幕
错误输出(stderr) 2 屏幕

7.2 输出重定向

# 标准正确输出重定向到 output.txt(覆盖写)
ls -hl /etc/passwd > output.txt
ls /etc/passwd > output.txt

# 标准正确输出追加重定向到 output.txt
ls -hl /etc/passwd >> output.txt

# 标准错误输出重定向到 error.txt
ls -hl ddd 2> error.txt
cat nofile 2> error.txt

# 标准错误输出重定向到黑洞设备(丢弃)
ls -hl dddd 2> /dev/null
cat nofile 2> /dev/null

# 标准正确输出和错误输出全部重定向到黑洞
ls ddddd /etc/passwd &> /dev/null

# 分别重定向正确输出与错误输出
ls ddddd /etc/passwd > ok.txt 2> err.txt

# 将错误输出合并到标准输出所在位置
ls ddddd /etc/passwd > all.txt 2>&1

> 与 >> 的区别:

符号 作用
> 输出重定向,先清空文件再写入
>> 追加输出重定向,从文件最后一个有效字符的下一行开始拼接

实用技巧:在不打开、不删除、不创建同名文件的前提下清空一个普通文件:

> file          # 直接把空内容重定向进去
: > file        # 等效写法

7.3 输入重定向

< 将文件内容作为命令的标准输入:

wc -l < /etc/passwd          # 把 /etc/passwd 作为 wc -l 的输入源

<< 称为 Here-document(此处文档),后面跟结束标识符,将两个标识符之间的内容作为标准输入:

wc -l << EOF
hello world
hello linux
bye
EOF

注意事项:

  • 第一个标识符与 << 之间建议留一个空格(可不留,但为可读性建议加上)。
  • 第二个标识符必须单独占一行,行首不能有任何有效字符,行尾也不能有任何有效字符(换行符除外)。

<<< 称为 Here-string(此处字符串),将后面的字符串作为命令的标准输入:

cat <<< "hello world"
wc -l <<< "hello world"

# 多行字符串需要用引号括起来
wc -l <<< "hello world
hello linux
hello shell
"

<<< 与 << 的不同在于:Here-string 的结束引号一旦出现就结束输入,不像 Here-document 要求结束符单独成行。

7.4 管道

管道使用 | 连接多个命令,将前一个命令的标准输出作为后一个命令的标准输入:

cat /etc/passwd | less
cat /etc/passwd | wc -l
ls -l /etc | head -20

一般格式:

命令1 | 命令2 | 命令3 ... | 命令n

多重管道能持续工作的前提是:每个命令既能从标准输入读取,又能向标准输出写出,输入和输出不能中断。

管道只传递标准输出。若要把错误输出也送入管道,使用 命令 2>&1 | 命令2 或 命令 |& 命令2(Bash 4+)。


八、通配符、大括号展开与引号

8.1 通配符

通配符由 Shell 负责展开,展开后的结果才交给命令执行。

通配符 含义
* 匹配 0 个或多个任意字符
? 匹配单个任意字符
[a-z] 匹配范围内的单个小写字母
[0-9] 匹配单个数字
[abc] 匹配 a、b、c 中的任意一个字符
[^abc] 匹配除 a、b、c 之外的任意单个字符
cp *.txt /test/              # 复制当前目录下所有 .txt 文件到 /test/
ls file?                     # 匹配 file1、fileA 等(? 只代表一个字符)
rm *.txt                     # 删除所有 .txt 文件
ls [0-9]*                    # 列出以数字开头的文件

8.2 大括号展开与批量操作

touch {a..z}.txt             # 批量创建 a.txt ~ z.txt
touch {1..5}{a..z}           # 批量创建组合文件名(1a、1b ... 5z)
mkdir file{1..100}           # 批量创建 100 个目录
touch file{2,3,4}            # 创建 file2、file3、file4
echo {1..10}                 # 1 2 3 4 5 6 7 8 9 10
echo {10..1}                 # 倒序
echo {a..z}                  # a 到 z
echo {1..10..2}              # 步长为 2:1 3 5 7 9

大括号展开中,{1..10} 的两个点是固定写法;{1..10..2} 最后的 ..2 表示步长。大括号展开不要求文件存在,而通配符只能匹配已存在的文件,这是两者的本质区别。

8.3 引号规则

写法 作用
"双引号" 弱引用:保留大部分字面含义,但仍会解析 $变量、反引号命令替换与 \ 转义
'单引号' 强引用:内部所有字符都是字面量,不做任何解析
`命令` 或 $(命令) 命令替换:把命令的输出作为字符串使用
\字符 转义单个字符
echo "$HOME"                 # 输出 /root(变量被解析)
echo '$HOME'                 # 输出 $HOME(原样输出)
mkdir "file{1..100}"         # 引号阻止大括号展开,创建单个目录
touch "my file.txt"          # 文件名含空格时必须加引号
echo "今天是 $(date +%F)"    # 命令替换

8.4 seq:生成数字序列

seq 1 10                     # 1 到 10,每行一个
seq 10                       # 等价于 seq 1 10
seq -s ":" 1 10              # 用冒号分隔:1:2:3:...:10
seq -w -s ":" 1 2 100        # 等宽(补零)+ 步长 2
seq 1 2 10                   # 从 1 开始,步长 2,到 10(1 3 5 7 9)
选项 作用
-s 指定分隔符
-w 等宽显示,位数对齐(补零)

8.5 命令别名与命令定位

which / whereis:查看命令路径与别名

which ls
# alias ls='ls --color=auto'
# /bin/ls

which ll
whereis ls                   # 显示命令的二进制、源码、手册页位置

alias / unalias:查看与设置别名

alias                        # 查看当前所有别名
alias c='clear'              # 定义别名
alias dir='dir --color=auto'
unalias c                    # 取消别名
\ls                          # 在命令前加 \ 可临时绕过别名,执行原命令

系统默认的安全别名(root 用户定义在 /root/.bashrc):

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

-i 表示交互确认,防止误操作。

检查别名是否已被占用

想给某条命令起别名前,先在终端直接敲这个名字,如果提示 command not found,说明该名字可用:

drm
# -bash: drm: command not found

别名的生效范围

  • 直接在终端用 alias 定义:临时有效,关闭终端后失效。
  • 写入配置文件:永久有效。

永久生效的方法:

vim ~/.bashrc
# 在文件中加入:
alias c='clear'
alias dir='dir --color=auto'

source ~/.bashrc             # 让配置立即生效
# 或
. ~/.bashrc

Bash 配置文件的加载顺序(/etc/profile、~/.bash_profile、~/.bashrc)与环境变量设置详见 阶段02 服务管理与 Shell 环境。


九、系统信息查询

9.1 uname / hostname:内核与主机信息

uname -a                     # 显示内核版本、主机名、硬件架构等全部信息
uname -r                     # 只显示内核版本
uname -m                     # 显示硬件架构(如 x86_64)
uname -s                     # 显示内核名称(Linux)
hostname                     # 查看计算机名(主机名)

查看发行版版本:

cat /etc/redhat-release      # 显示 CentOS/RHEL 发行版版本
head -n 1 /etc/issue         # 查看操作系统版本
cat /etc/os-release          # CentOS 7 提供的标准发行版信息文件

版本差异:修改主机名在 CentOS 6 中编辑 /etc/sysconfig/network 的 HOSTNAME= 并重启生效;在 CentOS 7 中使用 hostnamectl set-hostname 新主机名(配置文件为 /etc/hostname),立即生效。网络配置详见 阶段07 网络配置与远程管理。

9.2 硬件与内核模块信息

命令 说明
cat /proc/cpuinfo 查看 CPU 信息
lspci -tv 以树形列出所有 PCI 设备
lsusb -tv 以树形列出所有 USB 设备
lsmod 列出已加载的内核模块
env 查看环境变量
dmesg \| grep IDE 查看启动时 IDE 设备检测状况

9.3 date:显示或设置系统时间

date
# 2017年 02月 20日 星期一 17:14:04 CST

常用格式化符号:

符号 含义
%Y 完整年份(0000-9999)
%m 月份(01-12)
%d 日(01-31)
%H 小时(00-23)
%M 分钟(00-59)
%S 秒(00-60)
%F 完整日期,等价于 %Y-%m-%d
%T 直接显示时间(24 小时制,等价于 %H:%M:%S)
%s 从 1970-01-01 00:00:00 UTC 到现在的秒数(时间戳)

格式化输出:

date "+%Y-%m-%d %H:%M:%S"
date +"%Y"                    # 年
date +"%m"                    # 月
date +"%d"                    # 日
date +"%F"                    # 年-月-日
date +%T                      # 时:分:秒

时间运算(-d 选项):

date "+%Y-%m-%d %H:%M:%S" -d "-3 year"   # 三年前
date "+%Y-%m-%d %H:%M:%S" -d "+3 month"  # 三个月后
date -d "2026-01-01 +10 day"             # 指定日期后 10 天
date -d "yesterday" +%F                  # 昨天的日期

设置系统时间(-s 选项,需 root):

date -s "20100809 10:10:10"
date -s "2010-08-09 10:10:10"
date -s "2010/08/09 10:10:10"
date -s "2026-01-01 12:00:00"
date -s "2024-01-01 12:00"

时间同步(NTP / chrony)与硬件时钟 hwclock 详见 阶段08 时间同步与超级守护进程。

9.4 cal:显示日历

cal              # 显示当月日历
cal 9 2017       # 显示指定年月的日历
cal -y 2013      # 显示指定年份的全年日历
cal -j           # 显示当年第几天(从 1 月 1 日起算的儒略日)

9.5 登录用户与运行状态

命令 作用
whoami 显示当前登录用户名
who 显示当前系统登录信息(用户、终端、登录时间)
who am i 显示当前终端的详细信息
w 显示比 who 更详细的登录信息(含负载、用户正在执行的命令)
users 仅显示登录用户名列表(who 的第一列)
id 显示当前用户的 UID、GID 与所属组
id <用户名> 查看指定用户的 UID/GID 信息
last 查看用户登录日志(历史登录记录)
lastlog 查看每个用户最后一次登录时间
tty 显示当前终端设备(如 /dev/pts/0)
uptime 显示系统当前时间、运行时长、登录用户数和平均负载
cat /proc/loadavg 直接查看系统负载原始数据
top 动态查看系统负载与进程状态(CPU、内存、Swap 等)
ps -ef 查看所有进程

uptime 输出中的三个负载值分别代表最近 1 分钟、5 分钟、15 分钟的平均负载。

uptime
w
who
id root
last | head

进程状态详解、top 各字段含义、kill 信号、计划任务等内容详见 阶段04 进程与任务管理。 用户账号的创建与密码策略(useradd、usermod、passwd -l 等)详见 阶段02 用户与权限管理。

9.6 passwd:修改密码

passwd           # 修改当前用户密码
passwd abc       # root 修改 abc 用户的密码(仅 root 可指定用户名)

普通用户改密码的限制:

  1. 必须先输入旧密码。
  2. 密码复杂度要求严格,过于简单会被拒绝。

root 用户改密码不受长度和复杂度限制(仅会给出警告提示)。

完整的用户与口令管理详见 阶段02 用户与权限管理。

9.7 查看系统所有用户与组

cut -d: -f1 /etc/passwd      # 查看系统所有用户
cut -d: -f1 /etc/group       # 查看系统所有组
crontab -l                   # 查看当前用户的计划任务

十、常用工具(下半)

10.1 df:查看磁盘分区使用情况

df -h                        # 以人类可读单位查看各分区使用情况(最常用)
df -T                        # 同时显示文件系统类型
df -i                        # 查看 inode 使用情况
df -h /                      # 只看根分区

10.2 du:查看目录/文件占用空间

du -sh <目录名>              # 查看指定目录的总大小(summarize + human-readable)
du -sh *                     # 查看当前目录下每个子项的大小
du -h --max-depth=1 /var     # 只统计到第一层子目录
du -sh /var/log              # 查看日志目录占用
选项 作用
-s 只显示总计,不逐个列出子目录
-h 人类可读单位
--max-depth=N 限制统计深度

df 统计的是文件系统层面的已用/可用空间,du 统计的是文件实际占用的空间;删除了文件但进程仍持有句柄时,两者结果会出现差异。磁盘管理详见 阶段03 磁盘与文件系统管理。

10.3 free:查看内存与交换分区

free -m                      # 以 MB 为单位查看内存和交换区使用量
free -h                      # 以人类可读单位显示
free -g                      # 以 GB 为单位
grep MemTotal /proc/meminfo  # 查看内存总量
grep MemFree /proc/meminfo   # 查看空闲内存量

版本差异:CentOS 6 的 free 输出中有单独的 -/+ buffers/cache 行,需要用“已用 - 缓存”来估算真实占用;CentOS 7 的 free 直接提供 available 列,更准确地反映可用内存。

10.4 磁盘和分区相关速查

命令 说明
mount \| column -t 以表格对齐方式查看已挂接的分区状态
fdisk -l 查看所有分区
swapon -s 查看所有交换分区
hdparm -i /dev/hda 查看磁盘参数(仅适用于 IDE 设备)

详见 阶段03 磁盘与文件系统管理。

10.5 echo:输出内容

echo 123                     # 输出 123
echo "hello world"
echo -e "hello\nworld\n"     # -e 解释转义字符(如 \n 换行、\t 制表符)
echo -n "hello world"        # -n 取消末尾自动换行
echo "$HOME"                 # 输出变量值
echo hello >> 1.txt          # 配合追加重定向写文件
echo {1..10}                 # 配合大括号展开输出序列

10.6 read:读取用户输入

read                         # 不指定变量时,输入存入内置变量 REPLY
echo $REPLY

read v                       # 将输入存入变量 v
echo "$v"

read -p "请输入名称:" name   # -p 显示提示信息
read -s pass                 # -s 静默输入(不回显,适合输入密码)
read -t 5 v                  # -t 超时秒数

read 常用于 Shell 脚本中与用户交互,详见 阶段05 Shell 脚本编程。

10.7 wc:统计行数、单词数、字节数

wc /etc/passwd               # 依次输出 行数 单词数 字节数 文件名
wc -l /etc/passwd            # 只统计行数(最常用)
wc -w /etc/passwd            # 统计单词数
wc -c /etc/passwd            # 统计字节数
wc -L /etc/passwd            # 显示最长行的长度
cat /etc/passwd | wc -l      # 配合管道统计
wc -l < /etc/passwd          # 配合输入重定向(输出不带文件名)

10.8 sort:排序

sort file                    # 按字典序升序排序
sort -r file                 # 逆序
sort -n file                 # 按数值大小排序
sort -u file                 # 排序并去除重复行
sort -k 2 file               # 按第 2 列排序
sort -t: -k 3 -n /etc/passwd # 以 : 为分隔符,按第 3 列(UID)数值排序

10.9 uniq:去除相邻重复行

sort file | uniq             # 先排序再去重(uniq 只能处理相邻重复行)
sort file | uniq -c          # 统计每行出现的次数
sort file | uniq -d          # 只显示重复的行
sort file | uniq -u          # 只显示不重复的行

10.10 cut:按列截取

cut -d: -f1 /etc/passwd      # 以 : 为分隔符取第 1 列(用户名)
cut -d: -f1,3 /etc/passwd    # 同时取第 1、3 列
cut -c1-5 /etc/passwd        # 按字符位置截取第 1~5 个字符
选项 作用
-d 指定字段分隔符(默认制表符)
-f 指定要取的字段序号
-c 按字符位置截取

10.11 tr:字符替换与删除

echo "hello" | tr 'a-z' 'A-Z'      # 小写转大写
cat file | tr -d ' '               # 删除所有空格
cat file | tr -s ' '               # 压缩连续重复的空格为一个
echo "hello" | tr 'l' 'L'          # 把字符 l 替换为 L

10.12 diff:比较文件差异

diff file1 file2             # 逐行比较两个文件的差异
diff -u file1 file2          # 统一格式(unified)输出,常用于生成补丁
diff -r dir1 dir2            # 递归比较两个目录
diff -y file1 file2          # 并排显示差异

10.13 bc:命令行计算器

bc                                  # 进入交互模式,quit 退出
bc <<< "(5+4)/3"                    # 基本运算(整数运算会截断小数)
bc <<< "scale=3;10/3"               # scale 指定小数位数
bc <<< "ibase=2;101"                # 把二进制 101 转为十进制
bc <<< "ibase=2;obase=16;1010"      # 二进制转十六进制
echo "3*4" | bc                     # 配合管道使用

10.14 clear:清屏

clear            # 清屏,或直接按 Ctrl + L

10.15 openssl:加密工具

openssl 是一个功能强大的加密工具集,可用于生成密钥、证书、计算摘要、加解密等:

openssl rand -base64 12             # 生成 12 字节的随机密码
openssl passwd -1 "123456"          # 生成 MD5 格式的加密口令

HTTPS 证书生成、SSL 配置等实际应用详见 阶段10 Web 服务与架构(Nginx HTTPS 配置)。

10.16 常用设备文件

设备文件 作用
/dev/null 空洞(黑洞)文件,写入的任何数据都会被丢弃,常用于丢弃不需要的输出
/dev/zero 读取时无限提供零字节,常用于生成指定大小的空文件(配合 dd)
/dev/urandom 读取时无限提供随机二进制数据,常用于生成随机密钥/密码
ls dddd 2> /dev/null                             # 丢弃错误输出
dd if=/dev/zero of=/tmp/bigfile bs=1M count=100  # 生成 100MB 的文件
head -c 16 /dev/urandom | base64                 # 生成随机字符串

十一、终端复用:screen 与 tmux

终端复用工具解决的核心问题是:SSH 连接断开后,正在运行的任务会随终端一起被终止。使用终端复用工具后,会话中的程序仍可继续运行,重连后能还原上次的操作界面。

11.1 screen(早期常用)

screen 是较早期的终端复用工具,在老系统上更常见:

yum install screen -y
screen                       # 创建新会话
screen -S mysession          # 创建并命名会话
screen -ls                   # 列出所有会话
screen -r mysession          # 重新连接(恢复)会话
Ctrl + a d                   # 分离当前会话(detach)
exit                         # 关闭当前会话窗口

screen 的前缀键是 Ctrl + a。功能上 tmux 是它的现代替代品,配置更灵活、分屏更方便,推荐优先学习 tmux。

11.2 tmux 安装与配置

tmux 是一个开源的终端管理工具,可以在一个终端中管理多个会话(session)、窗口(window) 和 窗格(pane)。

sudo yum install tmux -y

用户配置文件位于 ~/.tmux.conf。课程中可从 NFS 共享目录拷贝预配置:

sudo mount 192.168.0.89:/soul /mnt
cd /mnt/software
cp tmux.conf ~/.tmux.conf

tmux 的前缀键默认为 Ctrl + b,下文统一记作 Prefix。

11.3 会话管理

会话用于解决“连接断开后任务丢失”的问题。

操作 命令/快捷键
创建会话 tmux 或 tmux new-session -s 会话名称(简写 tmux new -s name)
查看会话列表 tmux list-session(简写 tmux ls)
分离(挂起)会话 Prefix d 或 Prefix D(即 Ctrl + b d)
唤醒(附加)会话 tmux attach -t 会话名称
选择会话 Prefix s,用上下键选择后回车
关闭会话 退出会话内所有终端,或 tmux kill-session -t 会话名称
重命名会话 Prefix $

11.4 窗口

一个会话中至少包含一个窗口(以标签形式显示在状态栏)。

操作 快捷键/命令
创建窗口 Prefix c
关闭窗口 退出该窗口的 bash,或 Prefix &
列出窗口 Prefix w
选择窗口 Prefix 0、Prefix 1 ... Prefix 9
配置后快速切换 Alt + 1 ~ Alt + 9

11.5 窗格(分屏)

一个窗口中可以划分多个窗格。

操作 快捷键
竖向分屏 Prefix + |
横向分屏 Prefix -
关闭当前窗格 Prefix x
在窗格间切换 Prefix h / j / k / l

上述 |、-、hjkl 的绑定来自下文的自定义配置;tmux 默认绑定为 Prefix "(横分屏)、Prefix %(竖分屏)和 Prefix + 方向键切换。

11.6 滚动与复制粘贴

tmux 自带复制模式,需要 xclip 工具与系统剪贴板交互:

sudo yum install xclip -y
操作 快捷键
进入复制模式 Prefix y(自定义绑定;默认为 Prefix [)
选取 v(按字符)或 V(按行)
复制 y(复制并退出复制模式)
粘贴 Prefix p

操作流程示例:

ip a s
Prefix y        # 进入 vi 风格的复制模式
V               # 按行选取
y               # 复制到系统剪贴板
Prefix p        # 粘贴

11.7 tmux 配置示例

以下是一份常用的 ~/.tmux.conf 配置,主要涵盖:

  • 状态栏位置、配色与窗口列表样式;
  • 消息栏与命令行配色;
  • 窗口自动重命名、关闭后自动重新编号;
  • 拷贝模式使用 vi 风格按键,并通过 xclip 与系统剪贴板互通;
  • 使用 | 和 - 进行水平 / 垂直分屏,使用 hjkl 切换窗格;
  • Alt + 0~9 快速切换窗口;
  • 前缀键 + r 重新加载配置。

配置中前缀键(默认 Ctrl+b)的更换以及鼠标支持等选项以注释形式保留,可按需取消注释启用。

# 解绑 Ctrl+b 快捷键
# unbind C-b

# 更换前缀快捷键为 Ctrl+a
# set -g prefix C-a

# Tmux 会话选项
set -g status-keys vi

# 开启鼠标模式
# set -g mode-mouse on
# set -g monitor-activity on
# set -g xterm-keys on

# 设置默认终端配色
# set -g default-terminal "screen-256color"

# 自动重命名窗口名字
set -g automatic-rename on

# 关闭窗口后自动重新分配 ID
set -g renumber-windows on

# 开启鼠标点击选择窗格
# set -g mouse-select-pane on
# 开启鼠标点击选择窗口
# set -g mouse-select-window on
# 开启鼠标调节窗格大小
# set -g mouse-resize-pane on

# 美化窗格栏
# set -g pane-active-border-bg    none
# set -g pane-active-border-fg    red
# set -g display-panes-active-colour red

# 美化信息栏
set -g message-bg blue
set -g message-fg white

# 美化命令行
set -g message-command-bg cyan
set -g message-command-fg white

# black blue red green yellow white cyan magenta

# 美化标题栏
# set -g status on
set -g status-position top
set -g status-fg black
set -g status-bg white
set -g status-justify centre
# set -g status-justify left
set -g status-left '#[fg=black,bold][#S]'
# set -g status-left-length 20
set -g status-right '#[fg=black,bold][%Y-%m-%d %H:%M]'
set -g window-status-format ' #[fg=black,bold]#I:#W '
set -g window-status-current-format ' #[fg=white,bold]* #I:#W *#[fg=black] '
set -g window-status-fg black
set -g window-status-bg white
set -g window-status-current-fg white
set -g window-status-current-bg black

# 每当修改 tmux.conf 后,按前缀键 + r 重新加载配置立即生效
bind-key r source-file ~/.tmux.conf \; display-message "Config Reloaded."

# 拷贝模式按键重定义
set -g mode-keys vi
# 定义前缀键 + y 进入拷贝模式
bind-key y copy-mode
# 定义使用 v 进行选取
bind-key -t vi-copy v begin-selection
# 定义使用 y 复制并加入到系统剪贴板
bind-key -t vi-copy y copy-pipe "xclip -i -sel clip > /dev/null"
# 定义前缀键 + p 粘贴
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

# 重定义分隔窗格快捷键
unbind '"'
unbind %
bind-key | split-window -h
bind-key - split-window -v

# 重定义选择窗格快捷键(使用 hjkl 风格)
bind k selectp  -U
bind j selectp  -D
bind h selectp  -L
bind l selectp  -R

# 重定义新建窗口快捷键
# bind-key -n C-T new-window

# 重定义窗口选择快捷键为 Alt + 0~9
bind-key -n M-1 select-window -t :0
bind-key -n M-2 select-window -t :1
bind-key -n M-3 select-window -t :2
bind-key -n M-4 select-window -t :3
bind-key -n M-5 select-window -t :4
bind-key -n M-6 select-window -t :5
bind-key -n M-7 select-window -t :6
bind-key -n M-8 select-window -t :7
bind-key -n M-9 select-window -t :8
bind-key -n M-0 select-window -t :9

11.8 配置要点速查

分类 关键配置 / 快捷键 说明
前缀键 C-b(默认)/ C-a(注释示例) tmux 所有快捷键的引导键
状态栏 status-position top、status-left/right 状态栏位于顶部,显示会话名与时间
窗口管理 automatic-rename on、renumber-windows on 自动重命名、关闭后自动重新编号
分屏 前缀 + |、前缀 + - 水平、垂直分屏
窗格切换 前缀 + h/j/k/l 类 vi 方向切换窗格
窗口切换 Alt + 0~9 直接切换到指定编号窗口
拷贝模式 前缀 + y,v 选取,y 复制 vi 风格拷贝,通过 xclip 同步系统剪贴板
粘贴 前缀 + p 从系统剪贴板粘贴
重载配置 前缀 + r 重新加载 ~/.tmux.conf

注意:使用 xclip 相关功能需要系统已安装 xclip,且在图形会话或正确配置了 DISPLAY 的环境下运行;部分较新版本 tmux(2.4+)已使用 mouse 统一选项替代 mode-mouse 等旧选项,bind-key -t vi-copy 也改为 bind-key -T copy-mode-vi,使用时可根据版本调整。

11.9 tmux 速查

任务 命令
新建会话 tmux new -s name
分离 Ctrl + b d
连接 tmux attach -t name
新建窗口 Ctrl + b c
竖分屏 Ctrl + b + |
横分屏 Ctrl + b -

十二、帮助文档与速查资源

12.1 帮助获取途径小结

途径 命令/位置 适用场景
man 手册 man 命令,文件位于 /usr/share/man 查命令的完整选项说明(最常用)
info 文档 info 命令,文件位于 /usr/share/info 了解软件/概念的整体介绍
简要帮助 命令 --help、help 内置命令 快速回忆选项
命令定位 type、which、whereis 判断内部/外部命令与所在路径
软件自带文档 /usr/share/doc/软件名/ 查看示例配置文件与 README
配置文件示例 man 5 配置文件名 查配置文件的字段格式

12.2 Linux 常用基础命令大全(分类速查)

以下命令按用途分类整理,可作为日常运维的快速查阅清单。其中 <...> 表示需要根据实际情况替换的参数。

系统信息

命令 说明
uname -a 查看内核 / 操作系统 / CPU 信息
head -n 1 /etc/issue 查看操作系统版本
cat /proc/cpuinfo 查看 CPU 信息
hostname 查看计算机名
lspci -tv 列出所有 PCI 设备
lsusb -tv 列出所有 USB 设备
lsmod 列出已加载的内核模块
env 查看环境变量

资源与负载

命令 说明
free -m 查看内存使用量和交换区使用量(以 MB 为单位)
df -h 查看各分区使用情况
du -sh <目录名> 查看指定目录的大小
grep MemTotal /proc/meminfo 查看内存总量
grep MemFree /proc/meminfo 查看空闲内存量
uptime 查看系统运行时间、用户数、负载
cat /proc/loadavg 查看系统负载

磁盘和分区

详见 阶段03 磁盘与文件系统管理

命令 说明
mount \| column -t 查看挂接的分区状态
fdisk -l 查看所有分区
swapon -s 查看所有交换分区
hdparm -i /dev/hda 查看磁盘参数(仅适用于 IDE 设备)
dmesg \| grep IDE 查看启动时 IDE 设备检测状况

网络

详见 阶段07 网络基础与网络配置

命令 说明
ifconfig 查看所有网络接口的属性(CentOS 7 推荐 ip a)
iptables -L 查看防火墙设置
route -n 查看路由表
netstat -lntp 查看所有监听端口
netstat -antp 查看所有已经建立的连接
netstat -s 查看网络统计信息

版本差异:CentOS 6 使用 net-tools(ifconfig、route、netstat)与 iptables;CentOS 7 默认改用 iproute2(ip a、ip route、ss -lntp)与 firewalld,但仍可安装 net-tools 继续使用旧命令。

进程

详见 阶段04 进程与任务管理

命令 说明
ps -ef 查看所有进程
top 实时显示进程状态

用户

详见 阶段02 用户与权限管理

命令 说明
w 查看活动用户
id <用户名> 查看指定用户信息
last 查看用户登录日志
cut -d: -f1 /etc/passwd 查看系统所有用户
cut -d: -f1 /etc/group 查看系统所有组
crontab -l 查看当前用户的计划任务

服务

详见 阶段02 服务管理与 Shell 环境、阶段08 系统服务与日志管理

命令 说明
chkconfig --list 列出所有系统服务(CentOS 6)
chkconfig --list \| grep on 列出所有开机启动的系统服务(CentOS 6)
systemctl list-unit-files 列出所有服务单元及开机状态(CentOS 7)

软件包

详见 阶段05 软件包管理

命令 说明
rpm -qa 查看所有已安装的软件包(RPM 系)

12.3 图形界面与常用小工具

课程环境中还安装了若干图形/桌面工具,了解即可:

命令 说明
cal 显示日历
mplayer / smplayer 命令行/图形视频播放器
eog 图片查看器
gedit 图形界面文本编辑器
evince PDF 阅读器
openoffice 办公软件
  • mplayer / smplayer 安装与测试:

    sudo yum -y install epel-release
    sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
    sudo yum makecache
    sudo yum search mplayer
    sudo yum install mplayer smplayer -y
    
    # 测试播放
    cd /mnt/video
    mplayer 1_test.mp4
  • RealVNC:远程共享桌面。

    详见 阶段07 网络配置与远程管理

    • 共享端:

      sudo yum install VNC-Server-6.3.1-Linux-x64.rpm
      sudo vnclicense -add 84WFN-YRJ4C-WA44V-9BW6X-PAE2A
      vncserver-x11
    • 连接端:

      sudo yum install VNC-Viewer-6.18.907-Linux-x64.rpm
      vncviewer

12.4 NFS 简单挂载(获取课堂素材)

详见 阶段09 基础网络服务部署(NFS 与 autofs)

课程中经常从教师机挂载共享目录:

# 查看 192.168.0.183 上有哪些共享目录
showmount -e 192.168.0.183

# 将 192.168.0.183 的 /soul 挂载到本机 /mnt
sudo mount 192.168.0.183:/soul /mnt

# 切换到挂载点使用
cd /mnt
ls
cd linux/2_linuxBasics
ls
vi 2_detail.txt

使用完毕后卸载:

cd /                  # 必须先退出挂载目录,否则设备忙
sudo umount /mnt      # 取消挂载
sudo umount /mnt -l   # 强制延迟卸载(lazy umount)

卸载前先 cd / 离开挂载点,否则会提示 device is busy 而无法卸载。

12.5 vim 编辑器

vi 是经典文本编辑器,vim 是其增强版(Vi IMproved),现在各版本 Linux 基本都带有 vim。

sudo yum install vim -y
任务 命令
保存退出 :wq
强制退出 :q!
撤销 u
复制一行 yy
删除一行 dd
粘贴 p
跳转到行尾 $
跳转到文件首 gg
全文替换 :%s/old/new/g

vim 的三种模式、光标定位、可视模式、查找替换、多窗口/多标签、缓冲区、折叠、配置文件(/etc/vimrc、~/.vimrc)等完整内容详见 01-03-vim编辑器.md。

12.6 附:CentOS 7 源码安装 Python3.7.3

本节属于软件包管理范畴,完整的源码编译安装流程与依赖处理详见 阶段05 软件包管理

安装环境

1. 下载源码包

wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

2. 解压并进入源码目录

tar -xvf Python-3.7.3.tgz -C /usr/src
cd /usr/src/Python-3.7.3/
ls

解压后目录中应包含 configure、Makefile.pre.in、setup.py 等文件,例如:

aclocal.m4           config.guess  configure     Doc      Include     Lib      m4   Makefile.pre.in  Modules  Parser  PCbuild   pyconfig.h.in  README.rst  Tools
CODE_OF_CONDUCT.rst  config.sub    configure.ac  Grammar  install-sh  LICENSE  Mac  Misc             Objects  PC      Programs  Python         setup.py

3. 安装编译依赖

yum install -y gcc gcc-c++ zlib zlib-devel pcre pcre-devel openssl openssl-devel libffi-devel

4. 配置编译参数

--prefix 指定安装路径,--enable-optimizations 启用 PGO 等优化选项:

./configure --prefix=/usr/local/python3 --enable-optimizations

5. 编译并安装

make
make install

6. 设置软链接

为避免影响系统自带的 Python2,先将原 /usr/bin/python 改名,再创建指向 Python3.7 的软链接:

mv /usr/bin/python /usr/bin/python2.7.5
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python

7. 修复 yum 解释器

由于 CentOS 7 的 yum 依赖系统默认的 Python2,在修改软链接后需要显式指定其使用原来的 Python2.7.5,否则 yum 将无法运行:

vim /usr/bin/yum

将文件首行:

#!/usr/bin/python

修改为:

#!/usr/bin/python2.7.5

保存退出即可。


十三、课堂练习与作业

以下练习用于巩固本章命令,建议在独立的练习目录(如 ~/practice)下完成。

练习 1:目录树创建

  1. 在练习目录下创建一个 test 文件夹,并在 test 内创建 100 个文件夹。

    mkdir test
    cd test
    mkdir file{1..100}
  2. 在 test 下使用 mkdir -p 一次性创建如下目录树:

test
 └── a
     ├── b
     │   ├── c
     │   │   ├── d
     │   │   │   ├── c
     │   │   │   ├── e
     │   │   │   ├── v
     │   │   │   ├── x
     │   │   │   └── z
     │   │   ├── h
     │   │   ├── i
     │   │   └── j
     │   └── g
     └── f

参考答案(一条命令完成):

mkdir -p test/a/b/c/d/{c,e,v,x,z} test/a/b/c/{h,i,j} test/a/b/g test/a/f

练习 2:软链接

  1. 使用 vim 创建一个普通文件 test.txt,内容为 hello world。
  2. 创建一个软链接指向 test.txt。
  3. 通过软链接修改文件内容,验证源文件同步变化。

参考答案:

vim test.txt                # 输入 hello world 后 :wq 保存
ln -s test.txt test_link    # 为 test.txt 创建软链接
vim test_link               # 通过软链接修改
cat test.txt                # 验证源文件内容已同步变化

练习 3:ls 与文件复制/剪切

  1. 分别执行并熟悉以下命令的区别:

    ls -al          # 含隐藏文件的详细列表
    ls -lt          # 按修改时间排序
    ls -lh          # 人类可读大小
    ls -dl          # 只看目录本身(等价于 ls -ld)
  2. 把目录 d 下的所有内容复制到 b,要求显示复制进度。

    cp -rv d/* b/
  3. 把目录 d 下的所有内容剪切到 b。

    mv d/* b/

练习 4:rename 批量重命名

创建以下文件:

1.conf.conf.conf.conf  2_conf.conf  3_conf.txt  4.conftest.conf.conf
touch 1.conf.conf.conf.conf 2_conf.conf 3_conf.txt 4.conftest.conf.conf

在当前目录多次执行:

rename .conf .html *.conf

观察每次执行后文件名的变化,理解 rename 每次只替换文件名中第一个匹配串的规则(3_conf.txt 因不匹配 *.conf 而始终不变)。

练习 5:文件阅读命令

  1. cat:

    cat /etc/passwd > 1_passwd.txt
    cat -n 1_passwd.txt
    cat -b 1_passwd.txt
    cat -s 1_passwd.txt
  2. head:查看 /etc/passwd 的前 10 行、前 10 个字符、整个文件(思考如何实现)。

    head /etc/passwd            # 前 10 行
    head -c 10 /etc/passwd      # 前 10 个字符
    head -n -0 /etc/passwd      # 整个文件;也可直接用 cat
  3. tail:查看后 10 行、后 10 个字符、整个文件,并尝试 -f 实时跟踪。

    tail /etc/passwd
    tail -c 10 /etc/passwd
    tail -n +1 /etc/passwd      # 从第 1 行开始即整个文件
    tail -f /etc/passwd
  4. less:使用 -N 显示行号、-m 显示百分比。

    less -N /etc/passwd
    less -m /etc/passwd

练习 6:重定向

  1. 用 cat 配合输出重定向,把 /etc/passwd 写入新文件。

    cat /etc/passwd > new_passwd.txt
  2. 用 cat 查看一个不存在的文件,将错误输出重定向到文件。

    cat nofile 2> error.txt
  3. 用 cat 查看一个不存在的文件,将错误输出丢弃到 /dev/null。

    cat nofile 2> /dev/null
  4. 把 /etc/passwd 作为 cat 的输入源,将结果输出到新文件。

    cat < /etc/passwd > new_passwd2.txt

练习 7:管道综合练习

  1. 输出 /etc/passwd 的第 10 行到第 20 行,并且带行号。

    sed -n '10,20p' /etc/passwd | cat -n
    # 或:head -20 /etc/passwd | tail -11 | cat -n
  2. 把 cat 的输入重定向到终端手动输入内容,再将 cat 的输出重定向到文件。

    cat > out.txt        # 手动输入内容,Ctrl+D 结束
    cat << EOF > out.txt
    hello
    EOF
  3. 用 cat 代替 echo 完成打印输出,并将结果导入新文件。

    cat <<< "hello world" > hello.txt
  4. 在不打开、不删除、不创建同名文件的前提下清空一个普通文件(提示:使用重定向)。

    > file

练习 8:综合练习(目录、链接、别名)

  1. 在根目录下创建 aaa 和 bbb 两个目录。

    mkdir /aaa /bbb
  2. 进入 aaa,再创建 ddd 子目录。

    cd /aaa && mkdir ddd
  3. 在 ddd 中创建一个以自己名字拼音命名的普通文件。

    touch /aaa/ddd/zhangsan
  4. 用 echo 向该文件追加内容,格式为 *.*.*.*(数字或字母)。

    echo "a.1.b.2" >> /aaa/ddd/zhangsan
  5. 用 ln 为该文件在 bbb 目录分别创建硬链接和软链接。

    ln /aaa/ddd/zhangsan /bbb/zhangsan_hard
    ln -s /aaa/ddd/zhangsan /bbb/zhangsan_soft
  6. 为 clear 创建别名(别名为自己名字拼音,需带选项),先检查是否被占用,再写入 ~/.bashrc 永久生效。

    zhangsan                       # 提示 command not found 说明可用
    echo "alias zhangsan='clear'" >> ~/.bashrc
    source ~/.bashrc
  7. 用 which 查询自己定义的别名属于哪个命令。

    which zhangsan
  8. 用一条命令创建三个以数字命名的目录。

    mkdir 1 2 3
    # 或:mkdir {1..3}
  9. 创建以数字 1-9 开头、.txt 结尾的文件。

    touch {1..9}.txt
  10. 用 rename 将所有 .txt 文件改名为 .php。

     rename .txt .php *.txt

课后作业

  1. 多次练习练习 1 ~ 4,熟练掌握目录/文件操作。

  2. 多练习 cd 的绝对路径、相对路径以及父目录切换。

  3. 尝试用一条命令把多个文件夹复制到另一个位置。

    cp -r dir1 dir2 dir3 /target/       # 或 cp -rt /target/ dir1 dir2 dir3
  4. 用一条命令完成练习 1 的目录树创建。

  5. 复习本章所有命令,以及 vim(详见 01-03-vim编辑器.md)与 tmux 快捷键。

最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏