其实我也很清楚命令是用明白的,但是我真的是真的是总忘,而且经常不知道这种操作还有命令,所以说,这算是一个记录本了

推荐一个 Linux 命令快查网站,非常不错,大家如果遗忘某些命令或者对某些命令不理解都可以在这里得到解决。

Linux 命令在线速查手册:https://wangchujiang.com/linux-command/

另外,shell.how 可以解释常见命令(包括 Git、npm)的作用。遇到不熟悉的选项,仍建议以本机 man 命令 或 命令 --help 为准。

系统级别操作

系统信息(系统监控)

  1. iostat:CPU 和 IO 统计

    iostat(Input/Output Statistics)是Linux系统下一个强大的性能监控工具,属于sysstat工具包的一部分。它主要用于监控系统的磁盘I/O活动情况和CPU使用情况。

    1
    iostat [选项] [时间间隔] [次数]

    包括

    1
    2
    3
    4
    5
    iostat	    # 显示自系统启动以来的CPU和磁盘统计信息
    iostat -c # 仅显示CPU使用情况
    iostat -d # 仅显示磁盘/设备使用情况
    iostat -p sda # 显示 sda 及其分区的统计信息
    iostat 2 # 每2秒刷新一次显示
    image-20260220010805245

    对于其中的CPU字段说明,如下

    字段 含义
    %user 用户空间CPU使用率
    %nice 改变优先级的进程CPU使用率
    %system 内核空间CPU使用率
    %iowait CPU等待I/O完成的时间百分比
    %steal 虚拟化环境中被其他虚拟机占用的CPU时间
    %idle CPU空闲时间百分比

    对于其中的磁盘统计字段说明,如下

    字段 含义
    tps 每秒传输次数(Transfers Per Second)
    kB_read/s 每秒读取的KB数
    kB_wrtn/s 每秒写入的KB数
    kB_read 读取的总KB数
    kB_wrtn 写入的总KB数
    %util 采样期间设备处理 I/O 的时间占比;接近 100% 时应结合延迟、吞吐量判断
    await I/O请求平均等待时间(毫秒)
  2. dstat :系统综合资源实时统计

    1
    dstat [选项] [间隔] [次数]

    包括常用的如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dstat	# 显示综合资源统计
    dstat -c # 显示CPU统计
    dstat -d # 显示磁盘统计
    dstat -m # 显示内存统计
    dstat -n # 显示网络统计
    dstat -l # 显示负载统计
    dstat -r # 显示I/O统计
    dstat --top-cpu # 显示最耗CPU进程
    dstat --top-mem # 显示最耗内存进程
    dstat --top-io # 显示最耗I/O进程
  3. mpstat:CPU性能统计

    1
    mpstat [选项] [间隔] [次数]

    包括如下内容

    1
    2
    3
    4
    5
    6
    mpstat	  # 显示CPU统计信息
    mpstat -A # 显示所有CPU详细信息
    mpstat -P ALL # 显示所有CPU核心统计
    mpstat -u # 显示CPU使用率(默认)
    mpstat 间隔 # 每隔指定秒数刷新
    mpstat 间隔 次数 # 刷新指定次数
  4. hostname:显示或者设置主机名

    1
    hostname [选项] [新主机名]
  5. uptime:显示系统的运行时间以及系统的平均负载情况

    这个命令对于系统管理员和开发人员来说是一个快速检查系统状态的好工具

    1
    uptime [选项]

    包括

    1
    2
    3
    4
    uptime     # 系统时间,运行时间,当前登录用户数,系统平均负载
    uptime -p # 检查系统运行时间,格式友好
    uptime -s # 查看系统启动时间
    uptime -v # 显示版本信息
  6. free:显示内存使用情况

    1
    free [选项]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    free	# 显示内存使用情况(默认单位KB)
    free -m # 以MB为单位显示(最常用)
    free -g # 以GB为单位显示
    free -h # 以人类可读格式显示(自动选择单位)
    free -t # 显示总计行(total)
    free -s # 间隔 持续显示,每隔指定秒数刷新
    free -c 次数 # 持续显示指定次数
    free -l # 显示详细内存统计(low/high)
    free -m -s 2 # 常见组合,每2秒刷新一次,以MB显示
    free -h -t # 常见组合,人类可读格式+显示总计

    对于它的输出字段说明

    image-20260220011210975
    字段 含义
    total 总内存
    used 已使用内存
    free 空闲内存
    shared 共享内存
    buff/cache 缓冲区/缓存占用
    available 可用内存(应用程序可用)
  7. glances:综合的系统监控工具

    它能够以直观的方式展示 Linux 系统的各项性能指标。与传统的 top 或 htop 命令相比,glances 提供了更丰富的监控维度和更友好的用户界面。

    1
    glances [选项]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    glances	     # 启动交互式监控界面
    glances -w # 启动Web服务器模式
    glances -s -p 61209 # 指定客户端/服务端模式的监听端口
    glances -c 主机地址 # 连接指定服务器(需先启动 glances 服务端)
    glances -s # 启动服务端模式
    glances -d # 启用调试模式
    glances --export csv --export-csv-file 文件.csv # 将监控数据导出为 CSV
    glances -t 间隔 # 设置刷新间隔(秒)
    glances --help # 查看当前版本支持的参数
  8. date:显示或者设置系统日期

    1
    date [选项] [+格式]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    date	# 显示当前系统日期和时间
    date +格式 # 按指定格式显示日期时间
    date -s "字符串" # 设置系统时间(set)
    date -d "字符串" # 显示指定日期(display)
    date -r 文件 # 显示文件的最后修改时间
    date -I # 以ISO 8601格式输出日期
    date +%Y # 显示四位年份
    date +%y # 显示两位年份
    date +%m # 显示月份(01-12)
    date +%d # 显示日期(01-31)
    date +%H # 显示小时(00-23)
    date +%M # 显示分钟(00-59)
    date +%S # 显示秒(00-59)
    date +%A # 显示完整星期名
    date +%a # 显示缩写星期名
    date +%B # 显示完整月份名
    date +%b # 显示缩写月份名
    date +%j # 显示一年中的第几天
    date +%U # 显示一年中的第几周
    date +%s # 显示Unix时间戳
    date +%F # 显示完整日期(YYYY-MM-DD)
    date +%T # 显示完整时间(HH:MM:SS)
  9. uname:显示系统信息

    1
    uname [选项]

    包括如下,速查了属于是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uname	  # 显示内核名称
    uname -a # 显示所有系统信息
    uname -s # 显示内核名称
    uname -n # 显示主机名
    uname -r # 显示内核发行号(release)
    uname -v # 显示内核构建版本信息
    uname -m # 显示机器硬件架构
    uname -p # 显示处理器类型
    uname -i # 显示硬件平台
    uname -o # 显示操作系统

帮助文档相关

  1. man:查看命令帮助文档,用于查看各种命令、函数和配置文件的手册页面。

    1
    man [选项] [节号] 命令/主题

    常用写法:

    1
    2
    3
    4
    5
    man ls          # 查看 ls 手册
    man 5 crontab # 查看 crontab 文件格式(第 5 节)
    man -k 关键词 # 按关键词搜索手册主题,类似 apropos
    man -f printf # 列出同名手册及其节号,类似 whatis
    命令 --help # 查看命令自带的简要帮助(并非所有命令都支持)

    在 man 中按 /关键词 搜索,n 跳到下一处,q 退出。

    常见的节号包括:

    • 1:用户命令
    • 2:系统调用
    • 3:C库函数
    • 4:设备和特殊文件
    • 5:文件格式和约定
    • 6:游戏和演示
    • 7:杂项
    • 8:系统管理命令

关机重启

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

  1. shutdown:关闭或者重启系统

    这个是安全关闭,使用这个关闭是最合适的

    1
    shutdown [选项] [时间] [警告消息]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    shutdown	# 部分发行版默认计划稍后关机;先用 shutdown --help 核对
    shutdown -h now # 立即关机(通常会切断电源)
    shutdown -P now # 立即关机并切断电源
    shutdown -r now # 立即重启系统
    shutdown -c # 取消已计划的关机/重启操作
    shutdown -H now # 立即停止系统,通常不切断电源
    shutdown now # 立即执行关机
    shutdown -h now # 立即关机
    shutdown -r now # 立即重启
    shutdown +10 # 10 分钟后关机
    shutdown -r +5 # 同样,重启也可以这样写,例如5分钟后重启
    shutdown hh:mm # 指定具体时间关机(24小时制)
    shutdown -h 23:00 # 晚上11点关机
    shutdown -r 02:00 # 凌晨2点重启
  2. poweroff:用于关闭计算机并切断电源。使用权限,系统管理者。

    1
    poweroff [选项]

    没用过,写上留着速查

    1
    2
    3
    poweroff	# 立即关闭系统并切断电源
    poweroff -f # 强制关机,不调用shutdown(force)
    poweroff -h # 关机后停止系统(halt)
  3. halt:关闭系统,也就是停止系统运行,电源可能保持

    1
    halt [选项]

    包括

    1
    2
    3
    4
    halt	# 停止系统运行(可能不切断电源)
    halt -f # 强制关机,不调用shutdown(force)
    halt -p # 关机后切断电源(同poweroff)
    halt -h # 关机后停止系统
  4. reboot:重启系统

    1
    reboot [选项]

    包括

    1
    2
    reboot	   # 立即重启系统
    reboot -f # 强制重启,不调用shutdown(force)

