跳至主要內容

Linux 基础与常用命令笔记

大约 35 分钟

Linux 基础与常用命令笔记

参考教程 https://www.runoob.com/linux/linux-tutorial.htmlopen in new window

基本概念

路径

路径的表示方式

  • Linux 中, 使用 / 划分不同层级的目录
  • Linux 中存在以下四种特殊目录用于目录开头
    • / 表示根目录 (用于绝对路径)
    • ./ 表示当前工作目录 (用于相对路径)
    • ~/ 表示用户的主目录
    • .. 表示上一层目录
  • 目录与文件的表示
    • 通常以文件或目录的完整路径 (绝对或相对) 表示这一文件或目录
    • 表示目录时, 可以在最后加上 / 以强调这是一个目录, 对于以目录为参数的命令无法识别目录时, 可尝试使用此方法

Linux 根目录结构

Linux 的根目录中, 一般有如下目录

  • 一般文件目录
    • /home 存放各个用户的主目录, 一般主目录即 /home/<用户名>
    • /root root 用户的主目录
    • /bin 存放常用命令程序的二进制文件
    • /sbin/bin 类似, 但存放的是管理员使用的命令程序
    • /lib 存放系统基本的共享库文件
    • /usr 共享资源目录, 一般软件就安装在这个目录下
      • /usr/bin 安装软件的二进制程序目录
      • /usr/sbin 管理员软件的二进制程序目录
    • /etc 存放系统或程序所需的配置文件
    • /opt 一般为空, 用于安装如数据库等软件
    • /var 一般用于存放程序日志文件的目录
    • /tmp 临时文件目录, 用于存放程序运行的临时文件
  • 特殊文件目录
    • /run 记录程序运行时信息的目录, 每次重启时会被清空
    • /lost+found 一般为空, 当系统意外关机时将存放有关文件
    • /boot 系统启动时的核心文件目录
    • /mnt 其他文件系统的挂载目录, 例如 U 盘等将成为该目录下的一个特殊子目录
  • 设备文件目录 (该目录下的文件一般无法直接读取)
    • /sys 系统运行时的设备树
    • /dev 系统的外部设备以及虚拟设备 (如标准输入 stdin) 将被视为一个文件并存储在该目录中, 通过读写这些文件以访问设备
    • /srv 系统服务数据
    • /proc 系统内存的映射, 存储内核运行状态

命令与终端

命令的基本格式

  • 命令一般由执行命令的程序或命令头以及命令的参数组成
  • 命令程序位于环境变量 PATH 中时, 直接使用程序名即可, 否则应指出具体路径, 注意相对路径的命令需要 ./
  • 单字母选项可使用 - 开头, 可多个选项字母并列于一个 -
  • 多字母选项则使用 -- 开头, 且一般独立出现
  • 单字母的参数一般在 -x 后空一格写入参数内容
  • 多字母的参数一般在 --<x...> 后使用 = 写入参数内容
  • 对于由纯数字与字母的字符串可省略 ", 但除此之外的情况下, 最好加上 " (特别是含 * 的通配字符串)

终端常用的快捷键

作用于单终端的环境

  • Ctrl + C 向正在运行的程序发送信号 SIGINT 以终止程序的运行 (正常退出)
  • Ctrl + \ 向正在运行的程序发送信号 SIGQUIT 以退出程序的运行 (错误退出)
  • Ctrl + D 向正在接收标准输入的程序发送 EOF, 表示输入结束
  • Ctrl + Z 暂停并挂起当前正在运行的程序, 将返回被挂起程序的序号
    • 使用命令 bg <序号> 在后台继续运行被挂起的程序
    • 使用命令 fg <序号> 在前台继续运行被挂起或移至后台运行的程序
    • 通过此方式可在单终端下在多个程序间切换
  • Ctrl + L 清除屏幕上的内容

作用于图形交互环境

  • Ctrl + Shift + C 复制选中内容
  • Ctrl + Shift + V 粘贴选中内容
  • Ctrl + Shift + T 打开新的终端

文件管理

基础文件管理

  • cp [-dpria] <src> <dest> 复制文件或文件夹 (需要 -r/a 选项)
    • src 被复制文件的路径
    • dest 复制目标路径
    • -d 当被复制文件为软链接时, 则复制结果也为同一属性的软链接, 而不是复制原始文件
    • -p 同时复制文件的属性, 而不是默认属性
    • -r 递归复制目录以及目录下的文件, 默认情况下只能复制文件与空文件夹, 如果要复制包含文件的文件夹, 需要使用此命令
    • -i 如果 dest 存在, 则进行覆盖查询, 否则将直接覆盖
    • -a 相当于 -dpr, 一般复制时会开启此选项
  • rm [-rfi] <file> 删除文件
    • file 要删除的文件路径, 可使用通配符 *? 删除多个文件
    • -f 强制删除所有文件, 忽略不存在的文件
    • -r 递归删除目录即目录下的文件, 默认情况下只能删除文件, 如果需要删除文件夹即文件夹下的文件, 需要使用此命令
    • -i 在每个文件被删除前进行确认
  • mv [-i] <src> <dest> 移动 (重命名) 文件或文件夹
    • src 被移动文件的路径
    • dest 移动目标路径
    • -i 如果 dest 存在, 则进行覆盖查询, 否则将直接覆盖
  • touch <file> 更新 / 创建空文件
    • file 当文件存在时, 将更新文件修改时间, 否则创建空文件
  • cat [-n] <file> 输出文件内容
    • file 要输出的文件路径
    • -n 显示行号
  • tail [-n<num>] [-f [-pid=<pid>]] <file> 观察文件内容, 与 cat 不同, 该命令一般用于观察不断修改的文件, 可用于查看非文档的特殊文件或正在运行程序的日志文件
    • -n<num> 显示文件的最后 num 行内容, 默认为 10 行
    • -f 读取不断刷新的文件, 一般开启此选项
    • -pid=<pid> 刷新读取, 直到线程 pid 结束
    • file 读取的文件路径