磁盘管理

  1. df:显示磁盘空间使用

    检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

    1
    df [-ahikHTm] [目录或文件名]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    df	    # 显示所有已挂载文件系统的磁盘使用情况(默认单位KB)
    df -a # 显示所有文件系统,包括特殊的/proc、/sysfs等
    df -h # 以人类可读格式显示(自动转换为KB/MB/GB)
    df -H # 以1000为进制单位显示(M=1000K,非1024)
    df -k # 以KB为单位显示容量
    df -m # 以MB为单位显示容量
    df -BG # 以 GiB 为单位显示容量(GNU df)
    df -T # 显示文件系统类型(ext4、xfs、ntfs等)
    df -i # 显示inode使用情况,而非磁盘空间
    df -l # 仅显示本地文件系统
    df -t 类型 # 仅显示指定类型的文件系统
    df /目录 # 显示指定目录所在分区的磁盘使用情况
    df -hT # 常用组合 人类可读格式+显示文件系统类型
    df -hi # 常用组合 人类可读格式+显示inode
  2. mount  umount:挂载  卸载文件系统

    挂载是把文件系统接入目录树。访问分区中的文件前,通常需要把该文件系统挂载到一个已存在的目录(挂载点)。

    1
    2
    mount [选项] <设备> <挂载点>
    umount [选项] <设备或挂载点>

    对于 mount,而且很多情况下,我们挂载到/mnt挂载点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    mount	# 显示当前已挂载的所有文件系统
    mount -a # 挂载/etc/fstab中定义的所有文件系统
    mount -t 类型 设备 挂载点 # 指定文件系统类型
    mount -o 选项 设备 挂载点 # 指定挂载选项
    mount -r 设备 挂载点 # 以只读方式挂载(相当于 -o ro)
    mount -w 设备 挂载点 # 以读写方式挂载(相当于 -o rw)
    mount -v # 显示详细挂载过程
    mount --bind 源 目标 # 绑定挂载(将目录挂载到另一位置)
    mount --move 源 目标 # 移动挂载点到新位置
    mount -o remount,rw 挂载点 # 重新挂载为读写
    mount -o noatime 设备 挂载点 # 挂载时不更新访问时间
    mount -o sync 设备 挂载点 # 同步写入数据
    mount -o async 设备 挂载点 # 异步写入数据
    mount -o user 设备 挂载点 # 允许普通用户挂载(常见于 /etc/fstab 配置)
    mount -o users 设备 挂载点 # 允许普通用户挂载和卸载(常见于 /etc/fstab 配置)
    mount -o defaults 设备 挂载点 # 使用默认挂载选项
    mount /dev/sdb1 /mnt # 挂载设备到指定目录
    mount -t ntfs-3g /dev/sdb1 /mnt # 挂载NTFS分区
    mount -t iso9660 /dev/cdrom /mnt/cdrom # 挂载光盘
    mount -t vfat /dev/sdb1 /mnt/usb # 挂载U盘(FAT32)
    mount -o remount,rw / # 重新挂载根目录为读写

    对于 umount。基本就是使用其最简单的使用形式

    1
    2
    3
    4
    5
    6
    7
    umount 挂载点	# 卸载指定挂载点的文件系统
    umount 设备 # 卸载指定设备的文件系统
    umount -a # 卸载所有已挂载的文件系统
    umount -t 类型 # 卸载指定类型的文件系统
    umount -v # 显示详细卸载过程
    umount -f 挂载点 # 强制卸载,主要用于不可达的网络文件系统;本地 busy 时先查占用进程
    umount -R 挂载点 # 递归卸载(包括子挂载点)
  3. fdisk:交互式磁盘分区工具(支持 MBR 和 GPT)

    1
    fdisk [选项] [设备]
    1
    2
    3
    4
    5
    6
    fdisk -l	# 列出所有磁盘的分区表信息
    fdisk -l 设备 # 列出指定磁盘的分区信息
    fdisk 设备 # 进入交互式分区模式
    fdisk -o Device,Start,End,Sectors,Size,Type -l 设备 # 自定义显示列
    fdisk -v # 显示版本信息
    fdisk /dev/sda # 对/dev/sda磁盘进行分区操作

    进入fdisk后,fdisk常用交互命令如下

    命令 注释
    m 显示帮助菜单
    p 打印分区表(显示当前分区)
    n 新建分区(new)
    d 删除分区(delete)
    t 修改分区类型(type)
    l 列出所有分区类型代码
    w 保存并退出(write)
    q 不保存退出(quit)
    g 新建 GPT 分区表(会改变分区表,操作前先备份)
  4. cfdisk:cfdisk是用来磁盘分区的程序,它十分类似DOS的fdisk,但是它具有互动式操作界面,而非传统fdisk的问答式界面

    我通常使用 cfdisk来代替 fdisk

    1
    cfdisk [选项] [设备]

    因为使用后进入的是一个可视化界面,所以说它的参数比较少

  5. parted:另一个支持 MBR/GPT 的分区工具。传统 512 字节扇区下,MBR 可寻址容量约为 2 TiB;较大磁盘通常采用 GPT。

    对于服务器来说,分几个T还是比较常见的,别以为看这么大就感觉没用

    1
    parted [选项] [设备] [命令]
    1
    2
    3
    parted -l	# 列出所有磁盘的分区信息
    parted /dev/sdb print # 查看指定磁盘的分区表
    parted /dev/sdb # 进入交互式分区模式
  6. mkfs:创建文件系统,也就是格式化

    创建分区后,就需要格式化了硬盘了一般

    1
    mkfs [选项] <设备>

    能使用到的命令只有如下三个,其他的这辈子没见过,更别说用了

    1
    2
    3
    mkfs.ext4 设备	# 创建ext4文件系统
    mkfs.vfat 设备 # 创建FAT32文件系统
    mkfs.ntfs 设备 # 创建 NTFS 文件系统(需要对应工具包)

    格式化会清除目标分区上的现有文件系统信息。先用 lsblk -f 核对设备名,并确认目标分区已卸载。

  7. badblocks:检测磁盘坏块

    1
    badblocks [选项] <设备>

    包括

    1
    2
    3
    4
    5
    badblocks 设备	# 检查设备的坏块(只读模式)
    badblocks -s # 显示检查进度
    badblocks -v # 显示详细过程
    badblocks -o 文件 # 将坏块列表输出到文件
    badblocks -f 设备 # 强制对已挂载设备检查,可能造成数据损坏;应先卸载
  8. fsck:文件系统检查与修复

    1
    fsck [选项] <文件系统>

    包括

    1
    2
    3
    4
    5
    6
    7
    fsck 设备	# 检查文件系统;是否修复取决于文件系统类型及交互选择
    fsck -p 设备 # 自动修复可安全处理的问题
    fsck -n 设备 # 只读检查(具体效果取决于文件系统检查器)
    fsck -C # 显示进度条
    fsck -y # 对所有问题回答yes
    fsck -f /dev/sdb1 # 强制检查/dev/sdb1
    fsck -y /dev/sdb1 # 对修复提问一律回答 yes(先确认备份)

    检查或修复前先卸载文件系统;根文件系统通常在救援环境或启动检查阶段处理。

  9. lsblk:列出块设备信息

    1
    lsblk [选项]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    lsblk	    # 列出所有块设备信息(树状显示)
    lsblk 磁盘 # 显示指定磁盘信息
    lsblk -a # 显示所有设备,包括空设备
    lsblk -f # 显示文件系统信息
    lsblk -m # 显示权限和所有者信息
    lsblk -p # 显示完整设备路径
    lsblk -s # 按从属关系排序
    lsblk -d # 仅显示磁盘,不显示分区

环境变量

  1. env:查看和设置环境变量

    1
    env [选项] [变量=值]... [命令]

    包括

    1
    2
    3
    4
    env	   # 显示当前所有环境变量
    env | grep PATH # 查看特定变量
    env -u 变量名 命令 # 运行该命令时临时移除指定变量
    env -i 命令 # 以空环境运行命令

    对于打印环境变量,有专用的printenv 命令专用于打印环境变量

  2. export:单次终端下临时设置环境变量,而且也能导出环境变量

    在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。

    1
    export [选项] [变量名=值]

    导出是让当前 shell 后续启动的子进程也能读取该变量;当前 shell 中的普通变量无需导出即可使用。

    包括

    1
    2
    3
    4
    5
    6
    7
    export	   # 显示所有已导出的环境变量
    export 变量名=值 # 设置并导出环境变量
    export -n 变量名 # 取消变量的导出属性,但是不删除变量
    export VAR=value # 设置新环境变量
    export 变量名 # 导出已存在的变量
    export VAR1=a VAR2=b # 同时设置多个变量
    export PATH=$PATH:/新路径 # 追加路径到PATH

    父Shell 不使用export 设置变量,子Shell无法访问,但是父Shell 使用export,子Shell可以访问

  3. unset:删除环境变量,unset后变量立即消失

    unset 只影响当前 shell 会话,不影响配置文件

    只读变量无法用 unset 删除

    而且不影响已启动的子进程

    1
    unset [选项] [变量名或函数名]

    包括

    1
    2
    3
    unset 变量名	  # 删除指定的环境变量或Shell变量
    unset -v 变量名 # 删除变量(variable,默认行为)
    unset 变量1 变量2 # 同时删除多个变量
  4. set:显示所有变量,是Shell变量+环境变量

    1
    set [选项] [参数]

    包括

    1
    2
    set	         # 显示所有Shell变量(包括环境变量和局部变量)
    set | grep PATH # 显示所有变量并筛选

要想一直生效,还是推荐去操作配置文件,一般就是这个配置文件

image-20260219174821957
文件 作用域 加载时机 用途
/etc/profile 系统级 登录时 所有用户的环境变量
/etc/bash.bashrc 系统级 交互式Shell 所有用户的Shell配置
~/.bash_profile 用户级 登录时 用户个人环境变量
~/.bashrc 用户级 交互式Shell 用户个人Shell配置

服务管理

  1. systemctl:systemd 服务管理,也可用于关机

    控制 systemd 系统和服务管理器的命令行工具。作为现代 Linux 发行版的核心组件,它取代了传统的 init 系统和 service 命令。

    1
    systemctl [选项] [命令] [单元名称]

    常用选项不是很多,基本如下

    参数 注释
    systemctl --quiet 静默模式,减少输出
    systemctl --full 显示完整输出(不截断)
    systemctl --failed 配合 list-units 查看失败单元
    systemctl --all 配合 list-units 查看已加载单元(含不活跃的)
    systemctl --type=service 仅显示服务类型单元
    systemctl --state=active 仅显示活跃状态的单元
    systemctl -H 主机 连接到远程主机

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 服务管理命令
    systemctl start 服务名 # 启动指定服务
    systemctl stop 服务名 # 停止指定服务
    systemctl restart 服务名 # 重启指定服务
    systemctl reload 服务名 # 重新加载服务配置(不中断服务)
    systemctl kill 服务名 # 发送信号终止服务进程

    # 服务状态查看
    systemctl status 服务名 # 查看服务当前状态(最常用)
    systemctl show 服务名 # 显示服务的详细属性

    # 开机启动管理
    systemctl enable 服务名 # 设置服务开机自动启动
    systemctl disable 服务名 # 禁用服务开机自动启动

    # 运行命令
    systemctl poweroff # 关闭系统并切断电源
    systemctl reboot # 重启系统
    systemctl suspend # 挂起系统(睡眠)
    systemctl --user exit # 退出当前用户的 systemd 实例
  2. service:传统服务管理工具

    service 是 Linux 系统中用于管理系统服务的命令行工具。它提供了一种标准化的方式来启动、停止、重启和检查系统服务的状态。

    1
    service [服务名] [操作指令]

    常用操作指令如下

    1
    2
    3
    4
    5
    6
    7
    service 服务名 start	# 启动指定服务
    service 服务名 stop # 停止指定服务
    service 服务名 restart # 重启指定服务
    service 服务名 reload # 重新加载服务配置
    service 服务名 status # 查看服务状态
    service --status-all # 显示所有服务的状态
    service 服务名 --help # 显示服务帮助信息
  3. journalctl :systemd 日志查看

    1
    journalctl [选项]

    很多,包括如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    journalctl	            # 查看所有日志
    journalctl -u 服务名 # 查看指定服务的日志
    journalctl -u 服务名 -f # 实时跟踪服务日志
    journalctl -f # 实时跟踪日志(类似 tail -f)
    journalctl -b # 查看本次启动的日志
    journalctl -b -1 # 查看上次启动的日志
    journalctl --list-boots # 列出所有启动记录
    journalctl -p err # 查看错误级别日志
    journalctl --since "时间" # 查看指定时间后的日志
    journalctl --until "时间" # 查看指定时间前的日志
    journalctl --since today # 查看今天的日志
    journalctl --since yesterday # 查看昨天的日志
    journalctl --since "2026-02-19" # 查看指定日期后的日志
    journalctl -n 行数 # 显示最后指定行数
    journalctl -n 100 # 显示最后 100 行日志
    journalctl -e # 跳转到日志末尾
    journalctl --disk-usage # 显示日志磁盘使用情况
    journalctl --vacuum-size=大小 # 清理日志到指定大小
    journalctl --vacuum-time=时间 # 清理指定时间前的日志
    journalctl --flush # 将内存日志刷新到磁盘
    journalctl --help # 显示帮助信息

工具命令

  1. history:显示命令历史记录

    1
    history [选项] [参数]

    这个确实常用

    1
    2
    3
    4
    5
    6
    history	   # 显示当前用户的所有命令历史
    history -r # 从历史文件读取到当前列表(read)
    history -a # 将当前会话历史追加到历史文件(append)
    history -c # 清空当前会话的命令历史(clear)
    history -d 偏移量 # 删除指定位置的历史命令(delete)
    history 数字 # 显示最近指定数量的命令,例如history 10 显示最近 10 条命令

    对于历史配置文件位置,~/.bash_history是 Bash 命令历史文件

  2. type:显示命令类型

    1
    type [选项] [命令名]

    极少使用,作为查漏补缺

    1
    2
    3
    4
    type 命令名	# 显示命令的类型和路径
    type -a 命令名 # 显示所有匹配的定义/路径
    type -P 命令名 # 仅查找可执行文件路径
    type -t 命令名 # 仅显示命令类型
  3. bash / source:执行脚本

    对于bash

    1
    bash [选项] [脚本文件] [参数]

    它的选项包括如下

    1
    2
    3
    4
    5
    bash	# 启动新的 bash 交互式 Shell
    bash 脚本名 # 执行指定脚本文件
    bash -i # 启动交互式 Shell
    bash -n 脚本名 # 检查语法,不执行(noexec)
    bash -e 脚本名 # 命令失败时立即退出

    对于source命令,或 . 命令

    1
    2
    source 文件 [参数]
    . 文件 [参数]

    bash 脚本名 会启动子 shell;source 文件 在当前 shell执行,常用于加载配置文件。

  4. echo:输出字符串到终端,他就是用于在终端中显示文本或变量的值

    我们经常用于它显示环境变量值,因为毕竟到底也是变量

    1
    echo [选项] [字符串]

    包括

    1
    2
    3
    4
    5
    6
    7
    echo $变量名	# 显示指定环境变量的值
    echo ${变量名} # 一般情况下,我更喜欢这么写
    echo $USER # 显示当前用户名
    echo $SHELL # 显示当前Shell类型
    echo $PWD # 显示当前工作目录
    echo -n 字符串 # 输出不换行
    echo ${变量名:-默认值} # 变量为空时显示默认值
  5. watch:定时执行并监视命令输出

    1
    watch [选项] 命令

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    watch 命令	# 每 2 秒执行一次命令(默认间隔)
    watch -n 秒数 命令 # 指定刷新间隔
    watch -d 命令 # 高亮显示变化的部分
    watch -t 命令 # 关闭顶部标题栏
    watch -c 命令 # 解释 ANSI 颜色转义(终端支持时)
    watch -n 5 free -m # 常用组合,每 5 秒显示内存使用
    watch -d ss -tan # 高亮显示变化的 TCP 连接
    watch -n 10 'ps aux | grep nginx' # 常用组合,每 10 秒监控 nginx 进程
  6. openssl:解密加密工具

    1
    openssl 子命令 [选项] [参数]

    常用示例:

    1
    2
    3
    4
    openssl version                         # 查看版本
    openssl dgst -sha256 文件 # 计算文件 SHA-256 摘要
    openssl rand -hex 16 # 生成 16 字节随机数,以十六进制显示
    openssl s_client -connect example.com:443 -servername example.com # 检查 TLS 连接和证书

    摘要用于校验完整性,不等于加密;不要把密码直接写进命令行。

  7. at:在指定时间执行一次性任务,非cron周期执行

    1
    at [选项] 时间

    包括

    1
    2
    3
    4
    5
    6
    at 时间	# 在指定时间执行任务(进入交互模式)
    at -f 文件 时间 # 从文件读取任务执行(file)
    at -m 时间 # 任务完成时发送邮件(需要本机邮件服务)
    at -v 时间 # 提交任务时显示执行时间
    atrm 任务号 # 删除指定任务(也可使用 at -d 任务号)
    atq # 列出待执行任务(也可使用 at -l)
  8. crontab:周期性定时任务的管理,主要是通过操控 crontab 文件来实现

    1
    crontab [选项]

    包括

    1
    2
    3
    crontab -l    # 查看当前用户的 crontab 文件
    crontab -e # 编辑当前用户的 crontab 文件
    crontab -r # 删除当前用户的所有定时任务,操作前先备份

    每行格式:分 时 日 月 星期 命令。例如 0 3 * * * /path/to/backup.sh 表示每天 03:00 执行。cron 的环境变量通常比交互式 shell 少,建议使用绝对路径,并将输出写入日志。

  9. printf :格式化输出

    1
    printf [格式] [参数]

    这个有点常用,包括

    1
    2
    3
    4
    5
    printf "%s\n" 字符串	# 输出字符串
    printf "%x\n" 数字 # 输出十六进制
    printf "%o\n" 数字 # 输出八进制
    printf "%.2f\n" 数字 # 保留 2 位小数
    printf "%05d\n" 数字 # 前导零填充,宽度 5

文件操作

文件目录命令

查看目录

  1. pwd:显示当前目录路径

    1
    pwd
  2. ls:列出目录内容

    查看当前目录下的所有文件和目录

    1
    2
    ls
    ls [OPTION]... [FILE]...

    在ls后面直接跟目录或者文件,用于指定查看的目录或者文件

    包括

    1
    2
    3
    4
    5
    ls        # 简单列表
    ls -l # 详细信息(权限、大小、时间)
    ls -a # 显示隐藏文件
    ls -lh # 人性化大小(KB、MB)
    ll # 某些发行版提供的别名,通常类似 ls -l;并非标准命令
    image-20260215173432343
  3. du:显示目录或文件大小,也就是占用的磁盘空间,disk usage

    1
    du [选项] [目录或文件名]
    1
    du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    du	    # 显示当前目录下各子目录的磁盘使用量
    du -a # 显示所有文件和目录的大小
    du -h # 以可读格式显示(KB/MB/GB)
    du -k # 以KB为单位显示
    du -m # 以MB为单位显示
    du -BG # 以 GiB 为单位显示(GNU du)
    du -s # 仅显示总计,不显示子目录
    du -d 深度 # 限制显示的目录深度
    du --max-depth=1 # 只显示第一层子目录
    du -x # 仅统计同一文件系统内的文件
    du -L # 跟随符号链接
    du --exclude=模式 # 排除匹配的文件或目录
    du -sh 目录 # 显示目录总大小
    du -h --max-depth=1 /var # 查看 /var 下第一层各目录的大小

    例如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 查看当前目录总大小
    du -sh

    # 查看各子目录大小(第一层)
    du -h --max-depth=1

    # 查看指定目录
    du -sh /var/log

    # 查找大文件(前10个)
    du -ah /var | sort -rh | head -10

    # 排除特定目录
    du -h --exclude=*.log /var

目录切换

  1. cd:通用的目录切换

    1
    cd [-L|[-P [-e]]] [dir]

    包括

    1
    2
    3
    4
    5
    cd 目录名    # 进入目录
    cd .. # 返回上一级
    cd ~ # 回到家目录
    cd - # 回到上一次所在目录
    cd / # 直接到根目录