关于查询文件属性的命令见文件属性小节的介绍

基础目录管理

  • pwd 获取当前工作文件夹
  • cd <dir> 修改当前工作文件夹
    • dir 文件夹路径
  • mkdir [-p] <dir> 新建文件夹
    • dir 新建的文件夹路径
    • -p 当给出路径的父文件夹不存在时, 自动递归创建
  • rmdir [-p] <dir> 删除空文件夹
    • dir 删除的文件夹路径
    • -p 当文件夹的父目录为空时, 一同删除

路径查询

  • dirname <文件路径> 获取文件所在目录
  • basename <文件路径> 获取文件
  • realpath <文件路径> 将路径格式转换为绝对路径

链接

命令 ln 可用于创建软链接或硬链接

ln [-sd] <src> <dest>

  • -s 创建软链接 (默认为硬链接)
  • -d 创建关于目录的硬链接 (需要管理员权限)
  • src 目标被链接文件
  • dest 创建的链接文件

关于软链接与硬链接有区别

  • 软链接 (符号链接)
    • 软链接的本质为一个指向被链接文件的文件
    • 当被链接文件被删除时, 软链接失效
    • 软链接可以跨文件系统创建
  • 硬链接
    • 硬链接本质为一个文件, 多个名称
    • 硬链接与被链接文件指向同一块存储空间
    • 当文件被删除时, 文件依然存在, 链接依然有效
    • 硬链接不可跨文件系统创建

查找文件

命令 find 可用于通过文件的基本属性, 查找需要的文件, 对查找结果的处理需要在命令中确定

find [dir] [expression] [act] \;

  • dir 要查找的目录
    • 可以有多个目录, 使用空格划分
    • 没有给出时默认为当前工作目录
    • 注意, 目录的末尾需要有 /
  • expression 查找条件, 允许多个查找条件同时使用, 常用的有
    • -name <文件名> 按文件名筛选, 支持通配符 *?, 使用时最好加上 "
    • -type <文件类型> 按文件类型筛选, 有文件类型
      • f 一般文件
      • d 目录
      • l 链接
    • -size <比较方式><文件大小><大小单位> 按文件大小筛选
      • 比较方式: 使用 + 表示大于, - 表示小于
      • 文件大小: 配合单位使用
      • 大小单位: 常用的单位有 c 字节, k kb, M mb, G gb
    • -[a|c]time <比较方式><天数> 按时间筛选
      • [a|c] 使用 a 表示查询最近访问时间, 使用 c 表示查询最近修改时间
      • 比较方式: 使用 + 表示指定天数前, 使用 - 表示指定天数内, 无修饰表示指定天数时
      • 天数: 即 24 小时
  • act 对查找结果执行动作, 一般位于最后
    • -exec <命令> \; 对查找结果执行命令, 并且命令中使用 {} 代替查找结果, 使用 \; 表示命令结束, 常用有
      • -exec ls -l {} \; 查看查找结果的详细信息
      • -exec rm -i {} \; 删除查找到的结果
    • -print[0] 打印查找结果
      • 默认每个结果间都以换行分割, 加上 0 则使用 \0 分割
      • 当文件名过长时可能导致 -exec 发生错误, 此时推荐使用该选项配合管道与 xargs 命令实现类似效果

内容搜索

命令 grep 使用正则表达式, 可用于搜索单个文件, 多个文件以及标准输出 (使用管道或重定向) 中的内容