目录操作

  1. mkdir:目录创建

    1
    mkdir [OPTION]... DIRECTORY...

    包括

    1
    2
    mkdir 目录名
    mkdir -p a/b/c # 递归创建多层目录
  2. rm:删除文件或者目录

    rm命令可用于删除文件或目录,使用时需谨慎。

    包括

    1
    2
    3
    4
    5
    6
    rm 文件名      # 删除文件
    rm -r 目录名 # 递归删除整个文件夹
    rm -f 文件名 # 强制删除文件,不提示;删除目录仍需 -r
    rm -rf 目录名 # 强制删除(慎用!不提示)
    rm -d 目录名 # 删除空目录(同rmdir)
    rm -v 文件名 # 显示删除过程(verbose)
  3. rmdir:删除空目录

    1
    rmdir [OPTION]... DIRECTORY...

    rmdir只能用于删除空目录。如果目录非空,使用该命令会提示错误。

  4. cp:复制文件或目录

    1
    2
    cp [OPTION]... SOURCE... DIRECTORY
    cp 源文件 目标文件

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    cp 源文件 目标文件
    cp -r 源目录 目标目录 # 复制目录必加参数,它是递归复制目录
    cp -a 源 目标 # 归档复制,保留所有属性
    cp -i 源 目标 # 覆盖前询问
    cp -u 源 目标 # 仅当源文件更新时才复制(update)
    cp -v 源 目标 # 显示复制过程(verbose)
    cp -n 源 目标 # 不覆盖已存在的文件(no-clobber)
    cp --backup 源 目标 # 覆盖前备份目标文件
  5. mv:重命名或移动文件/目录

    1
    2
    mv [OPTION]... SOURCE... DIRECTORY
    mv 源 目标

    mv命令有两个主要用途:一是重命名文件或目录,二是将文件或目录从一个位置移动到另一个位置。

    包括

    1
    2
    3
    4
    5
    6
    7
    mv 文件 新文件名	# 重命名文件
    mv 文件 目录 # 移动文件到目录
    mv 文件1 文件2 目录 # 移动多个文件到目录
    mv -f 源 目标 # 强制移动,不询问(force)
    mv -i 源 目标 # 覆盖前询问(默认行为可能因别名而异)
    mv -n 源 目标 # 不覆盖已存在的文件
    mv -v 源 目标 # 显示移动过程

    mv命令在同一文件系统内是重命名操作,跨文件系统是复制+删除

文件命令

查看文件

  1. cat:显示文件内容

    1
    cat [选项] 文件名     # 直接显示全部

    包括如下参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat 文件名	    # 直接显示文件全部内容
    cat -n 文件名 # 显示行号(包括空行)
    cat -b 文件名 # 显示行号(不包括空行)
    cat -s 文件名 # 将连续多个空行合并为一个空行
    cat -A 文件名 # 显示所有隐藏符号(相当于-vET整合)
    cat -E 文件名 # 在每行结尾显示 $ 符号
    cat -T 文件名 # 将TAB字符以^I方式显示
    cat -v 文件名 # 显示看不出来的特殊字符
    cat 文件1 文件2 > 文件3 # 合并多个文件内容输出到新文件
    cat 文件1 >> 文件2 # 将文件1内容追加到文件2末尾

    由于最后两条命令的存在,所以cat它也是个连接文件的存在

  2. more:百分比查看文件内容

    1
    more [选项] 文件名   

    不同实现的 more 能力不同;需要稳定的双向浏览时使用 less,包括如下参数

    1
    2
    3
    4
    5
    6
    more 文件名	# 分页显示文件内容(空格翻页,q退出)
    more -n 文件名 # 指定每屏显示n行
    more +n 文件名 # 从第n行开始显示
    more -d # 显示提示信息和错误信息
    more -p # 清屏后显示文件内容
    more -s # 将连续空行压缩为一行显示
  3. less:分屏查看文件内容

    1
    less 文件名    # 分页查看(上下翻,q退出)

    这个是分屏双向查看,是最推荐查看文件内容的命令,包括如下参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    less 文件名	  # 分页查看文件(可上下翻页,q退出)
    less -n 文件名 # 禁止显示行号
    less -N 文件名 # 显示行号
    less -i 文件名 # 搜索时忽略大小写
    less -m 文件名 # 显示类似more的百分比提示
    less -M 文件名 # 显示详细的百分比和行号信息
    less -q 文件名 # 安静模式,减少提示信息
    less -Q 文件名 # 完全安静模式
    less -s 文件名 # 将连续空行合并显示
    less +数字 文件名 # 从指定行开始显示,例如 less +20 文件名
    less -e 文件名 # 文件显示完毕后自动退出
    less -E 文件名 # 到达文件末尾时自动退出

    less 中的交互键也很重要,因为less和vim什么的不太一样,它不能用鼠标操作

    按键 注释
    空格键 向下翻一页
    b 向上翻一页
    d 向下翻半页
    u 向上翻半页
    j/k 或 ↓/↑ 向下/向上一行
    g/G 跳转到文件开头/结尾
    /关键词 向下搜索
    ?关键词 向上搜索
    n/N 下一个/上一个匹配项
    q 退出
  4. head:从文件头开始查看内容

    对于head和tail,就是显示文件的前几行或后几行

    1
    head [选项] 文件名    # 默认是看前10行

    包括

    1
    2
    3
    4
    5
    6
    7
    head 文件名	     # 显示文件前10行(默认)
    head -n 10 文件名 # 显示文件前10行
    head -20 文件名 # 显示文件前20行(简写)
    head -n -5 文件名 # 显示除最后5行外的所有内容
    head -v 文件名 # 显示文件名头部信息
    head -q 文件名 # 安静模式,不显示文件名头
    head 文件1 文件2 # 同时显示多个文件开头内容
  5. tail:从文件尾部开始查看内容,一般用于实时查看日志

    1
    2
    tail [选项] 文件名    # 看后10行
    tail -f 文件名 # 实时刷新看日志

    包括如下参数,但是除了-f基本用不到别的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    tail 文件名	    # 显示文件最后10行(默认)
    tail -n 10 文件名 # 显示文件最后10行
    tail -20 文件名 # 显示文件最后20行(简写)
    tail -n +5 文件名 # 从第5行开始显示到文件末尾
    tail -f 文件名 # 实时跟踪文件新增内容
    tail -F 文件名 # 实时跟踪(文件被切割/重命名后继续跟踪)
    tail -v 文件名 # 显示文件名头部信息
    tail -q 文件名 # 安静模式,不显示文件名头
    tail -s 5 -f 文件名 # 实时跟踪,每5秒刷新一次
    tail -n 50 -f 文件名 # 先显示最后50行,然后实时跟踪
  6. file:辨识文件类型。

    1
    file [选项] 文件或目录

    其中,常见的参数如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    file 文件名	# 显示文件类型
    file -b 文件名 # 简洁输出,不显示文件名
    file -f 名称文件 # 从文件中读取待检测的文件名列表
    file -i 文件名 # 输出MIME类型字符串
    file --mime 文件名 # 输出 MIME 类型和编码信息
    file -L 文件名 # 检测符号链接指向的文件
    file -h 文件名 # 检测符号链接本身
    file -v 文件名 # 显示版本信息
    file -z 文件名 # 尝试查看压缩文件的内部的类型
  7. nl:添加行号显示

    1
    nl [选项] 文件名

    包括

    1
    2
    3
    4
    5
    nl 文件名	   # 显示文件内容并添加行号
    nl -b a 文件名 # 所有行都列出行号(包括空行)
    nl -b t 文件名 # 空行不列出行号(默认)
    nl -n ln 文件名 # 行号靠左显示
    nl -n rn 文件名 # 行号靠右显示

操作文件

mv,rm,cp等同时能操作文件和目录的命令在上面目录操作中

  1. touch:创建空文件

    1
    touch 文件名

    它其实是一个创建空文件或更新文件的时间戳的命令,包括

    1
    2
    3
    4
    5
    6
    touch 文件名	     # 创建空文件(若文件不存在)
    touch 文件1 文件2 文件3 # 同时创建多个空文件
    touch 已存在文件 # 更新文件的时间戳为当前时间
    touch -a 文件名 # 仅更新访问时间(atime)
    touch -m 文件名 # 仅更新修改时间(mtime)
    touch -a -m 文件名 # 同时更新访问时间和修改时间
  2. wc:计数,利用wc指令我们可以计算文件的Byte数、字数、或是列数,所以说,这是一个专门用来统计文件信息的命令

    1
    wc [选项] 文件名

    包括如下参数,一般来说,输出第一行是行数,然后是单词数,字节数

    1
    2
    3
    4
    5
    6
    7
    wc 文件名	    # 显示行数、单词数、字节数
    wc -l 文件名 # 只显示行数
    wc -w 文件名 # 只显示单词数
    wc -c 文件名 # 只显示字节数
    wc -m 文件名 # 只显示字符数
    wc -L 文件名 # 显示最长行的长度
    wc 文件1 文件2 # 同时统计多个文件,并显示总计
  3. tar:压缩和解压命令

    最常用的打包命令是 tar,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命令通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩了

    tar 命令其实并不是真的解压缩的处理者,而是使用了 gzip 或者 bzip2 等其它命令来达成,但是 gzip 等命令通常只能处理单个文件,并不方便,所以一般我们都是选择使用 tar 命令间接的完成解压缩。

    1
    tar [选项] 压缩包的文件名 文件或目录

    参数按顺序需要编排如下内容,一般就是压缩-czvf,解压-xzvf,查看-tvf

    操作类型选项如下,它是必须选一个的

    1
    2
    3
    4
    5
    6
    tar -c	# 创建新的归档文件(create)
    tar -x # 解压/提取压缩包文件(extract)
    tar -t # 列出压缩包中的内容,不解压(list)
    tar -r # 向压缩包中的末尾追加文件(append)
    tar -u # 仅追加比压缩包中更新的文件(update)
    tar -d # 比较压缩包文件与文件系统的差异(diff)
    • 注意,压缩后的归档文件不能使用 -r 追加文件

    然后是压缩方式的选项

    1
    2
    3
    4
    5
    tar -z	# 使用gzip压缩/解压(.tar.gz或.tgz)
    tar -j # 使用bzip2压缩/解压(.tar.bz2)
    tar -J # 使用xz压缩/解压(.tar.xz)
    tar --zstd # 使用zstd压缩/解压(.tar.zst)
    tar -I 命令 # 使用指定的压缩程序

    常用附加选项如下

    1
    2
    3
    4
    tar -f 文件名	# 指定归档文件名;短选项连写时 -f 后须紧跟文件名
    tar -v # 显示详细过程(verbose)
    tar -C 目录 # 切换到指定目录后再操作(change)
    tar -k # 解压时不覆盖已存在的文件(keep)
    • -f 不必是所有选项中的最后一个,但它的参数必须紧跟其后。例如 tar -czvf 包.tar.gz 目录 中 -f 后是包名。

    那么,这些选项是需要组合起来使用的,常用的组合如下

    • 压缩和打包操作

      1
      2
      3
      4
      5
      tar -cvf backup.tar 目录名	   # 仅打包不压缩(创建.tar文件)
      tar -czvf backup.tar.gz 目录名 # 使用gzip压缩(最常用)
      tar -cjvf backup.tar.bz2 目录名 # 使用bzip2压缩(压缩率更高)
      tar -cJvf backup.tar.xz 目录名 # 使用xz压缩(压缩率最高)
      tar -czvf backup.tar.gz 文件1 文件2 # 压缩多个文件
    • 解压和提取操作

      1
      2
      3
      4
      5
      tar -xvf backup.tar	    # 解压.tar文件
      tar -xzvf backup.tar.gz # 解压.tar.gz文件(最常用)
      tar -xjvf backup.tar.bz2 # 解压.tar.bz2文件
      tar -xJvf backup.tar.xz # 解压.tar.xz文件
      tar -xzvf backup.tar.gz -C /目标目录 # 解压到指定目录
    • 列出压缩包和归档包中的内容

      1
      2
      3
      4
      tar -tvf backup.tar	   # 列出.tar文件内容
      tar -tzvf backup.tar.gz # 列出.tar.gz文件内容
      tar -tjf backup.tar.bz2 # 列出.tar.bz2文件内容
      tar -tvf backup.tar | grep 文件名 # 搜索归档中的特定文件
  4. rar:他也是压缩和解压文件的命令,它是一类命令,他需要需额外安装

    1
    2
    rar [命令] [选项] 压缩包名.rar 文件或目录
    unrar [命令] [选项] 压缩包名.rar

    常用命令就这些

    1
    2
    3
    4
    5
    6
    7
    rar a archive.rar 文件名	# 添加文件到压缩包
    rar a -r archive.rar 目录名 # 递归压缩目录
    rar a -p archive.rar 文件名 # 交互式输入密码,避免密码出现在命令历史中

    unrar x archive.rar # 保留完整路径
    unrar e archive.rar # 解压所有文件到当前目录
    unrar l archive.rar # 列出内容
  5. zip:linux 下提供了 zip 和 unzip 程序,zip 是压缩程序,unzip 是解压程序,日常以 Linux 为主系统的使用者会经常使用它们打包日常文件。它们的参数选项很多,这里只做简单介绍

    1
    2
    zip [选项] 压缩包名.zip 文件或目录
    unzip [选项] 压缩包名.zip

    一般来说,包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    zip -r archive.zip 目录名   # 压缩目录
    zip archive.zip 文件1 文件2 # 多文件压缩
    zip -e archive.zip 文件名 # 加密压缩会提示输入密码

    unzip 文件.zip # 解压到当前目录
    unzip 文件.zip -d 目录 # 解压到指定目录
    unzip -l 文件.zip # 列出压缩包内容(不解压)
    unzip -v 文件.zip # 详细列出压缩包内容
    unzip 文件.zip # 加密包会提示输入密码,避免在命令行明文传参
  6. ln:创建链接

    1
    ln [选项] 源文件 链接名

    用的很少,一般可能是创建快捷方式使用

    1
    2
    3
    4
    ln 源文件 链接名	    # 创建硬链接
    ln -s 源文件 链接名 # 创建软链接/符号链接(symbolic)
    ln -f 源文件 链接名 # 强制创建,覆盖已存在的链接
    ln -v 源文件 链接名 # 显示创建过程
  7. rsync :文件同步工具,用在本地或远程系统之间同步文件和目录

    增量传输使得它运行非常快

    1
    rsync [选项] 源文件 目标文件

    而且我们一般带着使用 -a 标记,它代表归档,而且可以递归地同步,并且保留各种原始信息,比单独的一个-r更好用

    而且-P 标记也很有用。它结合了 --progress 和 --partial 两个标记。第一个标记会为传输提供进度条,第二个标记允许你恢复中断的传输。

    1
    2
    3
    4
    rsync -av 源 目标	   # 本地同步,归档模式+显示过程
    rsync -avP 本地源 用户@主机:目标路径 # 本地同步到SSH远程,最常用,没有之一
    rsync -av 用户@主机:远程源路径 本地目标 # 从远程同步到本地
    rsync -av --progress 源 目标 # 显示传输进度

    排除多个模式时重复写 --exclude,例如 rsync -av --exclude="*.log" --exclude="cache/" 源/ 目标/。注意:源/ 同步的是目录内的内容;源 同步目录本身。加 --delete 会删除目标端多余文件,先用 -n 预览。

  8. sort:按行排序

    1
    2
    3
    4
    5
    sort 文件名             # 按字典序排序,默认升序
    sort -n 数字文件 # 按数字排序
    sort -r 文件名 # 逆序
    sort -u 文件名 # 排序并去重
    sort -t ':' -k 3,3n /etc/passwd # 按第 3 列 UID 数值排序

    sort 只把结果输出到终端,不会直接修改原文件;需要保存时使用 sort 文件名 -o 文件名。

查找文件或者内容

  1. find:在指定目录及其子目录中搜索文件或目录查询,非常强大灵活

    1
    find [搜索的路径] [条件] [搜完的动作]

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # 按文件名查找
    find /etc -name "nginx.conf" # 精确查找
    find . -name "*.log" # 当前目录下所有 .log 文件
    find /home -iname "readme.txt" # -iname 不区分大小写

    # 按文件类型查找
    # f=普通文件, d=目录, l=符号链接, b=块设备, c=字符设备, p=管道
    find . -type f # 只找普通文件
    find . -type d # 只找目录
    find . -type l # 只找软链接

    # 按文件大小查找,+ 表示大于,- 表示小于,单位,c(字节), k(KB), M(MB), G(GB)
    find . -size +100M # 大于 100MB
    find . -size -10k # 小于 10KB
    find . -size 1G # 大小向上取整后为 1 GiB(并非精确等于 1 GiB)

    # 按修改时间查找,这个很常用了
    find . -mtime -3 # 3天内修改过
    find . -mtime +7 # 7天前修改过
    find . -mmin -10 # 10分钟内修改

    # 按访问时间查找
    find . -atime +30 # 30天未访问

    # 按状态变更时间
    find /etc -ctime -1 # 最近 1 天内元数据发生变化;ctime 不是创建时间

    # 找到条件后删除
    find /var/log -type f -name "*.log" -print # 先确认匹配结果;确需删除时再改为 -delete

    find 找到文件后可用 -exec 执行命令;xargs 是另一条独立命令,处理特殊文件名时需配合 -print0 和 xargs -0。

    • 对于-exec

      1
      find /路径 -exec 命令 {} \;	# {} 代表找到的文件,\; 是命令结束符
      1
      2
      3
      4
      5
      6
      # 找到所有.log文件并删除(加 -ok 会交互式确认)
      find . -type f -name "*.log" -mtime +30 -print # 先预览匹配结果
      find . -type f -name "*.log" -mtime +30 -ok rm {} \; # 确认无误后逐个确认删除

      # 找到大文件并查看详情(ls -lh)
      find . -size +1G -exec ls -lh {} \;

    对于删除,就是find /路径 -delete,它能查找并删除文件

    如果安装了 fd,按文件名查找更简洁。Debian/Ubuntu 的 fd-find 软件包通常提供命令 fdfind,可先运行 command -v fdfind 检查。

  2. which:查找命令的可执行文件路径

    1
    which [选项] 命令名
  3. whereis :查找文件位置

    1
    whereis [选项] 文件名

    包括

    1
    2
    whereis 文件	# 查找文件的二进制、源码、手册位置
    whereis -l # 显示搜索路径
  4. grep:在文件内容里搜文字

    1
    grep [选项] "搜索词" [文件...]

    包括

    1
    2
    3
    4
    5
    6
    grep "error" app.log         # 在文件里搜 error
    grep -i "info" app.log # 不区分大小写
    grep -n "warn" app.log # 显示行号
    grep -r "localhost" /etc/ # 递归搜目录下所有文件
    grep --color=auto "root" /etc/passwd # 高亮显示
    grep -v "quartz" qq.log # 反向匹配,显示不包含关键词的行
  5. locate:基于数据库超快查找

    locate 不直接扫描磁盘,而是查询预建的数据库,通常每天自动更新一次,因此速度极快,但结果可能不是最新的。

    1
    locate [选项] 文件名模式

    包括

    1
    2
    3
    4
    locate php.ini         # 查找php.ini
    locate -i "*.conf" # 忽略大小写查找
    locate /etc/passwd # 查找路径中包含 /etc/passwd 的记录
    sudo updatedb # 手动更新 locate 数据库
  6. look:look指令用于英文单字的查询。给予它欲查询的字首字符串,它会显示所有开头字符串符合该条件的单字。

    1
    look [选项] [字首字符串] [字典文件]

    包括

    1
    2
    3
    4
    look L test    # 在 test 文件中查找以 L 开头的行
    look -f L test # 在test中查找以"L"开头的单词,并且忽略大小写
    look -t ':' L test # 使用 -t 指定终止字符为冒号,-t <字符>设置字尾字符串
    look -d L test # 只比较字母数字,忽略标点符号

文件权限相关