命令的基本格式为 grep [options] [files] 命令的常用的选项有

  • 搜索设置
    • -v 反向搜索不符合条件的内容
    • -i 搜索时忽略大小写
    • -F 仅匹配字符串, 不使用正则表达式
    • -E 使用扩展正则表达式 (建议开启)
    • -e<表达式> 待搜索的表达式, 默认为正则表达式
      使用时建议以 " 包裹表达式 允许有多个, 如果只有一个可省略 -e
  • 结果显示设置
    • -n 显示匹配行的行号
    • -o 只显示匹配到的文字 (默认将显示匹配结果所在的整行)
    • -Z 使用 \0 分割结果, 一般用于配合参数传递过滤器进行下一步处理
  • 多文件设置
    • -r 搜索文件内容时, 递归查找目录中的所有文件
    • --include <文件名> 配合 -r 使用, 仅搜索目录下具有指定文件名的文件 (可使用 *, ? 作为通配符, 建议使用 " 包裹文件名)
    • --exclude <文件名> 配合 -r 使用排除目录下具有指定文件名的文件 (可使用 *, ? 作为通配符, 建议使用 " 包裹文件名)

对于命令的 files 参数

  • 可以给出多个文件用于搜索
  • 如果启用了 -r, 还可以搜索指定文件加下的所有文件
  • 还可以通过管道, 搜索命令的结果

浏览文件内容

less [-fNx] <file>

  • file 要浏览的文件名 (除了指定文件名, 也可通过管道接收并浏览命令的输出)
  • -f 强制打开二进制, 设备与目录等非文档文件
  • -N 显示行号
  • -x<数字> 规定 tab 的显示为指定个数的空格

在浏览文件时, 可使用以下按键操作 (这一系列操作对于 man 命令同样适用)

  • /<str> 向下搜索字符串 str
  • ?<str> 向上搜索字符串 str
  • n 重复上一次搜索
  • N 反向重复上一次搜索
  • b 向上翻动一页, 也可使用按键 pageup
  • Space 向下翻动一页, 也可使用按键 pagedown
  • y 向上移动一行, 也可使用按键 up
  • Enter 向下移动一行, 也可使用按键 down
  • q 退出浏览

文件编辑

此处介绍通过 vim 完成文件编辑功能
使用 vim <file> 即可进入文件 file 的编辑

命令模式

在命令模式下可完成内容编辑与模式切换的操作
以下为常用的操作

  • 模式切换
    • i 在当前光标位置进入输入模式
    • o 在当前位置下一行插入新行, 并进入输入模式
    • : 进入底线命令行模式
  • 光标移动
    • <行号>G 移动到指定行
    • gg 移动到文件第一行
    • G 移动到文件最后一行
    • 0 移动行首
    • $ 移动行尾
    • [n]h 光标向左移动 n 格, 默认为 1
    • [n]j 光标向下移动 n 行, 默认为 1 (也可使用 Enter)
    • [n]k 光标向上移动 n 行, 默认为 1
    • [n]l 光标向右移动 n 格, 默认为 1
  • 内容搜索
    • /<word> 向下搜索匹配单词 word 的位置
    • /\v<pattern> 使用正则表达式 pattern 向下搜索
    • n 向下重复上一次搜索 (需要先使用 Enter 退出搜索内容的输入)
    • N 向上重复上一次搜索
  • 内容编辑
    • p 在当前光标位置的下一行粘贴内容
    • [n]dd 剪切 (删除) 光标所在行的数据, 有 n 时将剪切包括光标所在行在内向下 n 行的数据
    • [n]yy 复制光标所在行的数据, 有 n 时将复制包括光标所在行在内向下 n 行的数据
    • u 复原上一个动作
    • Ctrl + r 重做上一个复原
  • 文档跳转
    • gf 当光标指向一个路径时, 跳转到该路径的文档 (需要先使用 :w 保存修改)
    • Ctrl + o 回到跳转前的文档

输入模式

在该模式下正常接收键盘的输入以编辑内容
仅介绍部分按键的使用

  • Home 光标移动到行首
  • End 光标移动到行首
  • Page Up 向上翻页
  • Page Down 向下翻页
  • Esc 退出输入模式, 回到命令模式

底线命令行模式

在底线命令模式中, 可完成保存文档与设置等操作
一般将进入底线命令行模式的字符 : 也视为底线命令的一部分
常用的有

  • :w 保存文件
  • :w [file] 另存为 file
  • :q! 强制退出 vim 而不保存
  • :wq 保存并退出 vim
  • :set <设置> 在当前界面中设置 vim (具体见 vim 配置)

vim 配置

参考文档 https://www.cnblogs.com/rainouyang/p/13873345.htmlopen in new window

通过以下文件对 vim 进行配置

  • /etc/vim/vimrc 全局配置
  • ~/.vimrc 用户配置

在配置文件时

  • 使用 " 表示单行注释
  • 使用 set <选项[=值]> 进行配置

推荐的配置有

" 显示行号
set number
" 距离上下窗口 6 行时自动换行
set scrolloff=6
" 超出屏幕的行折行显示
set warn

" 在状态栏显示标尺
set ruler
" 在状态栏显示当前模式
set showmode
" 在状态栏显示当前命令
set showcmd

" 设置 tab 长度
set tabstop=4
" C/C++ 模式缩进
set cindent
" 自动缩进
set ai

" 不创建恢复文件 (默认会创建一个 . + 文件名 + .swp 恢复文件)
set noswapfile
" 使用 utf-8 编码
set encoding=utf-8

文件权限

文件属性

  • 文件类型
    • d 目录文件
    • l 软连接
    • c 串行端口设备
    • - 一般文件
  • 文件权限
    • r 读取权限
    • w 写入权限
    • x 执行权限
    • - 无权限
  • 文件属性字符
    • 0 位表示文件类型
    • 1-3 位确定文件所有者的权限 (owner, u)
    • 4-6 位确定与文件所有者同组的权限 (group, g)
    • 7-9 位确定其他用户的权限 (other, o)
  • 权限数字表示
    将文件属性字符的 1-3, 4-6, 7-9 位分别视为一个三位二进制数
    该二进制数的第一位对应 r, 第二位对应 w, 第三位对应 x
    当取 0 时, 表示 - 即无权限
    例如 761 对应了属性字符 rwxrw---x

注意

  • 对于 root 用户, 不受权限影响
  • 默认情况下创建文件的权限为 rw-r--r--

查看文件属性

ls [-luRa] [path]

参数

  • path 路径
    • 如果给出目录路径, 则将列出该文件夹下所有文件的信息
    • 如果给出文件路径, 则将列出该文件的信息
    • 如果没有给出路径, 则将列出当前工作目录下所有文件的信息

选项

  • -l 默认情况下仅会列出文件名, 如果启用该选项, 还将列出文件的详细属性
  • -u 需要配合选项 -l 使用, 详细信息中显示最后访问时间 (默认显示的时最后修改时间)
  • -R 将递归显示文件夹下的文件信息
  • -a 显示隐藏文件 (即以 . 开头的文件)

对于查看复杂目录结构, 更推荐使用 tree 命令
该命令可配合 grep 筛选信息

通过权限数字修改文件权限

chmod [-R] <xyz> <file>

参数

  • xyz 文件新的权限数字
  • file 文件或目录名

选项

  • -R 如果选择的是目录, 则递归修改该目录下所有文件

通过符号类型修改文件权限

chmod [-R] u[= | + | -]<ur> g[= | + | -]<gr> o[= | + | -]<or> <file>

参数

  • ur 文件所有者的权限字符
  • gr 文件所有者同组用户的权限字符
  • or 其他用户的权限字符
  • file 文件或目录名
  • =+- 分别表示设置, 新增, 删除权限

选项

  • -R 如果选择的是目录, 则递归修改该目录下所有文件

软件下载与安装

软件安装与管理

此处介绍的为 Debian 与 Ubuntu 下的包管理工具 apt

apt [-yq] [command]

  • 命令选项
    • -y 安装过程自动确认
    • -q 静默安装
  • 常用的管理操作有
    • install <package>[=<version>] [--no/only-upgrade] 安装指定软件包
      • version 安装指定版本号的软件包
      • --no-upgrade 如果已经安装, 则不进行升级
      • --only-upgrade 仅当已安装时, 升级该软件包
      • 一般可使用 Tab 补全包名, 避免搜索
    • <remove | purge> <package> 删除指定软件包
      • remove 仅删除软件包
      • purge 同时删除软件包与其配置文件
  • 常用的更新操作有
    • update 获取可更新的软件包
    • list --upgradable 列出可更新的软件包
    • [full-]upgrade 升级所有可更新的软件包
      • full- 通过重新安装的方式更新软件包
    • autoremove 清理不再使用的依赖和库文件
  • 常用的查询操作有
    • list [--upgradeable | --installed | --all-versions] [package] 根据软件包名搜索, 可以使用通配符
      • --upgradeable 仅搜索可升级的软件包
      • --installed 仅搜索已安装的软件包
      • --all-versions 列出同一软件包的所有版本
      • package 省略时将列出所有软件包
    • search <keyword> 根据关键词搜索软件包, 可以使用通配符
    • show <package> 显示软件包的详细信息

注意, 在 Shell 脚本等环境下, 建议使用 apt-get 代替, 二者基本相同

软件包安装

在 Debian 类的 Linux 系统下, 除了 apt, 还可使用命令 dpkg 管理软件包
该命令与 apt 类似, 但不包含下载功能, 用于安装下载得到的软件包 (一般有后缀 .deb)

通常的使用方式有

  • dpkg -i <file> 安装软件包 file (一般有后缀 .deb)
  • dpkg -r <pkg> 卸载名称为 pkg 的软件包
  • dpkg -P <pkg> 卸载软件包 pkg, 并清除配置文件
  • dpkg -l 列出所有软件包, 可通过类似 less 命令的方式浏览内容
  • dpkg -s <pkg> 显示软件包的详细信息
  • dpkg -L <file> 显示软件包的安装文件

文件下载

参考资料 https://blog.csdn.net/m0_71218711/article/details/135465743open in new window

使用命令 wget 用于下载文件, 常用的使用方式有

  • wget [-cbr --spider] [-o] [-P/O] <url>
    • -c 从上次中断的位置继续下载
    • -b 在后台进行下载, 可配合命令 tail 查看后台下载日志 (此时默认为 ./wget-log) 实现观察下载进度的效果
    • -r 递归下载指定 url 下的所有文件
    • --spider 仅测试 url 是否有效
    • -o <log> 将日志文件保存至路径 log, 默认为直接输出到控制台
    • -P <dir> 将下载结果保存到文件夹 dir
    • -O <file> 将下载结果另存为 file
    • url 文件链接地址, 支持 http, https, ftp 等协议

文件压缩与存档

参考文档 https://blog.51cto.com/u_15346415/5093448open in new window
使用命令 tar 完成文件的压缩以及存档

该命令的基本形式为
tar [act][method][opt] [dest] [dir]

该命令的参数主要由以下部分组成

  • act 执行的动作
    • -c 创建压缩文档
    • -x 解压缩
    • -t 列出压缩文档内的内容
      该动作仅需要 -f 指定压缩文档, 可配合 grep 进一步筛选
  • method 压缩方法 (以下选项相互排斥)
    • -a 根据文件后缀自动识别
    • 不指定压缩方法
      • 使用后缀 .tar
      • 此类数据没有压缩, 仅是将目录归档为一个文件
    • -z 使用 gzip 作为解压与压缩工具
      • 使用后缀 .tgz.tar.gz
      • 压缩时间最快, 压缩率最低, 使用最广泛
      • 一般用于压缩小文件
    • -j 使用 bzip2 作为解压与压缩工具
      • 使用后缀 .tbz.tar.bz2
      • 压缩时间与压缩率适中
      • 一般用于压缩大文件
    • -J 使用 xz 作为解压与压缩工具
      • 使用后缀 .txz.tar.xz
      • 压缩时间最慢, 压缩率最高
      • 一般用于压缩大文件
    • -Z 使用 compress 作为解压与压缩工具
      • 使用后缀 .taz.tar.Z
      • 几乎不使用
  • opt 其他设置选型
    • -v 显示操作的详细过程
    • -p 保留文件的原始属性 (常用于备份)
    • --exclude=<file> 解压 / 压缩时排除指定文件或目录
  • dest 目标确定
    • -C <dir> 仅用于解压, 设置解压结果存放的文件夹
    • -f <archive> 指定压缩或解压文件的名称. 该选项必须位于最后 (包括压缩结果与解压目标)
      • 压缩时, 建议按上方的后缀标准, 根据压缩方法选择后缀
    • file 文件参数
      • 压缩时表示目标被压缩的目录或文件
      • 解压时表示解压的文件或目录 (文件使用 -t 获取的压缩文件内路径表示), 为空则解压整个文件

系统与用户管理

用户管理与设置

关于用户组管理有

  • groupadd <用户组名> 创建用户组
  • groupdel <用户组名> 删除用户组
  • 获取用户组信息
    • 通过查看文件 /etc/group 可查询用户组信息
      每行各一条信息, 表示格式为 组名:口令:组编号:用户

关于用户管理有

  • useradd [-c] [-g] [-s] [-G] <用户名> 添加用户
    • -c <comment> 用户描述, comment 为描述内容
    • -g <用户组> 用户所属用户组
    • -G <用户组1>,<用户组2>,... 用户所属的附加组
      如通过设置用户为 sudo 的附加组可使其成为超级用户
    • -s <Shell 程序> 用户的登录 Shell 程序
    • 用户名 添加用户的用户名
    • 注意, 用户创建后
      • 用户将处于锁定状态无法登录, 需要使用 passwd <用户名> 设置密码
      • 用户的主目录 home/<用户名> 可能不存在, 需要创建
  • usermod [-c] [-g] [-s] [-G] <用户名> 修改用户
    • 该命令的设置选项含义与 useradd 一致
    • -aG 使用 -G 将覆盖附加组, 可使用该选项可添加附加组
    • 用户名 被设置用户的用户名
  • userdel [-r] <用户名> 删除用户
    • -r 同时删除用户的主目录
    • 用户名 被删除用户的用户名
  • passwd [-lud] [用户名] 设置用户密码 (非超级用户仅能使用该命令修改自己的密码)
    • 如果没有选项, 则为修改用户密码 (该方式也可以解封被 -l 禁用的账户)
    • -l 禁用账户, 此时用户将无法登录
      • 可用于封禁 root 用户以保护系统
      • 通过 useradd 创建的用户默认为禁用状态
    • -u 解禁账户, 仅用于设置过密码的被封禁账户
    • -d 删除密码, 此时用户登录不需要密码
  • 获取用户信息
    • 通过查看文件 /etc/passwd 可查询用户基本信息 (所有用户均可查看)
      每行各一条信息, 表示格式为
      用户名:密码:用户标识号:组标识号:注释性描述:主目录:登录Shell
    • 通过查看文件 /etc/shadow 可查询高级用户信息
      每行各一条信息, 表示格式为
      登录名:加密密码:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

关于用户登录

  • whoami 获取当前用户名
  • su [-c | -m | -l | -s] <name> 切换用户
    • -c <cmd> 切换为指定用户执行指令 cmd 后回到当前用户
    • -m 切换到指定用户后保持当前的环境变量
    • -l 切换到指定用户并重置环境变量
    • -s <shell> 使用指定的 Shell 程序 shell 登录用户
    • name 用户名称, 默认为 root
  • sudo <cmd> 以超级用户的方式执行命令
    • 通过该命令, 即使不登陆 root, 使一般用户也能以超级用户的方式执行特殊命令
    • 仅文件 /etc/sudoers 中标注的使用者可以使用此命令
    • 通过修改 /etc/sudoers 可对该命令的使用者进行设置, 设置方法见此文件中的注释
    • 一般情况下, root 用户与附加组为 sudo 的用户可使用 sudo

环境变量设置

  • export <变量名>=<变量值> 设置 / 创建当前终端的环境变量
    • 变量定义可参考 Shell 变量定义
    • 在原变量上增加内容如 PATH 可使用 PATH=$PATH:<新内容>, 其中 : 为 Linux 下 PATH 的路径分隔符
  • unset <变量名> 删除环境变量
  • env [-0] 打印所有环境变量
    • -0 使用 \0 分隔各条结果, 而不是 \n
  • reset 重启当前终端 (以此重置所有环境变量设置)

注意, 以上设置仅在当前终端生效
如果希望设置全局环境变量, 可通过设置 Shell 启动时执行脚本实现

  • 配置全局的环境变量, 则应在文件 /etc/profile 中使用 export 命令定义
  • 配置用户的环境变量, 则应在文件 ~/profile 中使用 export 命令定义

系统进程管理

  • ps [-au] 查询系统进程状态 (可配合 grep 筛选信息)
    • -a 显示所有进程
    • -u 显示进程的详细信息
  • pstree [-ap] 显示系统进程树
    • -a 显示进程的详细信息
    • -p 显示进程的 PID
  • kill [-s | -l | <pid>] 终止指定进程
    • pid 终止进程的 pid, 使用默认方式终止进程 (发送信号 SIGTERM)
    • -l 列出所有进程终止信号的名称与序号
    • -s <sig> <pid> 使用指定信号 sig (可以给出完整名称或序号) 终止进程 pid
      常用的信号有
      • SIGTERM 正常方式退出进程
      • SIGHUP 重新加载进程
      • SIGKILL 强制退出进程
  • pkill [-<n>] <name> 杀死指定名称的进程
    • -<n> 杀死进程的信号的编号 (使用 kill -l 获取), 默认为 SIGTERM
    • name 进程名称
      • 一般即进程的程序名, 不包括参数
      • 可以使用通配符 *, ?, 推荐使用 " 包裹
      • 可以一次性杀死多个同名的进程

系统关闭相关命令

  • sync 将内存中的数据保存到硬盘中, 在关闭或重启系统前, 都应当执行这一命令
  • shutdown [-hprc] [time] ["message"] 停止, 关闭, 重启系统
    • -H 停止系统, 此时系统仍然通电处于最低维护状态, 默认操作
    • -p/h 关闭系统, 此时系统断电, 部分情况下与 -H 相同
    • -r 重启系统
    • -c 取消计划中的操作
    • time 计划时间, 常用的表示有
      • now 立刻执行 (默认)
      • +mm 分钟后执行
    • message 执行该命令后, 打印信息
  • exit 退出当前终端

系统服务管理

服务即一类特殊的程序, 这些程序通常在开机时启动, 并运行在后台
使用命令 systemctl 管理系统的服务

常用的命令有

  • 查询服务
    • systemctl list-units [PATTERN] 查询当前正在运行的所有服务
      PATTERN 匹配的服务名称, 可使用通配符, 默认为所有服务
      由于服务名称不确定, 推荐使用 *...* 的方式查询所需的服务
    • systemctl list-unit-files [PATTERN] 查询当前系统安装的所有服务
      要求与 list-units 相同
  • 管理当前的服务
    • systemctl start <NAME> 启动指定名称的服务
      • NAME 服务名称, 默认可以不带后缀 .service
    • systemctl restart <NAME> 重启指定名称的服务 (当服务的配置修改时, 应当通过此命令使之生效)
    • systemctl stop <NAME> 停止指定名称的服务
    • systemctl status <NAME> 获取指定名称服务的运行状态
  • 配置服务
    • systemctl enable <NAME | PATH> 安装服务, 服务在安装后将在开机时自动启动
      • NAME 服务名称也即服务配置文件名称, 默认的搜索路径为 /etc/systemd/system
      • PATH 服务配置文件路径, 关于服务配置文件见创建服务的介绍
    • systemctl disenable <NAME> 解除指定服务的安装
  • 创建服务
    通过创建服务, 可实现开机自动启动的效果, 但更推荐使用 crontab 实现开机与定期执行任务
    关于这部分内容, 可参考 https://www.kancloud.cn/lengyueguang/linux/2042523open in new window

其他实用命令

查看文件结构

使用命令 tree 可以查看目录下文件的详细结构

tree [-asC] [-L] [dir]

  • -a 显示所有文件
  • -s 显示文件或目录的大小
  • -C 以彩色的方式显示
  • -L <n> 最多显示 n 层目录
  • dir 查询结构的根目录, 默认为当前目录

定期执行任务

参考教程 https://zhuanlan.zhihu.com/p/58719487?utm_source=wechat_sessionopen in new window

安装 crontab

  1. 通过安装指令安装 crontab
  2. 检查服务 croncrond 是否安装

使用以下命令进入配置文件 crontab [-u] [-e | -l]

  • -e 进入配置文件编辑
  • -l 打印配置文件, 可配合重定向以备份配置
  • -u <user> 设置由指定用户执行的定期任务, 默认为 root

配置文件的基本格式为

 注释

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

<time>  <command>
...

其中

  • 基本参数 (一般按示例即可)
    • SHELL 执行命令时的 Shell 程序路径
    • PATH 环境变量 PATH 的值
    • MAILTO 将任务输出发送到指定用户的邮箱, 一般设置为 "", 即不发送
    • HOME 环境变量 HOME 的值
  • time 命令执行时间
    • 对于指定日期与时间的任务, 可参考 https://crontab.guru/open in new window
    • 可使用符号表示特定任务, 常用的有
      • @reboot 开机时执行
      • @daily 每天执行
      • @monthly 每月执行
  • command 待执行的命令, 注意
    • 命令中, 使用 % 表示换行, 因此要使用 \% 表示一般换行
    • 推荐使用 shell 脚本组织复杂的操作
    • 为了防止环境变量导致的问题, 推荐命令中使用完整的绝对路径, 并且在脚本开始时使用 source 命令导入 /etc/profile, ~/.profile, ~/.bashrc环境变量文件
      • 更推荐的方法是在脚本目录下定义一个设置环境变量的脚本文件, 每次只需要引入该文件即可
      • 对于开机启动的程序, 还应当通过 sleep 命令休眠一段时间, 等待系统完全启动
    • 可通过重定向的方式获取自动执行任务的输出

远程连接 SSH

参考 https://www.bilibili.com/video/BV1Sx4y1y7B2open in new window

基础知识

  • 在使用 ssh 连接前, 确保 Linux 中服务 sshd 已正常启动

  • Linux 中 ssh 配置文件夹位于 ~/.ssh, Windows 中 ssh 配置文件夹位于 C:\User\<用户名>\.ssh, 常用配置文件为

    • known_hosts 之前连接过的远程服务其
    • authorized_key 接收来自其他连接者的公钥
  • 使用密码连接 ssh <user>@<ip>

    • ip 远程服务器的 ip 地址
    • user 登录使用的用户名
  • 生成密钥对 ssh-keygen -t <method> [-C <doc>]

    • method 生成算法, 推荐使用 ed25519
    • doc 关于密钥对的说明
    • 执行该命令后, 将会询问密钥对文件保存地址与密钥对保护密码
    • 命令完成后, 将在保存位置生成私钥文件与 .pub 的公钥文件
  • 向远程服务器发送公钥 ssh-copy-id -i <pub> <user>@<ip>

    • pub 生成的公钥文件
    • user, ip 与密码链接时相同
  • 通过密钥对方式连接 ssh -i <pub> <user>@<ip>

    • 参数含义与 ssh-copy-id 相同
    • 连接时需要输入公钥文件的保护密码
  • 强制密钥对方式连接设置 (见视频介绍)

终端复用 tmux

即使只有一个真实终端, 可通过 tmux 实现对终端的复用, 使多个虚拟终端同时运行, 并在同一个终端中拆分窗口
参考 https://github.com/tmux/tmux/wiki/Getting-Startedopen in new window

  • 基本概念
    • 会话 session
      • 会话可以理解为窗口管理器, 窗口必须在会话下管理
      • 一个终端中允许多个会话运行, 但一个终端能有一个会话附加 (attach), 其他会话则在分离 (detach) 到后台运行
      • 当会话被附加到终端时, 将会在下方显示一个状态栏, 从左到右分别显示
        • 当前会话名称
        • 当前窗口列表, 被选中的窗口有后缀 *
        • 被选中的窗格名
        • 当前时间
      • 当会话内没有窗口时将自动销毁
    • 窗口 window
      • 窗口即显示在当前终端下的画面
      • 一个会话中允许有多个窗口运行, 但终端仅显示一个窗口, 其他窗口则在后台运行
      • 当窗口内没有窗格时将自动销毁
    • 窗格 pane
      • 窗格即最基本的终端单元, 由窗口管理
      • 同一个窗口上至少有一个窗格, 多个窗格则将占据终端的不同部分并分别同时显示
      • 当窗格创建时执行了特定程序 (带有 command 参数), 则窗格将在程序结束后自动销毁, 否则将在终端关闭后自动销毁 (使用 exit 命令)
    • 快捷键
      • 快捷键只能在附加会话内使用
      • 使用时应先按下 Ctrlb 作为前缀, 再按下其他键
  • 会话管理
    仅能在 tmux 环境外进行会话管理, 进入特定会话后无法管理其他会话
    以下命令默认在会话外, 即一般终端中运行
    • tmux new [-d] [-n <session-name>] [command] 新建会话, 并在会话中创建一个窗口
      • session-name 新建的会话名
      • command 在新建会话的第一个窗口中执行命令, 可使用字符串 '' 包裹命令
      • -d 创建会话后立刻分离, 用于创建后台程序
    • tmux attach -t <session-name> 将指定会话附加到终端上
    • tmux kull-session -t <session-name> 销毁指定会话
    • tmux kill-server 销毁所有会话
    • tmux switch -t <session-name> 切换到指定会话 (在会话中使用)
    • tmux rename-session -t <session-name> <new-name> 重名名会话
    • tmux ls 列出所有会话 (可在任意场合使用)
    • 快捷键 Ctrlb + d 或命令 tmux detach 分离当前会话 (在会话中使用),
  • 窗口与窗格管理
    仅能在附加会话内管理该会话下的窗口, 在特定窗口下管理该窗口下的窗格
    以下仅介绍部分常用命令, 更多操作可通过快捷键完成 (对应命令可查看手册)
    • tmux new-window [-d] [-n <window-name>] [-t <window-number>] [command] 新建窗口, 窗口中有一个窗格
      • window-name 新建的窗口名
      • window-number 新建窗口的编号, 默认从 1 往后编号
      • command 在新建窗口的第一个窗格中执行命令
      • -d 不使用新建的窗口作为当前窗口
    • tmux split-window [-hv] [-t <pane-number>] [command] 通过切分当前窗格创建窗格
      • -h 沿水平方向切分当前窗格
      • -v 沿竖直方向切分当前窗格
      • pane-number 新建窗格的编号, 默认从 0 往后编号
      • command 在新建窗格中执行命令
    • tmux select-pane -t <pane-number> 通过编号选择窗格
    • tmux select-window -t <window-name> 通过名称选择窗口
    • tmux select-layout <layout> 使用预设布局当前窗格, 可选预设有
      • even-horizontal 所有窗格横向拉伸, 沿纵向排列
      • even-vertical 所有窗格纵向拉伸排列, 沿横向排列
      • main-horizontal 其中一个窗格放大, 剩余窗格在底部横向排列
      • main-vertical 其中一个窗格放大, 剩余窗格在右侧纵向排列
      • tiled 尽量让各个窗格大小相等, 且行列数相等
    • 窗格相关快捷键
      • Ctrlb + % 沿水平方向切分当前窗格, 即 tmux split-window -h
      • Ctrlb + " 沿竖直方向切分当前窗格, 即 tmux split-window -v
      • Ctrlb + 方向键 向指定方向选择窗格
      • Ctrlb + q 在窗格上打印编号
      • Ctrlb + q + 数字 选择指定编号的窗格
      • Ctrlb + x 销毁当前窗格
      • Ctrlb + Space 重新布局窗格 (多次按下可切换布局)
    • 窗口相关快捷键
      • Ctrlb + 数字 移动到指定编号的窗口
      • Ctrlb + n 移动到下一窗口
      • Ctrlb + p 移动到上一窗口
      • Ctrlb + w 进入窗口选择器, 可在该选择器选择窗口 (Enter) 与查看窗口 (方向键)
      • Ctrlb + & 销毁当前窗口
  • 其他快捷键与使用
    • Ctrlb + ? 列出所有快捷键
    • Ctrlb + : 命令模式, 相当于向 tmux 输入命令 (不需要前缀 tmux)
    • Ctrlb + [ 浏览模式 (复制模式), 在此模式下可通过光标上下移动终端, 浏览终端的历史输出, 该模式下有以下操作键
      • q 退出浏览模式
      • 方向键 移动光标
      • CtrlSpace 开始选择内容 (该快捷键可能与 Windows 下的输入法快捷键冲突, 可能需要关闭输入法快捷键)
      • Ctrlw 复制选择内容到剪切板中并退出
  • 通常使用流程
    • 编写脚本用于组织窗口与运行程序
      • 使用 tmux new-window [command] 创建新窗口, 并在窗口中执行命令
      • 使用 tmux split-window [command] 创建新窗格, 并在窗格中执行命令
      • 使用 tmux select-layout main-vertical 设置窗格布局
      • 使用 zsh 在运行该脚本的窗格上创建一个新终端 (通常即最后一句)
    • 使用 tmux new-window 'zsh <脚本文件>' 根据以上创建的脚本创建会话

其他实用命令

  • man <命令名称> 获取命令的详细帮助, 一般情况下使用该命令可获得比 --help 更详细的信息
    查看文档的方式与 less 相同
  • whereis <命令> 查询命令对应的应用程序与库所在地址
  • free [-ht] [-s] 查看当前内存状态
    • -h 以易于阅读的方式显示信息 (主要为使用 数字 + 大小单位 的方式显示, 默认以 kb 为单位)
    • -t 显示统计信息
    • -s<x> 持续观察, 且每间隔 x 秒更新一次状态
  • df [-ha] [--total] 查看当前磁盘的剩余空间 (Disk Free)
    • -h 以易于阅读的方式显示信息 (主要为使用 数字 + 大小单位 的方式显示, 默认以 kb 为单位)
    • -a 显示所有文件系统类型的磁盘
    • --total 显示所有硬盘的统计信息
  • ip [-s] [-c] <object> show 查询网络状态 (该命令也可用于设置网络, 但此处不介绍)
    • -s 显示详细信息
    • -c 使用彩色显示信息
    • object 查询对象, 常用的对象有
      • link 网络设备
      • address 网络地址
  • time <command> 计算运行命令 command 所消耗的时间 (该命令在 bash 与 zsh 上的表现不同)
  • date [+"format"] 获取当前时间
  • sleep <number>[smhd] 等待一段时间
    • number 等待时间
    • smhd 时间单位
      • s
      • m
      • h
      • d