主要就是一个命令,chmod

  1. chmod:修改文件权限

    1
    chmod [选项] 权限 文件或目录

    至于那个数字如何算,在这里只简单说说

    r(读)=4、w(写)=2、x(执行)=1、-(无权限)=0;u 是所有者,g 是所属组,o 是其他用户,a 是所有用户。三个八进制数字依次代表所有者、所属组、其他用户的权限。

    一般来说,常用的就是下面这些

    1
    2
    3
    4
    5
    6
    7
    8
    9
    chmod 755 文件名	# 数字方式设置权限(rwxr-xr-x)
    chmod +x 文件名 # 添加执行权限
    chmod -x 文件名 # 移除执行权限
    chmod u+x 文件名 # 给所有者添加执行权限
    chmod o-w 文件名 # 给其他人移除写权限
    chmod a+x 文件名 # 给所有人添加执行权限
    chmod -R 755 目录 # 递归修改(会使所有普通文件也可执行,使用前先确认)
    chmod -v 755 文件名 # 显示修改过程
    chmod -c 755 文件名 # 仅显示有变化的文件
  2. chown:修改文件所有者

    1
    chown [选项] 所有者:组 文件或目录

    这个用的比较少

    1
    2
    3
    4
    chown 用户 文件名	# 修改文件所有者
    chown 用户:组 文件名 # 同时修改所有者和组
    chown :组 文件名 # 仅修改文件所属组
    chown -R 用户:组 目录 # 递归修改目录及子文件

用户相关操作

sudo

sudo 全称为 Super User DO,允许授权用户以其他用户(通常是 root 用户)的身份执行命令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

有很多命令需要管理员权限才能使用,可以输入命令前加sudo,也可以直接切换到管理员再执行。

终端的命令行最右边的字符代表了你是不是管理员

1
2
$  普通用户
# 管理员用户

使用 sudo 很简单

1
sudo [选项] 命令

使用时候几乎不使用 sudo 的子选项的命令

用户操作

  1. adduser:添加新用户,useradd是它的原生命令,默认提供交互式引导,会自动创建用户家目录、设置默认 Shell、生成用户组等工作

    1
    adduser [选项] 用户名

    包括

    1
    2
    adduser --ingroup dev ErgouTree  # 将 ErgouTree 的主组设为已有 dev 组(Debian/Ubuntu)
    adduser ErgouTree dev # 把已有用户加入已有附加组(Debian/Ubuntu)

    adduser 在 Debian/Ubuntu 通常是交互式封装;在其他发行版上可能只是 useradd 的链接,具体行为应以本机手册为准。

  2. useradd:创建新用户账户

    这是底层命令,通常不交互;是否默认创建家目录、使用哪个 Shell 由发行版和 /etc/default/useradd 等配置决定。

    1
    useradd [选项] 用户名

    包括

    1
    2
    3
    4
    5
    6
    7
    useradd -d /home/zs ErgouTree    # 指定家目录
    useradd -m ErgouTree # 添加用户同时自动创建家目录
    useradd -m -s /bin/bash ErgouTree # 指定登录 Shell
    useradd -m -g dev ErgouTree # 指定主用户组
    useradd -m -G dev,test,ops ErgouTree # 指定加入多个附加组
    useradd -m -u 10086 ErgouTree # 指定 UID
    useradd -r nginx # 创建系统用户,无家目录
  3. usermod:修改用户帐号信息

    这个命令是用于修改已存在用户的所有属性(UID、用户组、家目录、Shell、过期时间等),是运维中调整用户权限和配置的核心命令,修改前建议先确认用户未登录

    1
    usermod [选项] 用户名

    包括

    1
    2
    3
    4
    5
    6
    7
    usermod -u 10099 ErgouTree       # 修改 UID
    usermod -g admin ErgouTree # 修改主用户组
    usermod -G dev,test ErgouTree # 修改附加组,覆盖原有
    usermod -aG ops ErgouTree # 添加附加组,不覆盖
    usermod -d /home/ErgouTree_new ErgouTree # 修改家目录路径
    usermod -md /home/ErgouTree_new ErgouTree # 移动家目录(修改 + 迁移)

  4. login:登陆系统

    login 主要由终端登录程序调用,在已有交互式 shell 中不适合作为通用切换用户方法。切换用户可用 su - 用户名 或 sudo -iu 用户名;重新加载 Bash 配置通常用 source ~/.bashrc。

    1
    login [选项] [用户名]

    包括

    1
    2
    su - ErgouTree        # 以登录 shell 切换用户
    sudo -iu ErgouTree # 有 sudo 授权时切换用户
  5. logout:注销当前用户

    logout 用于退出当前登录的 Shell 会话,仅在登录 Shell 中生效,区别于exit:logout 专用于注销用户,exit 可退出任意 Shell

    1
    logout      # 执行后直接退出当前用户,回到登录界面
  6. userdel:删除用户的账号,若不加参数,则仅删除用户帐号,而不删除相关文件

    1
    2
    userdel [-r] [用户帐号]
    # -r 是删除用户登入目录以及目录中所有文件。

查看用户

  1. logname:显示当前登陆的用户名

    logname 是只读当前登录会话用户名的极简命令,直接读取系统登录记录,仅返回启动当前会话的原始登录用户,忘记名了用这个

    1
    logname

    我说:logname ≠ whoami

    • logname:显示登录会话的原始用户(不受 su/sudo 影响);
    • whoami:显示当前有效用户(su 切换后显示切换后的用户);
  2. w:显示登录用户信息

    w 是全能型用户监控命令,不仅显示当前所有登录用户,还能看到每个用户的登录时间、来源 IP、正在执行的命令、系统负载等,是运维排查 “谁在操作服务器、服务器负载高是否和用户操作有关” 的核心工具。

    1
    w [选项] [用户]

    包括

    1
    2
    3
    4
    w -h        # 仅显示用户信息,无列名
    w -u # 查询当前进程和 CPU 时间时使用用户名(通常默认开启)
    w -s # 短格式,省略 JCPU/PCPU/登录时间等列
    w ErgouTree # 只看该用户的登录和操作信息
  3. finger:查询用户信息

    finger 可显示用户登录名、家目录、Shell 等信息,也可能读取 .plan/.project;它不是查询 UID/GID 的首选工具,UID/GID 用 id。不少系统需要另行安装。

    1
    finger [选项] [用户名]

    包括

    1
    2
    3
    4
    finger ErgouTree        # 显示用户完整信息
    finger -l ErgouTree # 长格式输出(更详细)
    finger -s ErgouTree # 短格式输出
    finger -p ErgouTree # 长格式中省略 .plan/.project 内容
  4. who:显示登录用户

    who 是轻量级登录用户查询命令,比w简单,仅显示用户名、终端、登录时间、来源 IP 等基础信息,无负载 / 进程信息,适合快速排查 谁登录了服务器,是运维最常用的基础命令之一。

    1
    who [选项] [文件]
    image-20260220011908901

    包括,就用过这几个

    1
    2
    3
    4
    5
    who -r	# 显示运行级别
    who -u # 显示活跃用户
    who -a # 显示所有信息
    who -b # 显示系统启动时间
    who -m # 等价于who am i,显示当前登录的用户和 IP

    whoami 显示当前有效用户;用 sudo 或 su 后可能与最初登录的用户名不同。

  5. id:显示用户和组id

    id 是 用户 / 组 ID 查询命令,精准显示用户的 UID、GID、所属所有附加组 ID 及名称,是运维排查 权限问题 的时候用到过,因为多数权限问题本质是 UID/GID 不匹配。

    1
    id [选项] [用户名]

    包括

    1
    2
    3
    4
    5
    id ErgouTree     # 显示用户完整 ID 信息
    id -u ErgouTree # 仅显示 UID
    id -g ErgouTree # 仅显示主组 GID
    id -G ErgouTree # 仅显示所有组的 GID
    id -un ErgouTree # 显示用户名;`-n` 需与 `-u`、`-g` 或 `-G` 配合
  6. last:显示最近登录的用户

    last 读取/var/log/wtmp文件,显示系统所有用户的登录 / 注销记录、系统重启记录,是运维审计 “谁登录过服务器、登录时间 / IP、是否异常登录” 的核心工具,可追溯近几个月的登录历史

    1
    last [选项] [用户名/终端]

    包括

    1
    2
    3
    4
    5
    last     # 显示所有登录记录,最新记录在前
    last -n 10 # 仅显示前 N 条记录
    last ErgouTree # 排查 ErgouTree 的登录历史
    last -x # 显示系统关机 / 重启记录
    last -i ErgouTree # 强制显示 IP

组操作

  1. groupadd:创建新用户组

    创建一个新的用户组,用于统一管理一批用户。·

    1
    groupadd [选项] 组名

    包括

    1
    2
    3
    4
    groupadd dev         # 创建普通组
    groupadd -g 1005 test # 指定 GID 创建组
    groupadd -r nginx # 创建系统组
    groupadd -f dev # 如果组已存在则不报错退出,并非强制覆盖

    组信息存在 /etc/group

    组密码存在 /etc/gshadow

    系统组一般用于服务(nginx、mysql、docker),普通组用于业务用户

    GID 尽量不要重复,否则会出现权限错乱

  2. groupdel:删除用户组

    删除一个已经存在的用户组。

    1
    groupdel 组名

    如果组是某个用户的主组,不能直接删!必须先删用户,或修改用户主组。

  3. gpasswd:管理组内用户

    基本是最常用的了,把用户加入组、从组里删除、设置组管理员等

    1
    gpasswd [选项] 组名

    包括

    1
    2
    3
    gpasswd -a ErgouTree dev        # 把用户加入组
    gpasswd -d ErgouTree dev # 从组里删除用户
    gpasswd -A ErgouTree dev # 设置组的管理员
  4. groupmod:修改用户组信息

    1
    groupmod [选项] 组名

    包括

    1
    2
    groupmod -n newname oldname        # 修改组名
    groupmod -g 1008 dev # 修改组id

    文件系统保存的是数字 GID。修改组的 GID 后,旧文件上的 GID 不会自动变化,可能显示为未知组;需要盘点并按需迁移文件归属。

  5. groups:查看用户属于哪些组

    快速查看一个用户的所有附加组 + 主组。

    1
    groups [用户名]
  6. getent:正确查询组 / 用户信息

    getent 通过 NSS 查询用户/组信息,可包含 LDAP 等目录服务中的账户;直接读 /etc/group 只看到本地记录。

    1
    getent group dev

进程相关

进程查看

  1. ps:显示进程状态

    ps 命令用于显示当前时刻的进程快照。它不会实时更新

    1
    2
    ps
    # 默认只显示当前终端下属于当前用户的进程。信息较少,通常不够用。

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ps -e
    # 显示系统中的所有进程 (e 代表 everyone)。等同于 ps -A。

    ps -f
    # 使用完整格式 (full-format) 显示,包含 UID, PID, PPID, C, STIME, TTY, TIME, CMD 等列。

    ps -ef
    # 结合 -e 和 -f。显示系统中所有进程的完整信息列表。
    # 常用于查找特定进程的 PID 或父进程 ID (PPID)。

    ps aux
    # a: 显示所有终端下的进程 (不仅是当前终端)。
    # u: 以用户为主的格式显示 (包含 %CPU, %MEM, VSZ, RSS 等资源占用)。
    # x: 显示没有控制终端的进程 (通常是后台守护进程)。
    # 这是查看系统资源占用(CPU/内存)最直观的方式。

    ps -u <用户名>
    # 仅显示指定用户的所有进程。例如: ps -u root

    ps -p <PID>
    # 仅显示指定 PID 的进程信息。例如: ps -p 1234

    ps -C <命令名>
    # 通过命令名称查找进程。例如: ps -C nginx
  2. top:实时显示进程信息

    它会提供实时动态的系统视图,类似于 Windows 的任务管理器。

    它会定期刷新(默认 3 秒),显示系统负载、CPU、内存使用情况以及进程列表。

    1
    top [选项]

    对于top,参数如下

    1
    2
    3
    4
    top	       # 启动实时监控界面
    top -d 秒数 # 设置刷新间隔
    top -p PID # 监控指定进程
    top -n 次数 # 显示指定次数后退出
  3. pstree:树状显示进程

    以树形结构显示进程,清晰地展示了进程之间的父子关系

    1
    pstree     # 显示所有进程的树状结构。

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    pstree -p
    # 显示进程树的同时,在每个进程名后显示其 PID。

    pstree -u
    # 显示进程所属的用户名。

    pstree -a
    # 显示完整的命令行参数 (Arguments)。

    pstree -l
    # 长行模式 (Long lines)。

    pstree <PID>
    # 显示指定 PID 进程及其所有子进程的树状结构。

    pstree <用户名>
    # 显示指定用户启动的所有进程树。

    pstree -s <PID>
    # 显示指定 PID 进程的父进程链 (Show parents)。
    # 从该进程一直回溯到 init/systemd 根进程。
    # 用于回答“这个进程是谁启动的?”这个问题。

    pstree -t
    # 显示线程 (Threads)。
    # 默认不显示线程,加上 -t 后,进程下的线程会用花括号 {} 包裹显示。

    pstree -G
    # 使用 VT100 线绘图字符 (Lines) 绘制树。
    # 默认可能使用 ASCII 字符 (-A),-G 在某些终端下显示更美观的连线
  4. htop:增强版 top

    1
    htop     # 启动交互式进程查看器。

    包括

    1
    2
    3
    4
    5
    htop -p <PID>
    # 启动时直接聚焦并监控指定 PID 的进程。

    htop -u <用户名>
    # 启动时仅显示指定用户的进程。
  5. pidof 和 pgrep:快速查找 PID

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    pidof <程序名>
    # 返回指定程序名的所有 PID。

    pgrep <关键词>
    # 根据名称或其他属性查找进程 PID。

    pgrep -l <关键词>
    # 列出 PID 的同时显示进程名称。
    # 例如: pgrep -l ssh
    # 输出: 800 sshd, 1234 sshd

    pgrep -u <用户名> <程序名>
    # 注释: 查找特定用户运行的特定程序 PID。
    # 例如: pgrep -u www-data nginx

操作进程

  1. kill:通过 PID kill进程。

    1
    kill <PID>
  2. pkill:匹配模式终止进程

    pkill 是 kill 命令的增强版,它不需要知道具体的 PID,而是通过进程名、用户名、终端等属性进行正则匹配来发送信号

    1
    pkill <进程名>    # 终止所有名称匹配该字符串的进程。

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    pkill -f <完整命令行>
    # 注释: 匹配完整的命令行参数 (Full command line)。
    # 默认匹配进程名,加 -f 后匹配完整命令行;执行前可先用 pgrep -af 模式核对。
    # 例如: pkill -f "python script.py" 可以精准杀掉运行特定脚本的进程。

    pkill -u <用户名>
    # 注释: 终止指定用户拥有的所有进程。
    # 例如: pkill -u guest (强制下线 guest 用户的所有进程)。

    pkill -t <终端名>
    # 注释: 终止在指定终端上运行的所有进程。
    # 例如: pkill -t pts/0 (踢出挂在 pts/0 终端上的所有用户进程)。

    pkill -SIGKILL <进程名>
    # 注释: 发送 SIGKILL 信号 (信号 9),强制立即终止进程,无法被捕获或忽略。

    pkill -SIGTERM <进程名>
    # 注释: 发送 SIGTERM 信号 (信号 15),请求进程优雅退出。
    # 这是默认行为,允许进程保存数据或清理资源后退出。

    pkill -n <进程名>
    # 注释: 仅终止匹配到的最新 (Newest) 的那个进程。
    # 当有多个同名进程时,只杀最后启动的那个。

    pkill -o <进程名>
    # 注释: 仅终止匹配到的最旧 (Oldest) 的那个进程。
    # 当有多个同名进程时,只杀最早启动的那个。

    pkill -P <父进程PID>
    # 注释: 终止指定父进程的所有子进程。
    # 例如: pkill -P 1234 (杀掉 PID 为 1234 的进程的所有直接子进程)。
  3. killall:按名称终止所有匹配的进程

    Linux 上的 killall 按进程名匹配;过长的进程名可能被内核截断,因此 -e 可要求更严格的匹配。不同系统的 killall 行为可能不同。

    1
    2
    3
    killall <进程名>
    # 注释: 终止所有名称完全匹配该字符串的进程。
    # 例如: killall httpd (只会杀名字叫 httpd 的,不会杀 httpd-worker)。

    包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    killall -i <进程名>
    # 注释: 交互式模式 (Interactive)。
    # 在杀死每个进程前都会询问用户确认 (y/n),防止误杀。

    killall -v <进程名>
    # 注释: 显示详细信息 (Verbose)。
    # 报告是否成功杀死了进程,或者是否没有找到该进程。

    killall -e <进程名>
    # 注释: 严格匹配 (Exact)。
    # 对过长的进程名要求更严格的匹配,减少误杀。
    # 防止因名称相似而误杀其他进程。

    killall -g <进程名>
    # 注释: 杀死进程组 (Process Group)。
    # 不仅杀死进程本身,还杀死属于该进程组的所有进程。

    killall -w <进程名>
    # 注释: 等待进程终止 (Wait)。
    # 命令会阻塞,直到所有匹配的进程都完全消失才返回。
    # 常用于脚本中,确保旧进程彻底结束后再启动新进程。
  4. skill:按条件终止进程

    skill 是一个较老的命令,功能与 pkill 高度重叠,主要用于向符合条件的进程发送信号。

    1
    skill <信号名> <进程名>
  5. exit:退出终端会话

    exit 用于终止当前的 Shell 会话或退出远程连接。

    1
    exit
  6. nohup:忽略挂断信号,让命令在终端断开后仍可继续运行。常见写法:nohup 命令 > app.log 2>&1 &;& 使其进入后台。它不负责服务自启,长期运行的服务更适合交给 systemd。

  7. timeout:限制命令运行时间

    timeout 命令用于运行另一个命令,如果该命令在指定时间内未完成,则自动将其终止。

    这对于防止脚本死锁、长时间挂起的任务非常有用。

    1
    timeout [选项] 时间 命令

    包括

    1
    2
    3
    4
    5
    timeout 时间 命令	# 限制命令执行时间
    timeout -s 信号 时间 命令 # 超时后发送指定信号
    timeout 10 命令 # 10 秒后终止命令
    timeout 5m 命令 # 5 分钟后终止命令
    timeout 1h 命令 # 1 小时后终止命令

网络

网络工具不是每台机器都预装。先用 command -v 命令名 检查;接口名称也不一定是 eth0,用 ip link 看实际名称。

网络通信

  1. nc:Netcat,可测试 TCP/UDP 连接或临时监听端口

    1
    2
    3
    nc -vz example.com 443      # 探测 TCP 443 端口;-z 不传数据,-v 显示详情
    nc -l 8080 # 监听本机 8080 端口(不同实现的参数略有差异)
    nc -u -vz example.com 53 # UDP 探测只能作初步判断,不能保证服务可用

    不同发行版提供 OpenBSD nc、传统 Netcat 或 Nmap 的 ncat,选项要以 nc -h 为准。监听端口时注意防火墙与访问范围。

  2. nmcli:NetworkManager 的网络配置工具

    原提纲中的 netconfig 不是通用 Linux 命令;NetworkManager 环境下更常见的是 nmcli。服务器也可能改用 systemd-networkd、Netplan 等方案。

    1
    2
    3
    4
    nmcli device status                # 查看网卡和连接状态
    nmcli connection show # 查看连接配置
    nmcli device wifi list # 搜索 Wi-Fi(设备支持时)
    nmcli connection up "连接名" # 启用连接

    远程修改网络连接可能让 SSH 断线,改配置前先确认回退方式。

  3. telnet:传统远程终端协议,也可做简单 TCP 连通测试

    1
    telnet example.com 80              # 尝试连接 TCP 80 端口

    Telnet 不加密登录内容,远程登录优先用 SSH。测试端口时更常用 nc -vz。

  4. ifconfig:旧式网卡查看/配置工具

    1
    2
    ifconfig                           # 查看网卡信息(需安装 net-tools)
    ip address show # 现在更常用的地址查看方式
  5. ssh:加密远程登录

    1
    2
    3
    4
    ssh 用户名@主机地址               # 默认连接 22 端口
    ssh -p 2222 用户名@主机地址 # 指定端口
    ssh -i ~/.ssh/id_ed25519 用户名@主机地址 # 指定私钥
    ssh 用户名@主机地址 'hostname' # 在远端执行单条命令

    首次连接要核对主机指纹;私钥不要发给别人。传文件可用 scp 或上文的 rsync -e ssh。

网络管理和工具

  1. ip:查看与配置地址、链路、路由

    1
    2
    3
    4
    5
    ip address show                    # 查看 IP 地址(简写:ip a)
    ip link show # 查看网络接口状态
    ip route show # 查看路由表
    ip route get 1.1.1.1 # 查看访问该地址将采用的路由
    sudo ip link set dev eth0 up # 启用网卡;eth0 换成实际接口名

    直接用 ip 添加的地址/路由通常只在当前运行期间生效;持久配置要用发行版的网络管理方案。

  2. curl:发送 HTTP 等网络请求

    1
    2
    3
    4
    5
    curl -I https://example.com        # 只看响应头
    curl -L https://example.com # 跟随重定向
    curl -o 文件名 https://example.com/file # 保存为指定文件
    curl -O https://example.com/file # 使用远端文件名保存
    curl -fsS https://example.com # 请求失败时返回非零状态,仍显示错误

    下载后要核对来源与校验值;不要直接执行未检查的远端脚本。

  3. ping:用 ICMP 检查连通性和往返延迟

    1
    2
    ping -c 4 example.com              # 发 4 个包后退出
    ping -W 2 -c 4 1.1.1.1 # 每次等待响应最多 2 秒(Linux)

    ping 不通也可能只是对方屏蔽了 ICMP,不能单凭它断定网站或 TCP 服务不可用。

  4. mtr:结合 ping 与 traceroute 的路径诊断工具

    1
    2
    mtr example.com                    # 交互查看路径
    mtr -rw -c 10 example.com # 报告模式,采样 10 次

    中间节点丢包不一定表示最终目标也丢包,要结合最后一跳分析。

  5. iperf3:网络带宽测试工具

    1
    2
    3
    4
    iperf3 -s                           # 在一台机器上启动服务端
    iperf3 -c 服务端IP # 在另一台机器上测客户端到服务端的吞吐量
    iperf3 -c 服务端IP -R # 反向测试
    iperf3 -c 服务端IP -t 10 # 测试 10 秒

    测试会占用实际网络带宽;生产环境应选择合适时间和目标。

  6. ss:查看套接字和监听端口

    1
    2
    3
    ss -tuln                            # 查看 TCP/UDP 监听端口
    ss -tan # 查看所有 TCP 连接
    sudo ss -tulnp # 同时显示关联进程(需要相应权限)

Linux应用程序的安装与卸载

不同发行版使用不同的软件包格式和仓库。执行安装、删除和系统升级前,先确认发行版:cat /etc/os-release。

软件包管理

  1. apt:Debian/Ubuntu 系的软件包管理前端(软件包格式通常是 .deb)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sudo apt update                    # 刷新仓库索引,不安装或升级软件
    apt list --upgradable # 查看可升级包
    sudo apt upgrade # 升级已安装软件包
    sudo apt install 包名 # 安装软件包
    sudo apt install --only-upgrade 包名 # 只升级已安装的指定包
    apt show 包名 # 查看软件包详情
    apt search 关键词 # 搜索软件包
    apt list --installed # 列出已安装包
    sudo apt remove 包名 # 卸载软件包,通常保留配置文件
    sudo apt purge 包名 # 卸载并删除包管理的配置文件
    sudo apt autoremove # 清理不再需要的自动安装依赖

    apt update 包名 不能更新指定软件包;update 只刷新软件源索引。脚本中常使用 apt-get,交互使用 apt 比较方便。系统升级前先阅读将安装/删除的包列表。

  2. dnf / yum:RPM 系发行版的软件包管理器

    Fedora、较新的 RHEL 系常使用 dnf;较旧的 RHEL/CentOS 系常使用 yum。SUSE 系主要使用 zypper,不应归入 yum。

    1
    2
    3
    4
    5
    sudo dnf install 包名              # 安装
    sudo dnf upgrade # 更新已安装的软件包
    sudo dnf remove 包名 # 卸载
    dnf search 关键词 # 搜索
    dnf info 包名 # 查看详情

    在使用 yum 的系统上,可把上例中的 dnf 换成 yum,但以本机帮助为准。

  3. dpkg / rpm:直接操作本地软件包

    1
    2
    3
    4
    sudo apt install ./软件包.deb      # 安装本地 deb,并尝试处理依赖
    dpkg -l # 列出已安装的 deb 包
    rpm -q 包名 # 查询已安装的 rpm 包
    sudo dnf install ./软件包.rpm # 安装本地 rpm,并尝试处理依赖

    优先使用发行版仓库及其包管理器,以便处理依赖和后续更新。

下载

  1. wget:命令行下载工具

    1
    2
    3
    4
    wget https://example.com/file     # 下载到当前目录
    wget -O 文件名 https://example.com/file # 指定保存文件名
    wget -c https://example.com/file # 尝试断点续传(服务端须支持)
    wget -P 下载目录 https://example.com/file # 指定保存目录
  2. curl:也能下载文件,常用于请求接口;选项见上文“网络管理和工具”。

    1
    curl -fL -o 文件名 https://example.com/file  # 失败返回非零,并跟随重定向

VIM

介绍 VIM

Vim 是在终端中编辑文本的工具,最需要先记住的是模式:普通模式用于移动和操作文本,插入模式用于输入,命令行模式用于保存和退出。vim 文件名 打开文件;如果文件不存在,保存时会创建。按 Esc 通常可回到普通模式。

常用的 VIM 命令

所在模式 按键/命令 作用
普通模式 i / a 在光标前 / 后进入插入模式
普通模式 o / O 在下方 / 上方新开一行并进入插入模式
插入模式 Esc 返回普通模式
普通模式 h j k l 左、下、上、右移动(方向键通常也可用)
普通模式 gg / G 跳到文件开头 / 末尾
普通模式 0 / $ 跳到当前行开头 / 末尾
普通模式 w / b 跳到下一个 / 上一个词
普通模式 dd / yy 删除(剪切)/ 复制当前行
普通模式 p / P 在光标后 / 前粘贴
普通模式 u / Ctrl-r 撤销 / 重做
普通模式 /关键词 + 回车 向下搜索;n 下一个,N 上一个
普通模式 :%s/旧/新/g 全文件替换;末尾加 c 可逐项确认
命令行模式 :w / :q 保存 / 退出(有未保存修改时 :q 会拒绝)
命令行模式 :wq / :q! 保存并退出 / 放弃修改退出
命令行模式 :set number 显示行号;:set nonumber 关闭

记忆顺序:先按 Esc,再输入 :wq 保存退出;只想退出不保存则输入 :q!。在普通模式直接输入 :行号 可以跳转到指定行。

Linux命令机制

下面示例以 Bash 为主;其他 Shell 的语法可能不同。命令中的半角标点需要按原样输入。

Shell 的特殊字符

字符 作用 示例
* / ? 文件名通配:任意多个字符 / 单个字符 ls *.log
~ 当前用户的家目录 cd ~/Downloads
$变量 / ${变量} 读取变量值 echo "$HOME"
$(命令) 使用命令的输出 echo "$(date +%F)"
'...' 单引号内基本按字面处理,不展开变量 echo '$HOME'
"..." 双引号内会展开变量/命令替换,但保留空格为一个参数 echo "$HOME"
\ 转义下一个字符 echo \$HOME
# 注释(在合适的语法位置) echo ok # 注释

路径或变量值可能含空格时,优先加双引号,例如 cp "$源文件" "$目标目录/"。单引号和双引号的行为不同。

一行执行多条命令

这里用的是半角 ;,不是中文全角 ;。

1
2
3
4
5
命令1; 命令2             # 顺序执行,无论命令1成功与否
命令1 && 命令2 # 命令1成功(退出码为 0)才执行命令2
命令1 || 命令2 # 命令1失败(退出码非 0)才执行命令2
命令 & # 在后台启动命令
echo $? # 查看上一条命令的退出状态

输出重定向

Linux 命令常用三个标准流:标准输入 0、标准输出 1、标准错误 2。

1
2
3
4
5
6
命令 > 文件               # 把标准输出写入文件;文件已有内容会被覆盖
命令 >> 文件 # 追加标准输出
命令 2> 错误.log # 只保存标准错误
命令 > 输出.log 2>&1 # 标准输出和错误都写入同一文件
命令 &>> 全部.log # Bash 中追加标准输出和错误
命令 > /dev/null 2>&1 # 丢弃两种输出

重定向按从左到右处理;命令 2>&1 > 文件 与 命令 > 文件 2>&1 的结果不同。用 > 前先确认目标文件,避免覆盖数据。

输入重定向

1
2
3
wc -l < 文件              # 从文件读取标准输入,只显示行数
sort < 原文件 > 排序后文件 # 输入来自原文件,输出写入新文件
grep -i error <<< "Error happened" # Bash here-string:将字符串作为输入

<<结束符 可输入多行内容,直到遇到单独一行的结束符:

1
2
3
4
cat <<EOF
第一行
第二行
EOF

管道符

管道 | 把左侧命令的标准输出作为右侧命令的标准输入;标准错误默认不进入管道。

1
2
3
ps -ef | grep nginx                 # 在进程列表中筛选
grep -i error app.log | tail -n 20 # 最近 20 条匹配行
find . -type f -print0 | xargs -0 -r wc -l # 正确处理带空格/换行的文件名(GNU xargs)

默认情况下,管道的退出状态通常是最后一个命令的状态;脚本中可用 set -o pipefail 让前面命令的失败也反映出来。

一些其他字符

1
2
3
4
{ echo A; echo B; } > 结果.txt  # 命令组共用一次重定向;大括号内末尾要有分号
(cd /tmp && pwd) # 子 shell 中切换目录,不改变父 shell 当前目录
echo {a,b,c} # Bash 大括号展开:a b c
echo $((2 + 3)) # 算术展开:5

命令行中看见的 |、>、&& 等符号由 Shell 解释,不是前后命令自身的参数。看不懂一条复杂命令时,可以先拆开各段,检查每段输出,再组合执行。

参考资料

  • GNU Bash 手册:https://www.gnu.org/software/bash/manual/
  • GNU Coreutils 手册:https://www.gnu.org/software/coreutils/manual/
  • util-linux 手册(fdisk、mount、lsblk 等):https://www.kernel.org/pub/linux/utils/util-linux/
  • 本机命令手册:man 命令名、命令名 --help