Linux基础

type
Post
status
Published
summary
Linux 复习笔记;整理了包含常用命令、网络连接认证、用户和权限等等方法的运用,对 Linux 有一个初步的了解。
slug
Linux-base
date
Jun 26, 2024
tags
Linux
category
基础知识
password
icon
URL
Property
Jul 8, 2024 09:40 AM

准备事项

命令格式

命令 ——> 字符反馈
无论是什么命令,用于什么用途,在Linux中,命令有其通用的格式:
  • command [-options] [parameter]
    • command: 命令本身
    • -options:[可选,非必填] 命令的一些选项,可以通过选项控制命令的行为细节
    • parameter:[可选,非必填] 命令的参数,多数用于命令的指向目标
    • 语法中的[],表示可选的意思;参数比较复杂的话可以使用双引号

命令行

在 Linux 中,命令行类型通常指的是各种命令行解释器(也称为“shell”),这些解释器负责读取用户输入的命令并执行。

查看shell类型

echo $SHELL # 输出当前用户的默认 shell ps -p $$ # 正在运行的 shell cat /etc/shells # 查看系统上可用的所有 shell

常见的shell类型

1. bash (Bourne Again Shell)
  • 路径/bin/bash
  • 特点:Bash 是大多数 Linux 发行版默认的 shell,功能强大,兼容性好,支持命令行编辑、历史记录、脚本编程等。
2. zsh (Z Shell)
  • 路径/bin/zsh
  • 特点:功能丰富,扩展性强,支持强大的补全功能和更好的自定义。Oh My Zsh 是一个流行的 Zsh 框架,提供了大量插件和主题。
3. fish (Friendly Interactive Shell)
  • 路径/usr/bin/fish
  • 特点:用户友好,默认情况下提供了语法高亮、自动建议和易于使用的语法,但与其他 shell 兼容性较差。
4. dash (Debian Almquist Shell)
  • 路径/bin/dash
  • 特点:轻量级且快速,常用于系统启动脚本,符合 POSIX 标准,但功能较少。
5. ksh (Korn Shell)
  • 路径/bin/ksh
  • 特点:结合了 C Shell 和 Bourne Shell 的特点,适合编写脚本,功能强大,支持高级编程特性。
6. tcsh (TENEX C Shell)
  • 路径/bin/tcsh
  • 特点:C Shell 的增强版本,提供了命令行编辑和历史记录功能,语法类似于 C 语言。
切换 shell:可以使用 chsh 命令切换默认的 shell。例如,将默认 shell 切换为 zsh:
chsh -s /bin/zsh

选择合适的 Shell

  • Bash:适合大多数用户,默认安装在大多数 Linux 发行版中。
  • Zsh:如果需要更强大的补全和自定义功能,Zsh 是一个很好的选择。
  • Fish:如果需要一个用户友好的 shell,可以尝试 Fish。
  • Dash:适合系统脚本,轻量且快速。
  • Ksh 和 Tcsh:适合有特定需求或习惯于这些 shell 的用户。

通配符

通配符(wildcards)是用于匹配一组文件或目录名称的特殊字符或字符串模式。它们可以在命令行中简化对多个文件和目录的操作。常见的通配符包括 *? 和 [],每个都有不同的匹配规则和用途。
# 星号 (*):匹配零个或多个字符。 ls *.txt # 列出当前目录下所有以 .txt 结尾的文件 cp /source/* /destination/ # 复制 /source/ 目录下的所有文件到 /destination/ 目录 # 问号 (?):匹配单个任意字符。 ls file?.txt # 列出文件名为 file1.txt、file2.txt 等等,只有一个字符在 file 和 .txt 之间 mv file?.txt /destination/ # 移动这些文件到 /destination/ 目录 # 方括号 ([]):匹配方括号内的任意一个字符。 ls file[123].txt # 列出文件名为 file1.txt、file2.txt 和 file3.txt 的文件 mv file[1-3].txt /destination/ # 移动这些文件到 /destination/ 目录 # 方括号内的连字符 (-):匹配指定范围内的字符。 ls file[a-z].txt # 列出文件名为 filea.txt 到 filez.txt 的文件 # 方括号内的否定符 (!):匹配不在括号内的任意字符。 ls file[!0-9].txt # 列出文件名为 filea.txt、fileb.txt 等等,排除 file0.txt 到 file9.txt
能使用通配符的命令有:ls、cp、mv、rm、find、grep、tar、chmod、zip 等

管道符

将管道符左边命令的结果,作为右边命令的输入
ls | grep .txt # 将"ls"命令的输出传递给"grep"命令来过滤文件列表 find / -name “test” | grep “/usr/lib64” # 过滤结果,只找路径带有/usr/lib64的结果 cat itheima.txt | grep itcast | grep itheima # 嵌套

重定向

任何有结果的命令都可以写
语法: 执行有打印结果的指令 > 文件地址 # 将左侧的执行结果写入到指定文件中(先清除原文件内容再写入) 执行有打印结果的指令 >> 文件地址 # 将左侧的执行结果最佳到指定文件中(直接将结果追加到原文件中) history > a.txt history | awk '{print $4}' | sort uniq -c | sort -rnk 1 | head -n 3 > a.txt # 将最常用的3个指令及其使用次数保存到a.txt文件中

反引号

被反引号包裹的内容会被当成命令去执行
echo `pwd` echo "pwd"

快捷命令

clear # 清屏 exit # 退出 history # 查看历史输入过的命令 history | grep ch # 查看历史输入过的命令中带 ch 的命令 echo "hello linux" # 打印 !命令前缀,自动执行上一次匹配前缀的命令 示例:!l:从最近的命令开始搜索,执行以l开头的命令 命令 --help # 查看命令的帮助 ls --help cd --help man 命令 # 查看命令的详细手册 man ls man cd

快捷键

ctrl + c # 强制停止 ctrl + l # 清屏 ctrl + d # 退出或登出,不能用于退出vi/vim ctrl + r # 输入内容去匹配历史命令,搜索后按回车直接执行,按左右键进行修改 ctrl + a # 跳到命令开头 ctrl + e # 跳到命令结尾 ctrl + 键盘左键 # 向左跳一个单词 ctrl + 键盘右键 # 向右跳一个单词

环境变量

环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。 在Linux系统中执行:env命令即可查看当前系统中记录的环境变量;环境变量是一种KeyValue型结构,即名称和值
$符号用来引用变量
设置环境变量
临时设置,在命令行中设置的环境变量默认只对当前shell及其子shell有效。
语法:export [选项] [变量名=值] 例子: export VAR="value" # 设置环境变量VAR的值为"value" export PATH=$PATH:/usr/local/bin # 将/usr/local/bin添加到PATH环境变量中 export -p # 显示所有的环境变量
永久生效
  • 针对当前用户生效,在当前用户的:~/.bashrc文件中配置:export VAR="value"
  • 针对所有用户生效,在系统的:/etc/profile文件中配置:export VAR="value"
  • 并通过语法:source 配置文件,进行立刻生效,或重新登录FinalShell生效

常用命令

ls 命令

展示当前工作目录下的内容(文件或文件夹)
语法:ls [选项] [路径] # 选项可以多个一起组合使用 ls -t # 显示文件夹中的内容,并且内容按时间从大到小排序 ls -S # 显示文件夹中的内容,并且内容按大小从大到小排序 ls -R # 递归显示当前目录以及当前目录下所有的子目录中的内容 ls -r # 内容倒序显示 ls -a # 展示所有文件(包含隐藏文件) ls -l # 按照文件名正序列出 ls -lt # 按照时间由近到远列出 ls -lS # 按照文件大小降序列出 ls -lr # 按照文件名逆序列出 ls -lrt # 按照时间由远到近列出 ls -lrS # 按照文件大小升序列出 ls -lh # 按照文件名正序列出,按人类可读的格式显示文件大小,之前的命令都可以额外加上 h:ls -lth -lSh -lrh -lrth -lrSh ll # 通常是 ls -l 的别名,但是在 Ubuntu 中通常是 ls -alF 的别名;-F:在文件名后添加文件类型指示符(例如,目录后加斜杠 /,可执行文件后加星号 *)。 输出结果: total 96 -rw-------@ 1 ayd staff 120B 9 11 2023 0.model drwx------@ 7 ayd staff 224B 6 21 10:34 Applications drwxr-xr-x@ 6 ayd staff 192B 6 24 10:59 Applications (Parallels) drwxr-xr-x 7 ayd staff 224B 12 9 2023 Calibre Library 结果解读: 1、total 96 表示目录中所有文件的块(block)总数为96。目录中所有文件和子目录所占用的磁盘块数 2、显示结果每一列代表的含义: 第一列:文件权限:这是一个由10个字符组成的字段,描述了文件的类型(例如,普通文件、目录、链接等)和三组用户(所有者、组、其他)的读、写、执行权限。例如,`drwxr-xr-x`表示一个目录,所有者有读、写、执行权限,组和其他用户只有读和执行权限。** 权限字符解释: 第一个字符:这个字符表示文件类型。 d:表示这是一个目录。 -:表示这是一个普通文件。 l:表示这是一个符号链接。 s:标识这是一个套接字文件。 其他特殊文件类型字符包括c(字符设备文件)和b(块设备文件)等。 接下来的三组字符:这三组各自三个字符的字符串表示文件的权限。 第一组(例如,rwx)表示文件所有者的权限。 第二组(例如,r-x)表示与文件所有者同组的用户的权限。 第三组(例如,r-x)表示其他用户的权限。 在这三组中,r代表读权限,w代表写权限,x代表执行权限。如果某个位置是-,则表示相应的权限被禁用。 r:针对文件可以查看文件内容针对文件夹,可以查看文件夹内容,如ls命令 w:针对文件表示可以修改此文件针对文件夹,可以在文件夹内:创建、删除、改名等操作 x:针对文件表示可以将文件作为程序执行针对文件夹,表示可以更改工作目录到此文件夹,即cd进入 末尾的加号(+):表示该文件或目录有额外的访问控制列表(Access Control Lists, ACLs)设置。ACLs 允许你为单个用户或组设置更细粒度的权限。 末尾的@符号:表示该文件或目录有扩展属性。扩展属性是存储在文件系统中的元数据,它们允许用户为文件或目录附加任意的名称-值对数据。 因此,drwxr-xr-x+的意思是: d:这是一个目录。 rwx:所有者拥有读、写和执行权限。 r-x:同组用户拥有读和执行权限,但没有写权限。 r-x:其他用户拥有读和执行权限,但没有写权限。 +:存在额外的访问控制列表设置。 第二列:链接数:这是一个数字,表示文件或目录的硬链接数。对于目录,这个数字通常是子目录的数量加2(包括它自己和父目录)。** 第三列:所有者:这是文件或目录的所有者的用户名。** 第四列:文件所属组:这是文件或目录所有者所在的组的名称。** 第五列:文件大小:这是文件的大小,单位是字节。对于目录,这个数字通常是4096,表示目录信息所占用的磁盘空间。** 第六列:修改时间:这是文件或目录最后一次被修改的日期和时间。**注意:如果文件在六个月前被修改,或者是在未来被修改(这可能发生在系统时间被更改的情况下),那么ls -l命令将显示文件修改的年份,而不是时间。 第七列:文件名:这是文件或目录的名称。**

alias 命令

别名
alias # 查看现有别名 alias ll # 查看某个特定别名的定义 alias 别名='命令' # 创建别名 alias ll='ls -alF' unalias 别名 # 取消别名 unalias ll # 要使别名在重新启动终端后仍然有效,可以将别名定义添加到 ~/.bashrc 或 ~/.bash_profile 文件中 echo "alias ll='ls -alF'" >> ~/.bashrc source ~/.bashrc # 重新加载 .bashrc 文件 常见别名: alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..'

cd & pwd 命令

路径切换和查看
语法:cd [路径] cd path # 文件夹路径(路径可以是绝对地址也可以是相对地址)-进入到指定路径对应的文件夹 cd .. # 返回上层目录 cd ../.. # 返回上上层目录 cd / # 进入系统根目录 cd ~ # 进入home目录 cd # 进入home目录(没有参数和选项) 语法:pwd 直接使用,返回当前所在路径,没有参数和选项
  • 绝对路径:以根目录为起点,描述路径的一种写法,路径描述以/开头;/test/test1/test.txt
  • 相对路径:以当前目录为起点,描述路径的一种写法,路径描述无需以/开头;test/test1/test.txt./test/test1/test.txt

mkdir 命令

新建文件夹
语法:mkdir [-p] [路径] # -p选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录 mkdir 新文件夹路径文件夹名 # 在指定位置创建文件夹,若没有会报错 mkdir -p 新文件夹路径文件夹名 # 在指定路径创建指定文件夹,若没有就创建 mkdir -p a/{b,c}/{d,e,f,g} # 在当前位置创建a,在a内创建多个文件夹,在多个文件夹内再创建多个相同的文件夹 mkdir -p ~/docker_install && cd ~/docker_install

touch 命令

新建文件
语法:touch [选项] 文件路径 touch 文件名 # 创建一个空文件,如果文件已存在,更新文件的时间戳 touch -a 文件名 # 更新文件的访问时间 touch -m 文件名 # 更新文件的修改时间 touch -c 文件名 # 如果文件不存在,不创建新文件 touch -t 时间戳 文件名 # 设置文件的时间戳为指定的时间,时间格式为[[CC]YY]MMDDhhmm[.ss]

cat 命令

查看文件
语法:cat [选项] 文件路径 cat 文件名 # 显示文件内容 cat 文件1 文件2 # 连续显示多个文件内容 cat > 文件名 # 创建文件,从标准输入设备读取内容,直到遇到Ctrl+D结束 cat >> 文件名 # 追加内容到已存在的文件中,从标准输入设备读取内容,直到遇到Ctrl+D结束 cat -n 文件名 # 显示文件内容并在每行前面加上行号

head命令

用于显示文件的开头部分,默认情况下显示文件的前10行。
语法: head [选项] [文件] -n <行数>:显示指定行数的内容,例如head -n 20 file.txt将显示文件file.txt的前20行。 -c <字节数>:显示指定字节数的内容,例如head -c 100 file.txt将显示文件file.txt的前100个字节。 -q:静默模式,仅显示文件内容而不显示文件名。 -v:总是显示文件名的头部信息。 例子: head file.txt # 显示file.txt文件的前10行内容 head -n 20 file.txt # 显示file.txt文件的前20行内容

tail 命令

显示文件的末尾内容
语法:tail [选项] [文件] tail filename # 显示文件的末尾内容,默认 10 行 tail -n 10 filename # 显示文件末尾的最后10行 tail -f filename # 实时监控文件的新增内容 tail -F filename # 实时监控文件的新增内容,如果文件被删除或重命名,继续监控新文件 tail -c +10 filename # 从第10个字节开始显示文件内容

more 命令

查看文件
语法:more [选项] 文件路径 more 文件名 # 逐页显示文件内容 more +数字 文件名 # 从指定的行开始显示 more +/字符串 文件名 # 从包含指定字符串的行开始显示 在more命令执行的过程中,你可以使用以下的命令: 快捷键: Enter:向下翻一行 按j向下一行 按k向上一行 按f向下翻一页 按b向上翻一页 按g到全文开头 按G到全文结尾 按Q退出 =:输出当前行的行号

cp 命令

复制文件/文件夹
语法:cp [选项] 源文件 目标文件 cp 文件1 文件2 # 将文件1复制为文件2,如果文件2已存在,将被覆盖 cp -i 文件1 文件2 # 如果文件2已存在,询问是否覆盖 cp -r 目录1 目录2 # 复制目录1及其子目录下的所有文件到目录2 cp -a 目录1 目录2 # 保留链接和文件属性,复制目录1及其子目录下的所有文件到目录2 cp -u 文件1 文件2 # 只有当文件1比文件2新或者文件2不存在的时候,才会复制

mv 命令

移动文件/文件夹
语法:mv [选项] 源文件 目标文件 mv 文件1 文件2 # 将文件1移动或重命名为文件2,如果文件2已存在,将被覆盖 mv 文件夹1 文件夹2 # 如果文件2存在,会被自动备份 mv -r 文件夹 文件夹 # 如果文件2存在,会被自动备份 mv -i 文件1 文件2 # 如果文件2已存在,询问是否覆盖 mv -u 文件1 文件2 # 只有当文件1比文件2新或者文件2不存在的时候,才会移动 mv -v 文件1 文件2 # 显示移动的过程 mv -b 文件1 文件2 # 如果文件2存在,会被自动备份 mv 文件1 文件2 目录 # 将多个文件移动到指定目录 mv apache-zookeeper-3.7.2-bin /export/server/apache-zookeeper-3.7.2-bin # 移动文件夹(目标地址文件夹不存在时,直接移动;目标地址存在同名文件夹时,会报错,可以通过加 -r 参数覆盖) mv -r apache-zookeeper-3.7.2-bin /export/server/apache-zookeeper-3.7.2-bin mv apache-zookeeper-3.7.2-bin zookeeper # 文件夹重命名(移动到当前路径内)

rm 命令

删除文件/文件夹
语法:rm [选项] 文件 rm 文件名 # 删除指定文件,如果文件是只读的,会询问是否删除 rm -f 文件名 # 强制删除文件,即使文件是只读的也不会询问 rm -i 文件名 # 在删除前会询问是否操作 rm -r 目录名 # 递归删除目录及目录内所有子目录和文件 rm -rf 目录名 # 强制递归删除目录,即使文件是只读的也不会询问

which 命令

查找命令文件
语法:which [选项]... 命令名... which 命令名 # 显示指定命令的完整路径 which -a 命令名 # 显示所有匹配的命令

find 命令

查找文件
语法:find [路径] [表达式] find . -name "test" # 在当前目录及其子目录下查找名为test的文件 find /home -user 用户名 # 在/home目录下查找所有者为用户名的文件 find /usr -name \*.jpg # 在/usr目录下查找所有.jpg文件 find . -type f # 在当前目录及其子目录下查找所有普通文件 find . -type d # 在当前目录及其子目录下查找所有目录 find . -mtime -10 # 在当前目录及其子目录下查找在10天内被修改过的文件 find . -size +10M # 在当前目录及其子目录下查找大小超过10M的文件 find . -size -10M # 在当前目录及其子目录下查找大小小于10M的文件

grep 命令

用于在文本中搜索指定模式。如果找到,grep命令将打印出来。
语法:grep [选项] 关键字 [文件路径] grep 'word' filename # 在文件中搜索单词 grep -r 'word' directory # 在目录及其子目录中递归搜索单词 grep -i 'word' filename # 在文件中搜索单词,忽略大小写 grep -w 'word' filename # 在文件中搜索整个单词,而非部分匹配 grep 'word1\|word2' filename # 在文件中搜索word1或word2 grep -v 'word' filename # 在文件中搜索除'word'之外的所有内容 grep -o 'word' filename # 只输出文件中匹配到的部分

wc 命令

用于统计
语法:wc [选项] [文件] wc example.txt # 将输出三个统计数:行数、单词数、字符数。 wc -l example.txt # 仅统计指定文件的行数 wc -w example.txt # 仅统计指定文件的单词数 wc -c example.txt # 仅统计指定文件的字节数,一般等于文件大小 wc -m example.txt # 仅统计指定文件的字符数 wc -L example.txt # 仅统计指定文件中最长行的长度 wc -lwm example.txt # 多选项混用 echo "Hello, world!" | wc -w # 利用管道将其他命令的输出作为 wc 命令的输入

sort命令

用于对文本文件的行进行排序,默认情况下按照字母顺序排序。
语法: sort [选项] 文件名 - -r:以相反的顺序进行排序(降序)。 - -n:按照数值大小而不是字母顺序进行排序。 - -k <字段>:按照指定字段进行排序。 - -u:去重,仅显示唯一的行。 - -o <输出文件>:将排序结果输出到指定文件。 例子: sort file.txt # 对file.txt文件的行进行字母顺序排序 sort -r file.txt # 对file.txt文件的行进行降序排序 sort -n numbers.txt # 对numbers.txt文件的行按照数值大小排序 sort -nk 1 a.txt # 根据每行的第1列的数值大小进行升序排序 sort -rnk 1 a.txt # 根据每行的第1列的数值大小进行降序排序 sort -nk 2 a.txt # 根据每行的第2列的数值大小进行升序排序 sort -rnk 2 a.txt # 根据每行的第2列的数值大小进行降序排序

awk命令

语法: awk 'pattern { action }' filename - 使用$0表示整行内容,$1表示第一个字段,$2表示第二个字段,依此类推。 - 可以使用条件语句和循环来处理数据。 - 可以进行数学运算和格式化输出。 例子: awk '{print $1, $2}' file.txt # 打印文件file.txt中每行的第一个和第二个字段 awk '$1 > 10 {print $0}' numbers.txt # 打印文件numbers.txt中第一个字段大于10的行 history | awk '{print $2}' # 获取历史记录第2列的内容 history | awk '{print $2,$3}' # 获取历史记录第2列和第3列的内容 history | awk '{print $4}' | sort | uniq -c | sort -rnk 1 | head -5 # 显示最常用的指令和使用次数

vi/vim 命令

vim 是 vi 的加强版本,兼容 vi 的所有指令
vim 文件名 # 打开文件(如果文件不存在则会创建)
notion imagenotion image
命令模式:
0 # 移动光标到当前行的开头 $ # 移动光标到当前行的结尾 / # 进入搜索模式 /key_word # 查找关键词 n # 向下继续搜索 N # 向上继续搜索 dd # 删除光标所在行的内容 ndd # n是数字,表示删除当前光标向下n行 dG # 从当前行开始,向下全部删除 dgg # 从当前行开始,向上全部删除 d$ # 从当前光标开始,删除到本行的结尾 d0 # 从当前光标开始,删除到本行的开头 yy # 复制当前行 Yp # 复制当前行,并向下粘贴 nyy # n是数字,复制当前行和下面的n行 p # 粘贴复制的内容 u # 撤销修改 undo # 撤销修改 control + r # 反向撤销 gg # 跳到文档开头 G # 跳到文档结尾 458 + G # 跳到458行
输入模式:输入和修改文件内容;在命令模式输入 i 进入
【i】 # 从目前光标所在处插入 【I】 # 从目前光标 【a】 # 从当前光标所在的下一个字符处开始插入 【A】 # 从光标所在行的最后一个字符处开始插入 【o】 # 英文小写字母o,在目前光标所在行的下一行处插入新的一行并开始插入 【O】 # 英文大写字母O,在目前光标所在行的上一行处插入新的一行并开始插入
底线模式:一版用于保存和退出文件;在命令模式下输入冒号再接其他指令
:w # 仅保存 :w! # 若文件为只读,强制保存文件 :q # 仅退出(在没有修改文件的时候可以,如果文件修改了但不想保存,那么需要强制退出) :q! # 不保存,强制退出(不想保存修改就直接强制退出) :wq # 保存并退出 :wq! # 强制保存后离开 :%d # 删除文档的所有行;在 vim 中 % 是一个范围指示符,指定命令作用于文档中的每一行。 :set nu # 显示行号 :set number # 显示行号 :set nonu # 关闭显示行号 :set nonumber # 关闭显示行号 :set paste # 临时禁用自动缩进和其他格式设置 :set paste! # 退出set paste模式 :3,20d # 删除3到20行 :30 # 光标跳到第 30 行 :2,9> # 将第 2到第 9 行缩进一个 tab :2,9< # 将第 2到第 9 行回缩一个 tab # 替换命令 :s/pattern/replacement/flags - s:表示替换命令(substitute)。 - pattern:要搜索的模式。^:匹配行首。$:匹配行尾。.:匹配任意字符。*:匹配零个或多个前面的字符。\:用于转义特殊字符。 - replacement:用于替换的文本。 - flags:标志位(可选),如 g 表示全局替换,c 表示确认替换。 :s/foo/bar/ # 将所有 foo 替换为 bar(当前行第一个匹配的) :s/foo/bar/g # 将所有 foo 替换为 bar(当前行的所有匹配项) :%s/foo/bar/g # 将所有 foo 替换为 bar(整个文件) :1,10s/^#// # 将1到10行的开头的#替换成空 :%s/$/;/ # 将每行末尾添加一个分号(整个文件) # 注释效果 :16,21s/^/#/ # 将第 16 行到 21 行的开头添加 # 以达到注释效果;s 是替换命令,第一个斜杠是 :16,21s/^#// # 将第 16 行到 21 行开头的 # 替换为空,以达到取消注释效果

ln命令

创建连接
语法:ln [选项] target link_name ln [选项] 被链接的文件或文件夹 要链接去的目的地 例子: ln -s /etc/yum.conf ~/yum.conf ln -s /etc/yum ~/yum ln myfile.txt mylink # 创建一个指向myfile.txt的硬链接,名为mylink ln -s myfile.txt mylink # 创建一个指向myfile.txt的软链接(或符号链接),名为mylink
软连接是一个指向另一个文件或目录的路径名。软连接是一个独立的文件,其内容是所指向文件的路径。如果删除原文件,软连接会变成“悬空链接”或“断链”(即无效的链接),因为它指向的路径不再存在。软连接具有自己的权限,但权限对目标文件无影响。使用 ls -l 命令查看时,软连接在文件名后面带有箭头 (->) 指向目标文件。
硬连接是指向文件数据块的直接引用。硬连接是文件本身的一个镜像,不是独立的文件。删除任何一个硬连接不会影响其他硬连接,文件数据只会在最后一个硬连接被删除时才被移除。使用 ls -l 命令查看时,硬连接没有特殊符号标识,但可以通过 inode 值确认它们指向相同的数据。

关机\重启命令

1. shutdown 语法:sudo shutdown [选项] [时间] [选项]: -h:关机 -r:重启 -c:取消关机或重启 -k:发送警告信息,但不实际关机 示例: sudo shutdown -h now # 立即关机 sudo shutdown -r now # 立即重启 sudo shutdown -h +10 # 10分钟后关机 sudo shutdown -c # 取消定时关机 2. poweroff 语法:sudo poweroff 示例: sudo poweroff # 立即关机 3. halt 语法:sudo halt [选项] [选项]: --force:强制关机 --poweroff:关机(等同于poweroff命令) 示例: sudo halt # 立即关机 sudo halt --poweroff # 立即关机 4. reboot 语法:sudo reboot 示例: sudo reboot # 立即重启 5. init 语法:sudo init [运行级别] [运行级别]: 0:关机 6:重启 示例: sudo init 0 # 立即关机 sudo init 6 # 立即重启 6. systemctl 语法:sudo systemctl [命令] [命令]: poweroff:关机 reboot:重启 halt:停止系统 示例: sudo systemctl poweroff # 立即关机 sudo systemctl reboot # 立即重启 sudo systemctl halt # 立即停止系统

时间和日期

date命令

查看系统的时间
语法: date [-d] [+格式化字符串] -d 按照给定的字符串显示日期,一般用于日期计算 date +"%Y-%m-%d %H:%M:%S" # 按照指定格式显示系统当前时间 date -d "+1 day" "+%Y-%m-%d" # 类似的用法还有 "+2 days" 表示后天,"-1 day" 表示前一天,"+1 week" 表示下一周,"+1 month" 表示下一个月,"+1 year" 表示下一年,等等。 格式化字符串:通过特定的字符串标记,来控制显示的日期格式 %Y 年 %y 年份后两位数字 (00..99) %m 月份 (01..12) %d 日 (01..31) %H 小时 (00..23) %M 分钟 (00..59) %S 秒 (00..60) %s 自 1970-01-01 00:00:00 UTC 到现在的秒数 -d支持的时间标记为: year 年 month 月 day 天 hour 小时 minute 分钟 second 秒

修改时区

rm -f /etc/localtime # 删除当前时区文件 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 将上海时间文件软连接到 etc 中 # 如果需要手动校准时间 sudo timedatectl set-ntp off # 先关闭自动同步 sudo timedatectl set-time 'YYYY-MM-DD HH:MM:SS' # 替换成当前的日期时间 sudo timedatectl set-ntp on # 打开自动同步 timedatectl status # 检查系统时间和 NTP 同步状态 # 输出内容: Local time: Tue 2024-06-25 10:30:15 UTC Universal time: Tue 2024-06-25 10:30:15 UTC RTC time: Tue 2024-06-25 10:30:15 Time zone: UTC (UTC, +0000) System clock synchronized: yes NTP service: active RTC in local TZ: no # 输出解读: Local time:本地时间,显示当前系统的本地日期和时间。 Universal time:协调世界时(UTC),显示当前系统的国际标准时间。 RTC time:硬件时钟(RTC,Real-Time Clock)时间,显示硬件时钟的时间。 Time zone:时区,显示当前系统配置的时区信息,包括时区的名称和偏移量。 System clock synchronized:系统时钟同步状态。 yes:系统时钟与网络时间服务(如 NTP)同步。 no:系统时钟未与网络时间服务同步。 NTP service:NTP 服务状态。 active:NTP 服务处于活动状态,正在运行并与时间服务器同步。 inactive:NTP 服务处于非活动状态,可能未启用或未配置。 RTC in local TZ:硬件时钟是否使用本地时区。 yes:硬件时钟与本地时区一致。 no:硬件时钟使用 UTC(协调世界时)。

用户和权限

用户和用户组

  • 在Linux系统中,拥有最大权限的账户名为:root(超级管理员);
  • 普通用户的权限,一般在其HOME目录内是不受限的;一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限
默认情况下,Ubuntu 的 root 账户是禁用的。如果要启用 root 账户,可以使用以下命令为 root 设置密码:sudo passwd root
notion imagenotion image
Linux系统中可以:
  • 配置多个用户
  • 配置多个用户组
  • 用户可以加入多个用户组中
notion imagenotion image
Linux中关于权限的管控级别有2个级别,分别是:
  • 针对用户的权限控制
  • 针对用户组的权限控制
比如,针对某文件,可以控制用户的权限,也可以控制用户组的权限。
 
以下命令需root用户执行
su - root # 切换到root用户 groupadd groupname # 创建用户组 groupadd mygroup # 创建一个名为'mygroup'的新用户组 groupdel groupname # 删除用户组 groupdel mygroup groups newuser # 查看用户所属的所有分组 users # 用于显示当前登录到系统的用户列表,可以快速查看哪些用户当前处于登录状态。 useradd [-m] username [-g] [指定用户组] [-d] [指定home目录] 选项:-m如果没有使用 -m 选项,系统不会自动创建用户的主目录。 选项:-g指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g 选项:-d指定用户HOME路径,不指定,HOME目录默认在:/home/用户名 @@@@ 注意: - 在某些 Linux 发行版中,使用 useradd 命令创建新用户时,默认不会自动为新用户配置完整的环境。这是因为 useradd 命令本身是一个低级别的用户管理工具,通常不会自动创建用户的配置文件。这会导致切换到该用户的命令行提示符只显示 $ 而不是 username@hostname:~$,这通常是因为新用户的 shell 配置文件尚未配置好。解决办法有:1、手动配置环境;2、使用adduser命令 - 如果没有指定组,那么系统会自动为该用户创建一个与用户名同名的用户组,并将用户分配到这个组。这是 Linux 系统的默认行为。 sudo adduser newuser # 会提示你输入一些信息,如用户密码等,然后自动为新用户设置主目录和配置文件。 userdel [-r] 用户名 选项:-r,删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留 id [用户名] 参数:用户名,被查看的用户,如果不提供则查看自身 uid=1001(anjhon) gid=1001(anjhon) groups=1001(anjhon) usermod -aG 用户组 用户名 # 将指定用户加入指定用户 usermod -aG test anjhon compgen -u # 列出所有用户(只有用户名) getent passwd # 列出所有用户(带有详细信息) 输出信息如下: 格式:username:x:UID:GID:comment:home_directory:shell 示例:test1:x:1002:1002:,,,:/home/test1:/bin/bash username:test1(用户名) x:表示该用户的密码被存储在 /etc/shadow 文件中 UID:1002(用户 ID) GID:1002(组 ID) comment:,,,(额外信息,留空) 第一个逗号前:空(通常表示用户全名) 第一个逗号和第二个逗号之间:空(通常表示办公室号码) 第二个逗号和第三个逗号之间:空(通常表示电话号码) 第三个逗号和末尾的冒号之间:空(其他信息) home_directory:/home/test1(用户的主目录) shell:/bin/bash(用户登录时使用的 shell) getent group # 列出所有用户组

su 命令

用户切换
语法: su [-] [用户] - 符号是可选的,表示是否在切换用户后加载环境变量,建议带上 用户名也可以省略,省略表示切换到root su - root # 切换为 root 用户,Switch User
  • 使用普通用户,切换到其它用户需要输入密码,如切换到root用户
  • 使用root用户切换到其它用户,无需密码,可以直接切换
  • 切换用户后,可以通过exit命令退回上一个用户,也可以使用快捷键:ctrl + d

sudo 命令

使用sudo命令,为普通的命令授权,临时以root身份执行。不建议长期使用root用户,避免带来系统损坏。
语法: sudo 其他指令
但是并不是所有的用户,都有权利使用sudo,我们需要为普通用户配置sudo认证
配置认证步骤如下:
  • 1、切换到root用户
  • 2、执行visudo命令
  • 3、会自动通过vi编辑器打开:/etc/sudoers
  • 4、在文件的最后添加:用户名 ALL=(ALL) 制表符 NOPASSWD:ALL
    • parallels ALL=(ALL) NOPASSWD:ALL
  • 5、保存退出,直接 control + x,它会询问是否保存
  • 6、退回到普通用户可以使用sudu命令

文件权限

ls -lrt 输出结果: total 96 -rw-------@ 1 ayd staff 120B 9 11 2023 0.model drwx------@ 7 ayd staff 224B 6 21 10:34 Applications drwxr-xr-x@ 6 ayd staff 192B 6 24 10:59 Applications (Parallels) drwxr-xr-x 7 ayd staff 224B 12 9 2023 Calibre Library 第一列:文件权限:这是一个由10个字符组成的字段,描述了文件的类型(例如,普通文件、目录、链接等)和三组用户(所有者、组、其他)的读、写、执行权限。例如,`drwxr-xr-x`表示一个目录,所有者有读、写、执行权限,组和其他用户只有读和执行权限。** 权限字符解释: 第一个字符:这个字符表示文件类型。 d:表示这是一个目录。 -:表示这是一个普通文件。 l:表示这是一个符号链接。 s:标识这是一个套接字文件。 其他特殊文件类型字符包括c(字符设备文件)和b(块设备文件)等。 接下来的三组字符:这三组各自三个字符的字符串表示文件的权限。 第一组(例如,rwx)表示文件所有者的权限。 第二组(例如,r-x)表示与文件所有者同组的用户的权限。 第三组(例如,r-x)表示其他用户的权限。 在这三组中,r代表读权限,w代表写权限,x代表执行权限。如果某个位置是-,则表示相应的权限被禁用。 r:针对文件可以查看文件内容针对文件夹,可以查看文件夹内容,如ls命令 w:针对文件表示可以修改此文件针对文件夹,可以在文件夹内:创建、删除、改名等操作 x:针对文件表示可以将文件作为程序执行针对文件夹,表示可以更改工作目录到此文件夹,即cd进入 末尾的加号(+):表示该文件或目录有额外的访问控制列表(Access Control Lists, ACLs)设置。ACLs 允许你为单个用户或组设置更细粒度的权限。 末尾的@符号:表示该文件或目录有扩展属性。扩展属性是存储在文件系统中的元数据,它们允许用户为文件或目录附加任意的名称-值对数据。 因此,drwxr-xr-x+的意思是: d:这是一个目录。 rwx:所有者拥有读、写和执行权限。 r-x:同组用户拥有读和执行权限,但没有写权限。 r-x:其他用户拥有读和执行权限,但没有写权限。 +:存在额外的访问控制列表设置。

chmod命令

修改文件、文件夹的权限。只有文件、文件夹的所属用户或root用户可以修改。
语法: chmod [-R] 权限 文件或文件夹 -R,对文件夹内的全部内容应用同样的操作 # 例子: chmod u=rwx,g=rx,o=x hello.txt # 将文件权限修改为:rwxr-x--x # u表示user所属用户权限,g表示group组权限,o表示other其它用户权限 chmod -R u=rwx,g=rx,o=x test # 将文件夹test以及文件夹内全部内容权限设置为:rwxr-x--x chmod 755 myfile.txt # 更改myfile.txt文件的权限为755(即所有者可读写执行,其他用户可读可执行) chmod u+x myfile.txt # 为myfile.txt文件的所有者添加执行权限 chmod -R 755 mydirectory # 更改mydirectory目录及其所有子目录和文件的权限为755 权限可以用3位数字来代表,第一位数字表示用户权限,第二位表示用户组权限,第三位表示其它用户权限。 数字的细节如下:r记为4,w记为2,x记为1,可以有: 0:无任何权限 即 --- 1:仅有x权限 即 --x 2:仅有w权限 即 -w- 3:有w和x权限 即 -wx 4:仅有r权限 即 r-- 5:有r和x权限 即 r-x 6:有r和w权限 即 rw- 7:有全部权限 即 rwx

chown命令

更改文件或目录的所有者和/或用户组。此命令只适用于root用户执行
语法: chown [-R] [owner][:[group]] file 例子: chown root hello.txt # 将hello.txt所属用户修改为root chown :root hello.txt # 将hello.txt所属用户组修改为root chown root:itheima hello.txt # 将hello.txt所属用户修改为root,用户组修改为itheima chown new_owner folder_name # 修改文件夹的所有者 chown -R new_owner folder_name # 修改文件夹及其所有子文件和子文件夹的所有者 chown new_owner:new_group folder_name # 修改文件夹的所有者和用户组 chown -R new_owner:new_group folder_name # 修改文件夹及其所有子文件和子文件夹的所有者和用户组 chown -R root:root hadoop-3.3.6 spark-2.4.5-bin-hadoop2.7 flink-1.10.0 # 多个文件夹一起修改

软件和服务

软件安装

Centos系统中的包管理工具 yum,Ubuntu系统中的包管理工具 apt。实战详情详见 《Linux 软件安装实践》

CentOS —— yum

YUM(Yellowdog Updater, Modified)是基于 RPM 包管理器的 Linux 发行版(如 CentOS、Red Hat Enterprise Linux 和 Fedora)中的包管理工具。YUM 提供了一种简便的方法来安装、更新和删除软件包,并解决软件包的依赖关系。(.rpm 安装文件)
  • 安装软件包:自动处理依赖关系并安装所需的软件包。
  • 更新软件包:更新已安装的软件包到最新版本。
  • 删除软件包:删除已安装的软件包并处理相关依赖。
  • 查询软件包:查询软件包的信息,如可用版本、依赖关系等。
yum命令需要root权限、需要联网
语法: yum [-y] [install | update | remove | search] 软件名 -y,自动确认,无需手动确认安装或卸载过程 sudo yum install package_name # 安装软件包 sudo yum install httpd sudo yum update package_name # 更新软件包 sudo yum update httpd sudo yum update # 更新系统中的所有软件包 sudo yum remove package_name # 删除软件包 sudo yum remove httpd yum list installed # 列出已安装的软件包 yum list available # 列出可用的软件包 yum search keyword # 搜索软件包 yum search httpd yum info package_name # 显示软件包的信息 yum info httpd sudo yum clean all # 清理缓存 sudo yum clean metadata # 只清理某一类型的缓存,例如元数据缓存

Ubuntu —— apt

apt(Advanced Package Tool)是 Debian 及其衍生发行版(如 Ubuntu)中的包管理工具。与 apt-getapt-cache 相比,apt 命令更为简洁和用户友好,集成了大多数常用的功能。(.deb 安装文件)
  1. 安装软件包:从软件仓库中下载并安装软件包。
  1. 更新软件包:将已安装的软件包更新到最新版本。
  1. 删除软件包:卸载已安装的软件包,并可选择删除配置文件。
  1. 查询软件包:查询软件包的信息,如可用版本、依赖关系等。
  1. 管理软件源:添加、删除或配置软件源。
apt命令需要root权限、需要联网
语法: apt [-y] [install | update | remove | search] 软件名 -y,自动确认,无需手动确认安装或卸载过程 sudo apt update # 更新包索引,这会从已配置的软件源中获取最新的软件包信息 sudo apt upgrade # 升级所有已安装的软件包,但不会移除任何已安装的软件包或安装新的依赖。 sudo apt full-upgrade # 全系统升级(可能会移除或安装新的依赖) apt search keyword # 搜索软件包 apt search apache2 apt show package_name # 显示软件包的信息 apt show apache2 sudo apt install package_name # 安装软件包 sudo apt install apache2 sudo apt remove package_name # 删除软件包(保留配置文件) sudo apt remove apache2 sudo apt purge package_name # 删除软件包及其配置文件 apt list --installed # 列出所有已安装的软件包 apt list # 列出所有可用的软件包(慎用) sudo apt clean # 清理已下载的包文件 sudo apt autoremove # 清理不再需要的包文件 dpkg -l # 列出所有已安装的软件包 dpkg -l | grep mysql # 筛选相关的已安装的软件包
配置文件
APT 的配置文件主要位于 /etc/apt/ 目录中,其中包含:
  • /etc/apt/sources.list:主要软件源配置文件。
  • /etc/apt/sources.list.d/:包含额外软件源的配置文件。
示例
/etc/apt/sources.list 文件示例:
deb <http://archive.ubuntu.com/ubuntu> focal main restricted deb <http://archive.ubuntu.com/ubuntu> focal-updates main restricted deb <http://archive.ubuntu.com/ubuntu> focal universe deb <http://archive.ubuntu.com/ubuntu> focal-updates universe deb <http://archive.ubuntu.com/ubuntu> focal multiverse deb <http://archive.ubuntu.com/ubuntu> focal-updates multiverse deb <http://archive.ubuntu.com/ubuntu> focal-backports main restricted universe multiverse deb <http://security.ubuntu.com/ubuntu> focal-security main restricted deb <http://security.ubuntu.com/ubuntu> focal-security universe deb <http://security.ubuntu.com/ubuntu> focal-security multiverse
安装遇到问题
1、锁定问题:Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 903639 (unattended-upgr) ;通常是因为另一个包管理进程正在运行,如自动升级进程(unattended-upgr
  • 解决:
    • 等待
    • 手动终止进程
      • ps aux | grep apt # 查找进程号(PID) sudo kill -9 <PID> # 杀死进程 sudo apt -y install ntp # 再次尝试安装
    • 从根源解决问题:关闭 apt 的自动升级服务 或者修改其配置文件或者卸载自动升级程序
      • # 方法 1:禁用服务 sudo systemctl disable unattended-upgrades sudo systemctl stop unattended-upgrades # 方法 2:卸载程序 sudo apt remove unattended-upgrades # 方法 3:编辑 50unattended-upgrades 配置文件,禁用自动升级。 sudo nano /etc/apt/apt.conf.d/50unattended-upgrades 将 `//Unattended-Upgrade::Automatic-Reboot "false";` 修改为 `Unattended-Upgrade::Automatic-Reboot "false";` # 方法 4:编辑 20auto-upgrades 配置文件,禁用自动更新 sudo nano /etc/apt/apt.conf.d/20auto-upgrades 将 ` APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; ` 修改为 ` APT::Periodic::Update-Package-Lists "0"; APT::Periodic::Unattended-Upgrade "0"; `

源码安装

1. 获取源码
首先,从官方网站或其他可信来源下载软件的源代码包(通常是 .tar.gz 或 .tar.bz2 格式)。
wget http://example.com/software.tar.gz
2. 解压缩源码包
使用 tar 命令解压缩下载的源码包。
tar -xzf software.tar.gz # 对于 .tar.gz 文件 tar -xjf software.tar.bz2 # 对于 .tar.bz2 文件
3. 进入源码目录
解压后,进入解压缩后的目录。
cd software
4. 配置
运行 ./configure 脚本来检查系统环境和依赖关系,并生成适合系统的 Makefile。可以通过添加选项来定制安装。
./configure
常见选项:
  • -prefix=/path/to/installation: 指定安装路径
  • -enable-feature: 启用某特性
  • -disable-feature: 禁用某特性
例如:
./configure --prefix=/usr/local
5. 编译
使用 make 命令编译源码。这一步可能需要一些时间,具体取决于软件的大小和系统的性能。
make
6. 安装
使用 make install 命令安装编译好的软件。通常需要超级用户权限,因此可以使用 sudo
sudo make install
7. 清理(可选)
安装完成后,可以运行 make clean 命令来清理编译过程中生成的临时文件。
make clean
注意事项
  • 依赖关系:确保安装了所有必需的依赖包,通常可以通过包管理器(如 aptyumpacman 等)来安装。
  • 权限:安装步骤可能需要超级用户权限(使用 sudo)。
  • 文档:查看 README 或 INSTALL 文件,了解具体软件的安装说明和配置选项。
 
#源代码构建python3.x [root ~]# yum install gcc     (安装编译环境) [root ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz   (下载安装包) [root ~]# gunzip Python-3.6.5.tgz     (解压) [root ~]# tar -xvf Python-3.6.5.tar   (解归档) [root ~]# cd Python-3.6.5           (进入安装包) [root ~]# ./configure --prefix=/usr/local/python36 --enable-optimizations   (配置) [root ~]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel   (安装相关依赖库) [root ~]# make && make install       (编译执行安装文件) ... [root ~]# ln -s /usr/local/python36/bin/python3.6 /usr/bin/python3     (给python指令文件创建快捷方式python3) [root ~]# python3 --version Python 3.6.5 [root ~]# python3 -m pip install -U pip     (安装pip) [root ~]# ln -s /usr/local/python36/bin/pip /usr/bin/pip3     (给pip指令创建快捷方式pip3) [root ~]# pip3 --version

配置环境变量

在 Linux 中为安装好的软件配置环境变量的目的是为了简化软件的使用,使其在任何目录下都可以直接调用。
在终端启动 shell 时,shell 会去读取配置文件,这时会区分到底是 非登录 shell 还是登录 shell。
如果是为所有用户设置环境变量则一般修改/etc/profile文件,为当前用户设置环境变量则一般修改当前用户的~/.bashrc 文件
  • 登录 Shell
    • 定义: 登录 Shell 是通过登录界面(例如 tty、SSH、文本控制台)启动 Shell 会话时获得的 Shell。
    • 启动方式: 在登录系统时(如通过 SSH 或控制台)或显式使用  选项启动 Shell(如 bash -l)时,会得到一个登录 Shell。
    • 启动文件:
      • /etc/profile:为所有用户设置系统级环境变量。
      • ~/.bash_profile:为当前用户设置专用环境变量。
      • ~/.bash_login:如果 ~/.bash_profile 不存在,则读取此文件。
      • ~/.profile:如果 ~/.bash_profile 和 ~/.bash_login 都不存在,则读取此文件。
      • 如果以上文件都不存在,则自行创建
  • 非登录 shell
    • 定义: 非登录 Shell 是当您在已经登录的会话中启动一个新的 Shell 会话(例如打开一个新终端窗口,或通过 bash 命令启动新的 Bash 会话)时获得的 Shell。
    • 启动方式: 当您在图形界面中打开一个终端窗口,或从一个已经存在的 Shell 中启动另一个 Shell 时,会得到一个非登录 Shell。
    • 启动文件:
      • /etc/bash.bashrc:为所有用户设置系统级 Bash 环境变量。
      • ~/.bashrc:为当前用户设置专用 Bash 环境变量。
      • 如果以上文件都不存在,则自行创建

软件服务控制

Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启。能够被systemctl管理的软件,一般也称之为:服务
语法: systemctl 控制命令 服务名 systemctl start # 启动 systemctl stop # 关闭 systemctl status # 查看状态 systemctl enable # 开启开机自启 systemctl disable # 关闭开机自启
启动服务
启动服务时如果提示如下:
Synchronizing state of ntp.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable ntp
这通常表示 systemctl 已经尝试将 SysV(System V)风格的服务脚本转换为 systemd 单元并启用该服务。在大多数情况下,这个消息表明命令已成功执行。
查看状态
systemctl status ntp.service # 输出内容 ● ntp.service - Network Time Service Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-06-24 08:12:47 UTC; 1 weeks 0 days ago Docs: man:ntpd(8) Main PID: 12345 (ntpd) Tasks: 1 (limit: 4915) Memory: 1.2M CPU: 6ms CGroup: /system.slice/ntp.service └─12345 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 121:130 Jun 24 08:12:47 ubuntu-server systemd[1]: Starting Network Time Service... Jun 24 08:12:47 ubuntu-server ntpd[12345]: ntpd 4.2.8p15@1.3728-o (1): Starting Jun 24 08:12:47 ubuntu-server systemd[1]: Started Network Time Service. # 输出解读 服务名称和状态行 服务名称 (● ntp.service):显示服务的名称。 Loaded:显示服务单元是否已加载到 systemd 中。 Active:显示服务当前的活动状态。 (running):服务正在运行。 (exited):服务已经运行过并已退出。 (failed):服务启动失败。 Since:显示服务的启动时间或最后一次状态变更时间。 Docs:提供了关于服务的额外文档信息。 服务详细信息 Main PID:显示主要进程的 PID(Process ID)。 Tasks:显示服务当前运行的任务数和任务限制。 Memory:显示服务占用的内存量。 CPU:显示服务使用的 CPU 时间。 CGroup:显示服务所属的控制组。 日志消息 显示自服务启动以来的系统日志消息。这些消息记录了服务的重要事件,如启动、停止、错误等。 每条消息的格式一般为 时间 主机名 systemd[PID]: 消息内容。
查看服务
systemctl list-units --type=service # 列出所有服务 systemctl list-unit-files --type=service # 列出所有已加载的服务(包括未运行的服务) systemctl list-units --type=service --state=running # 列出所有正在运行的服务 systemctl --failed # 列出所有失败的服务 # 输出内容 UNIT LOAD ACTIVE SUB DESCRIPTION service1.service loaded active running Description of service1 service2.service loaded inactive dead Description of service2 ... # 输出解读 UNIT:服务单元的名称,以 .service 结尾。例如 apache2.service。 LOAD:服务单元的加载状态,表示 systemd 是否正确加载了该服务单元的配置文件。可能的值有: loaded:配置文件已成功加载。 not-found:配置文件未找到。 error:加载配置文件时出错。 ACTIVE:服务单元的活动状态,表示整体状态。可能的值有: active:服务单元正在运行或已启动。 inactive:服务单元未运行。 activating:服务单元正在启动。 deactivating:服务单元正在停止。 failed:服务单元已启动失败。 SUB:服务单元的详细子状态,提供更具体的状态信息。可能的值取决于服务单元的类型。对于 service 类型,常见的值包括: running:服务正在运行。 exited:服务已成功退出。 dead:服务未运行。 start、stop、reload 等:表示正在进行相应的操作。 DESCRIPTION:服务单元的描述信息,通常提供关于服务的简要描述。 service --status-all # 列出所有服务;这个命令会列出所有服务,并在每个服务前显示一个符号: [ + ] 表示服务正在运行。 [ - ] 表示服务未运行。 [ ? ] 表示服务状态未知。
系统内置的服务比较多,比如:
  • NetworkManager:主网络服务
  • network:副网络服务
  • firewalld:防火墙服务
  • sshd:ssh服务(远程登录Linux使用的就是这个服务)
大部分第三方软件服务也可以使用systemctl控制,部分软件安装后没有自动集成到systemctl中,可以手动添加。

网络相关

防火墙

Ubuntu

# 防火墙状态 sudo ufw status # 防火墙放行端口 sudo ufw allow 8042/tcp

CentOS

# 防火墙状态 sudo firewall-cmd --list-all # 防火墙放行端口 sudo firewall-cmd --add-port=8042/tcp --permanent sudo firewall-cmd --reload

IP地址

每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯。可以通过命令:ifconfig,查看本机的ip地址,如无法使用ifconfig命令,可以安装:sudo apt install net-tools ,ifconfig 会显示多个网卡。
root@ubuntu-linux-22-04-desktop:~# ifconfig enp0s5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.211.55.6 netmask 255.255.255.0 broadcast 10.211.55.255 inet6 fdb2:2c26:f4e4:0:21c:42ff:fecb:297c prefixlen 64 scopeid 0x0<global> inet6 fe80::21c:42ff:fecb:297c prefixlen 64 scopeid 0x20<link> ether 00:1c:42:cb:29:7c txqueuelen 1000 (Ethernet) RX packets 1107781 bytes 1420170415 (1.4 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 334375 bytes 88549436 (88.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 648 bytes 57358 (57.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 648 bytes 57358 (57.3 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
sudo systemctl restart systemd-networkd # 重启网络服务,在较新的 Ubuntu 系统中对应的网络服务是systemd-networkd
127.0.0.1:这个IP地址用于指代本机;0.0.0.0:特殊IP地址
  • 可以用于指代本机
  • 可以在端口绑定中用来确定绑定关系(后续讲解)
  • 在一些IP地址限制中,表示所有IP的意思,如放行规则设置为0.0.0.0,表示允许任意IP访问
 
设置静态 IP
  1. 登录主机,打开终端,切换到 root
  1. 修改 IP 配置文件:vim /etc/netplan/00-installer-config.yaml
    1. 💡
      文件打开后是这样的
      network: version: 2 ethernets: # 以太网 enp0s5: # 网卡名称 dhcp4: true # dhcp4表示动态主机配置协议,如果开启那将自动获取动态 IP
      修改后
      network: version: 2 ethernets: enp0s5: dhcp4: no addresses: # IP地址 - 10.211.55.7/24 # 必须要这样设置
      还可以多配置一下参数
      network: version: 2 ethernets: enp0s5: dhcp4: no addresses: # IP地址 - 10.211.55.7/24 routes: # 网关 - to: default via: 10.211.55.1 # 确保网关和IP地址在同一个网段,不然连不上网 nameservers: # DNS服务器 addresses: - 8.8.8.8 - 8.8.4.4
  1. 应用配置:sudo netplan apply
  1. 遇到问题:
      • 提示权限太 open:sudo chmod 600 /etc/netplan/00-installer-config.yaml
      • 提示Open vSwitch 服务没有开启。后续部署集群可能会用到。遇到再解决

主机名

hostname # 查看主机名 hostnamectl set-hostname anjhon # 修改主机名

域名解析

域名解析是指将域名(如 example.com)转换为与之相关联的 IP 地址(如 192.0.2.1),以便网络设备能够正确定位和访问特定的网络资源,比如网站、邮件服务器等。
域名解析过程:
  • 用户输入域名: 用户在浏览器或其他应用程序中输入要访问的域名(例如 www.example.com)。
  • 本地解析: 首先,操作系统会检查本地 hosts 文件,如果有对应的域名和 IP 地址映射,就直接使用这个映射。
  • DNS 查询: 如果本地未找到域名映射,操作系统将发送 DNS(Domain Name System)查询请求到本地网络中配置的 DNS 服务器。
  • 递归查询: 如果本地 DNS 服务器没有缓存该域名的解析结果,它将发起一个递归查询。递归查询是指 DNS 服务器会从根域名服务器开始,依次向下查询,直到找到负责该域名区域的权威 DNS 服务器为止。
  • 获取域名解析结果: 当找到负责该域名区域的权威 DNS 服务器后,它会返回域名对应的 IP 地址给本地 DNS 服务器。
  • 返回结果给客户端: 本地 DNS 服务器收到 IP 地址后,将结果返回给用户的操作系统或设备。
  • 访问目标服务: 用户的设备使用获取到的 IP 地址,与目标服务器建立连接,进行访问或通信。
DNS 解析类型:
  • A 记录(Address Record):将域名解析为 IPv4 地址。
  • AAAA 记录:将域名解析为 IPv6 地址。
  • CNAME 记录(Canonical Name):将域名解析为另一个域名,通常用于将多个域名指向同一主机。
  • MX 记录(Mail Exchange):指定邮件服务器的域名。
  • TXT 记录:存储任意文本信息,通常用于验证域名所有权或提供其他信息。
  • NS 记录(Name Server):指定该域名由哪个 DNS 服务器解析。
本地(Mac)域名映射:
  1. 打开终端(Terminal)应用程序。
  1. 打开 hosts 文件:输入下面的命令,输入密码后,会打开 hosts 文件。
    1. # nano和vim 二选一都可以 sudo nano /etc/hosts # nano更轻量化,更直观容易上手 sudo vim /etc/hosts # vim功能更丰富
  1. 编辑 hosts 文件:在 hosts 文件的末尾添加一行,包括要映射的 IP 地址和主机名,格式如下:IP地址 主机名
    1. notion imagenotion image
  1. 保存 hosts 文件:在 nano 编辑器中,按下 Ctrl + O 保存文件,然后按下 Enter 确认文件名。
  1. 退出 nano 编辑器:按下 Ctrl + X 退出编辑器。
  1. 测试 hosts 文件:在终端中输入 ping myserver.local,如果能够成功 ping 通,则说明 hosts 文件配置正确。如果ping 不通则需要清空 DNS 的缓存:sudo killall -HUP mDNSResponder

下载和网络请求

检查网络连通
语法 ping [-c num] 网址或IP地址 # 检查指定的网络服务器是否是可联通状态 -c,检查的次数,不使用-c选项,将无限次数持续检查 -i,每隔多少秒ping 一次 ping -c 3 www.baidu.com
下载命令
语法 wget [-b -O -P] [重命名文件名 | 保存位置] url -b,可选,后台下载,会将日志写入到当前工作目录的wget-log文件 -O,可选,重命名文件 -P,可选,指定保存位置 例子: wget http://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz wget -O mydownload.txt http://example.com/myfile.txt # 下载文件并将其命名为mydownload.txt wget -P /path/to/directory http://example.com/myfile.txt wget -b http://example.com/myfile.txt # 从http://example.com/myfile.txt下载文件, 通过tail命令可以监控后台下载进度:tail -f wget-log
发起请求
语法 curl [-O] url -O:用于下载文件,当url是下载链接时,可以使用此选项保存文件 例子: curl http://example.com # 从http://example.com获取内容 curl -o myfile.html http://example.com # 从http://example.com获取内容并将其写入myfile.html curl -I http://example.com # 仅获取http://example.com的HTTP头信息 curl -d "param1=value1&param2=value2" -X POST http://example.com # 向http://example.com发送POST请求 curl -O http://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz # 下载文件

端口

端口,是设备与外界通讯交流的出入口。端口可以分为:物理端口和虚拟端口两类
物理端口:又可称之为接口,是可见的端口,如USB接口,RJ45网口,HDMI端口等 虚拟端口:是指计算机内部的端口,是不可见的,是用来操作系统和外部进行交互使用的
计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序,确保程序之间进行沟通。IP地址相当于小区地址,在小区内可以有许多住户(程序),而门牌号(端口)就是各个住户(程序)的联系地址
常见虚拟端口分类
  1. 系统端口(Well-known Ports)
      • 范围:0 到 1023
      • 描述:这些端口号被标准化,用于常见的服务和协议,如 HTTP(端口号 80)、HTTPS(端口号 443)、FTP(端口号 21)、SSH(端口号 22)、Telnet(端口号 23)等。
  1. 注册端口(Registered Ports)
      • 范围:1024 到 49151
      • 描述:这些端口号用于用户注册应用程序或服务,没有标准化,但是分配由 IANA(Internet Assigned Numbers Authority)进行管理。
  1. 动态和私有端口(Dynamic and/or Private Ports)
      • 范围:49152 到 65535
      • 描述:这些端口号通常被客户端应用程序使用,用于临时连接和通信。它们不受 IANA 管理,可以动态分配。
 
nmap 被查看的IP地址 nmap 127.0.0.1 # 查看本机暴露的端口 lsof -i :8080 # 将列出所有占用 8080 端口的进程及其详细信息 lsof -i :8000 | grep LISTEN # 列出正在监听8000端口的进程 lsof -i :8000 | grep LISTEN | awk '{print $2}' # 列出正在监听8000端口的进程(只打印进程ID) sudo netstat -anp | grep :<port_number> netstat -anp | grep :631 # 查看指定端口的占用情况 netstat -anp | grep 29262 # 查看进程号占用的端口

SSH服务

SSH服务是一种用于远程登录的安全认证协议。

密码认证

1、远程软件登录服务器
远程软件也可以选择密钥登录
在服务器的终端中使用 ifconfig 命令,查看服务器的 IP 地址,(在Ubuntu中)如果提示找不到命令,则需要先安装网络工具:sudo apt install net-tools ,然后再使用 ifconfig 命令,找到 enp 中的 IP 地址:(如果虚拟机或服务器重启,IP 地址可能会发生改变,需要重新设置连接)
notion imagenotion image
然后在本地软件连接,这里使用的是 Xterminal:
notion imagenotion image
2、命令行远程登录其他主机
SSH可以让我们通过SSH命令,远程的登陆到其它的主机上,比如:在node1执行:ssh root@node2,将以root用户登录node2(主机名,在使用主机名登录之前需要将主机名与 IP 的映射关系添加到 /etc/hosts 文件中,详见域名解析章节)服务器,输入密码即可成功登陆;或者ssh node2,将以当前用户直接登陆到node2服务器,前提是对端服务器也要有相同的用户名,如果没有会提示:Permission denied, please try again.
可能会遇到的情况:
  1. 对方服务器的 SSH 禁止以 root 账户登录
    1. 在对端服务器(可以用对端服务器的其他账户登录切换到 root 或使用 sudo 操作)上修改 SSH 的配置文件
      1. sudo vim /etc/ssh/sshd_config
    2. 找到下面两项并修改为 yes;如果没有就添加,如果被注释就取消注释
      1. PermitRootLogin yes PasswordAuthentication yes
    3. 保存退出后重启 SSH 服务
      1. sudo systemctl restart sshd
    4. 重新尝试ssh root@node2
  1. 登录之后如何退出:eixt 或者 control + d

公钥认证

公钥认证机制:将公钥给对方,对方用来验证登录者的身份
  • 在本地生成一对密钥:公钥和私钥。
  • 将公钥分发给对端服务器的。
  • 当尝试通过 SSH 登录对端服务器时,服务器会向你发送一个随机数加密请求。
  • 本端的 SSH 客户端使用本端的私钥对这个随机数进行解密并返回给对端服务器。
  • 服务器使用公钥对返回的结果进行验证,如果验证成功,则允许登录。
 
公钥认证注意事项:
  • 生成密钥对的时候不一定需要切换到 root 用户,可以根据场景需要使用指定用户
  • 如果本地有两个用户,A 和 B,现在使用 A 账户已经实现了对服务器的免密登陆,现在想使用B用户对服务器实现免密登陆,还需要切换到 B 用户重新生成对应的公钥然后分发给服务器
 
公钥认证的流程
确保每个用户都有自己的密钥对才能实现免密登陆
1、生成密钥对(公钥和私钥),执行命令一路回车即可
ssh-keygen -t rsa ssh-keygen -t rsa -b 4096 # 命令详解 ssh-keygen:这是生成、管理和转换认证密钥的工具。 -t rsa:指定要生成的密钥类型为 RSA(Rivest–Shamir–Adleman)。 -b 4096:指定密钥的长度为 4096 位。默认情况下,RSA 密钥的长度是 2048 位,但使用 4096 位的密钥可以提供更高的安全性。
执行完成后会在:~/.ssh 路径下生成两个文件:id_rsaid_rsa.pub
2、将公钥分发给对端服务器(也可以分发给自己,自己登录自己)
ssh-copy-id server2 # 不指定用户时,SSH 会默认使用当前系统的当前用户名进行连接 ssh-copy-id user@server2 # 指定用户和服务器(对端可能没有当前系统的当前用户,所以需要指定)
比如三台服务服务器之间想实现互相免密登录,那么就需要分别在三台服务器上生成密钥对,然后分别分发给其他对端。
  • 服务器一生成密钥对,将公钥分发给服务器二、服务器三
  • 服务器二生成密钥对,将公钥分发给服务器一、服务器三
  • 服务器三生成密钥对,将公钥分发给服务器一、服务器二
  1. 免密登陆
    1. ssh remote_user@remote_host
 
取消密钥认证:
  1. 登录目标主机
    1. ssh remote_user@remote_host
  1. 编辑 authorized_keys 文件
    1. 找到并删除包含 user1 用户公钥的那一行,然后保存并退出(在 vim 中按 :wq 保存并退出)。
      vim ~/.ssh/authorized_keys
  1. 验证删除结果
    1. 退出目标主机,再次尝试使用 SSH 密钥登录
  1. 删除本地私钥(可选)
    1. rm ~/.ssh/id_rsa rm ~/.ssh/id_rsa.pub
 
可能遇到的问题:
1、配置好之后进行登录还是需要密码
①、在配置文件vim /etc/ssh/sshd_config中设置允许公钥认证:(如果有直接修改,如果没有则添加,如果注释则取消注释)
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
保存退出并重启 ssh 服务:sudo systemctl restart sshd
②、检查密钥文件:cat ~/.ssh/authorized_keysssh-copy-id 命令会将多个公钥追加到该文件中。
③、目标主机/root目录权限不对导致的认证失败:
SSHD 检测到权限设置不当时,会拒绝使用公钥认证,因此转到密码认证。SSHD 严格检查用户主目录及 .ssh 目录的权限,确保只有用户自己能够访问和修改这些文件。如果权限设置不当,其他用户可能有权限读取或修改 authorized_keys 文件,这会带来安全隐患。SSHD要求用户主目录权限应该是 700 或者更严格,确保只有该用户有读取、写入和执行权限。如果 /root 目录的权限是 755,则其他用户可以读取该目录下的文件,这会让 SSHD 认为存在安全风险。.ssh 目录权限应该是 700,同样确保只有该用户可以访问该目录。authorized_keys 文件权限应该是 600,只允许该用户读取和写入该文件。
# 对 root 用户(对方使用 root 账户登录本机) sudo chown root:root /root # 修正 /root 目录的所有权 sudo chmod 700 /root # 修正 /root 目录的权限 sudo chown -R root:root /root/.ssh # 修正 .ssh 目录的所有权 sudo chmod 700 /root/.ssh # 修正 .ssh 目录的权限 sudo chmod 600 /root/.ssh/authorized_keys # 修正 authorized_keys 文件的权限 sudo systemctl restart sshd # 重启ssh服务 # 对普通用户(对方使用普通账户登录本机) sudo chown username:username /home/username sudo chmod 700 /home/username sudo chown -R username:username /home/username/.ssh sudo chmod 700 /home/username/.ssh sudo chmod 600 /home/username/.ssh/authorized_keys sudo systemctl restart sshd # 重启ssh服务
 

进程管理

ps命令

查看进程
语法:ps [选项] -e:显示出全部的进程 -f:以完全格式化的形式展示信息(展示全部信息) 例子: ps # 显示当前shell启动的进程 ps -e # 显示系统中的所有进程 ps -f # 显示完整格式的进程信息 ps -u username # 显示特定用户的所有进程 ps -fp <PID> ps -ef | grep tail # 查看 tail 相关的进程 ps aux | grep "hive" a:显示所有用户的进程。 u:以用户为主显示详细信息。 x:显示没有控制终端的进程。 # ps输出结果 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun25 ? 00:00:32 /lib/systemd/systemd --system --deserialize 52 root 2 0 0 Jun25 ? 00:00:00 [kthreadd] root 3 2 0 Jun25 ? 00:00:00 [rcu_gp] root 4 2 0 Jun25 ? 00:00:00 [rcu_par_gp] root 5 2 0 Jun25 ? 00:00:00 [netns] root 7 2 0 Jun25 ? 00:00:00 [kworker/0:0H-events_highpri] # 结果解读 UID: 用户ID。这是启动进程的用户的名称。 PID: 进程ID。这是每个进程的唯一标识符。 PPID: 父进程ID。这是启动该进程的进程的ID。 C: CPU使用率。这是进程的CPU使用率。 STIME: 启动时间。这是进程启动的时间。 TTY: 终端类型。该进程与其关联的终端。 TIME: CPU时间。这是进程消耗的CPU时间,以分钟:秒的格式表示。 CMD: 命令名称。这是启动进程的命令名称或程序。

kil命令

关闭进程
语法:kill [选项] pid -1:表示不间断重启; -9:表示强制杀死进程; -15:表示正常结束进程 例子: kill 1234 # 终止进程ID为1234的进程 kill -9 1234 # 终止进程ID为1234的进程

top命令

显示系统的实时状态
语法:top [选项] -c:显示进程的完整命令行路径 -u:显示特定用户的进程。 -d <seconds>:设置刷新间隔(默认是 1 秒)。 -o <field>:按指定字段排序,例如 -o cpu 按 CPU 使用率排序。 -n <count>:显示指定次数的更新后退出。 -i:不显示闲置和僵尸进程 例子: top # 显示系统的实时状态 top -u username # 显示特定用户的进程 top -p pid # 只显示特定进程的状态 top -o %CPU top -o %MEM # top命令输出 top - 10:30:14 up 1 day, 1:00, 3 users, load average: 0.22, 0.24, 0.20 Tasks: 214 total, 1 running, 212 sleeping, 0 stopped, 1 zombie %Cpu(s): 2.0 us, 3.2 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st MiB Mem : 1967.3 total, 257.7 free, 579.2 used, 1130.5 buff/cache MiB Swap: 2048.0 total, 1827.5 free, 220.5 used. 1164.7 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1244 paralle+ 20 0 4112828 172092 58588 S 2.0 8.5 47:27.43 /usr/bin/gnome-shell 1616 paralle+ 20 0 522152 13384 8456 S 1.0 0.7 18:18.08 /usr/bin/prlcc 1629 paralle+ 20 0 159656 3012 2852 S 1.0 0.1 9:47.83 /usr/bin/prldnd 978 rtkit 21 1 153484 1064 836 S 0.3 0.1 0:06.00 /usr/libexec/rtkit-daemon 2428 paralle+ 20 0 423572 17736 12116 S 0.3 0.9 0:12.14 update-notifier 934637 systemd+ 20 0 14992 6308 5488 S 0.3 0.3 0:25.68 /lib/systemd/systemd-oomd 1139599 root 20 0 77964 13628 10188 S 0.3 0.7 0:03.11 /usr/sbin/cupsd -l 1182880 paralle+ 20 0 13096 3320 2708 R 0.3 0.2 0:00.05 top -c # 输出内容解读 第一行:系统信息: 10:30:14:当前系统时间。 up 1 day, 1:00:系统已经运行了 1 天 1 小时。 3 users:当前有 3 个用户登录。 load average: 0.22, 0.24, 0.20:系统的负载平均值,分别为过去 1 分钟、5 分钟和 15 分钟的平均值。 第二行:任务信息: 214 total:总共 214 个任务(进程)。 1 running:1 个正在运行的进程。 212 sleeping:212 个睡眠状态的进程。 0 stopped:没有停止的进程。 1 zombie:有 1 个僵尸进程(已终止但未被父进程回收)。 第三行:CPU 状态 2.0 us:用户进程占用 CPU 时间的百分比。 3.2 sy:系统进程占用 CPU 时间的百分比。 0.0 ni:调整过优先级的进程占用 CPU 时间的百分比。 94.7 id:空闲 CPU 时间的百分比。 0.0 wa:等待 I/O 操作的 CPU 时间百分比。 0.0 hi:硬件中断占用 CPU 时间百分比。 0.2 si:软件中断占用 CPU 时间百分比。 0.0 st:虚拟机偷取的 CPU 时间百分比。 第四行:内存状态 1967.3 total:总内存大小,1967.3 MiB。 257.7 free:空闲内存大小,257.7 MiB。 579.2 used:已使用内存大小,579.2 MiB。 1130.5 buff/cache:缓冲区/缓存使用的内存大小,1130.5 MiB。 第五行:交换空间状态: 【脚注:Swap 交换空间是硬盘上的一个区域,用于在物理内存(RAM)不足时临时存储不活动的内存数据。这样可以让系统在物理内存用尽时继续运行,但访问交换空间比访问 RAM 要慢得多,因此频繁使用交换空间可能会导致系统性能下降。】 2048.0 total:总交换空间大小,2048.0 MiB。 1827.5 free:空闲交换空间大小,1827.5 MiB。 220.5 used:已使用交换空间大小,220.5 MiB。 1164.7 avail Mem:可用内存大小(包括缓冲区和缓存),1164.7 MiB。 进程信息表: PID:进程 ID。 USER:运行进程的用户。 PR:优先级,值越低,优先级越高。由进程的基础优先级和 nice 值决定。实际优先级(PR) = 基础优先级(通常为 20) + nice 值。 NI:nice值,值越低,优先级越高。可以通过 nice 命令修改,它可以在 -20 到 19 之间调整,默认值是 0。 VIRT:虚拟内存使用量。 RES:常驻内存使用量。 SHR:共享内存使用量。 S:进程状态(R 运行, S 睡眠, T 停止, Z 僵尸)。 %CPU:进程占用的 CPU 百分比。 %MEM:进程占用的内存百分比。 TIME+:进程使用的总 CPU 时间。 COMMAND:运行的命令或进程名。
top结果交互式选项
基本交互式选项 h:显示帮助信息,包括所有交互式命令。 q:退出 top 命令。 space:立即刷新屏幕。 P:按 CPU 使用率排序(默认)。 M:按内存使用率排序。 N:按进程 ID 排序。 T:按累计 CPU 时间排序。 显示选项 c:切换显示完整命令行和进程名称。 V:切换显示任务的树状视图(如果支持)。 l:切换显示负载平均和运行时间信息。 m:切换显示内存信息。 t:切换显示任务和 CPU 状态信息。 1:切换显示每个 CPU 核心的使用情况。 e:切换进程内存显示单位 E:切换顶部内存显示单位 i:不显示闲置或僵尸进程 任务管理 k:杀死进程。按下 k 键后,输入要杀死的进程 ID(PID),然后按回车键确认。 r:重新设置进程的 nice 值(优先级)。按下 r 键后,输入进程 ID 和新的 nice 值。 过滤和查找 u:按用户名过滤进程。按下 u 键后,输入用户名以查看该用户的进程。 n:设置显示进程的最大数量。按下 n 键后,输入要显示的进程数。 o:指定排序字段。按下 o 键后,输入要排序的字段名称。 /:搜索进程。按下 / 键后,输入搜索关键字。 =:重置排序字段为默认值。 其他功能 s:设置刷新间隔时间。按下 s 键后,输入秒数(例如,输入 5 将刷新间隔设置为 5 秒)。 W:保存当前配置到 ~/.toprc 文件,下次运行 top 命令时会自动应用这些设置。

df命令

显示文件系统的磁盘空间使用情况
语法: df [选项] [文件] 例子: df # 显示所有文件系统的磁盘使用情况 df /home # 显示/home目录所在的文件系统的磁盘使用情况 df -h # 以人类可读的格式显示磁盘使用情况 # df输出内容 Filesystem Size Used Avail Use% Mounted on tmpfs 197M 1.6M 196M 1% /run /dev/sda2 62G 10G 49G 18% / tmpfs 984M 0 984M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock /dev/sda1 1.1G 6.0M 1.1G 1% /boot/efi tmpfs 197M 124K 197M 1% /run/user/1000 iCloud 461G 396G 65G 86% /media/psf/iCloud # 内容解读 Filesystem:文件系统的名称或设备名。 Size:文件系统的总大小。 Used:已使用的空间大小。 Avail:可用的空间大小。 Use%:已使用空间的百分比。 Mounted on:文件系统挂载点,即该文件系统在系统中的位置。

du 命令

du (Disk Usage) 是一个用于查看文件和目录磁盘使用情况的命令。它可以显示指定文件或目录的磁盘使用情况,并支持多种选项来调整输出格式和详细程度。
du [选项] [文件或目录] -h:以人类可读的格式显示文件大小(例如 KB、MB、GB 等)。 -s:只显示指定文件或目录的总大小,不显示子目录的大小。 -a:显示目录中每个文件的大小,而不仅仅是目录的大小。 -d N:限制显示的目录深度为 N。 sudo du -hd 1 / 2>/dev/null # 查看根目录下的所有文件夹的大小(只显示根目录下一层的目录) # 有时候有些文件时临时的进程文件,当进程结束后会显示没有该文件的错误;还有特殊用户创建的挂载文件夹没有访问权限而报错,所以将标准错误输出到/dev/null中,这是一个特殊的设备文件,所有写入它的数据都会被丢弃。 sudo du -hd 1 / 2>/dev/null | sort -h # 将结果按照大小排序 sudo du -ah / | sort -rh | head -n 20 # 显示根目录下占用空间最大的前 20 个文件和目录。

iostat命令

显示设备的I/O统计信息和CPU使用情况
语法:iostat [选项] [设备] 例子: iostat # 显示所有设备的I/O统计信息 iostat -d # 只显示设备的I/O统计信息,不显示CPU使用情况 iostat -x # 显示详细的设备I/O统计信息 iostat -c 5 # 每5秒更新一次I/O统计信息

sar命令

语法 sar -n DEV num1 num2 -n,查看网络,DEV表示查看网络接口 num1:刷新间隔(不填就查看一次结束),num2:查看次数(不填无限次数) sar -n DEV 3 2 # sar输出内容 Linux 5.15.0-41-generic (anjhon) 06/26/24 _aarch64_ (2 CPU) 11:23:18 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 11:23:21 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11:23:21 enp0s5 15.95 14.62 13.74 2.00 0.00 0.00 0.00 0.00 11:23:21 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 11:23:24 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11:23:24 enp0s5 34.33 24.33 42.97 2.57 0.00 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: enp0s5 25.12 19.47 28.33 2.28 0.00 0.00 0.00 0.00 # 内容解读 IFACE:网络接口的名称(例如 lo、enp0s5)。 rxpck/s:每秒接收的包数。 txpck/s:每秒发送的包数。 rxkB/s:每秒接收的千字节数。 txkB/s:每秒发送的千字节数。 rxcmp/s:每秒接收的压缩包数。 txcmp/s:每秒发送的压缩包数。 rxmcst/s:每秒接收的多播包数。 %ifutil:接口使用率的百分比(未显示在示例输出中,通常表示网络接口的带宽使用情况)。

文件相关

文件传输

本地主机和服务器之间可以实现文件传输,一般的连接软件通常都有上传和下载的功能,同时也可以通过命令来实现相同的功能。
在 Ubuntu 系统中先通过sudo apt install -y lrzsz命令下载工具.
  • rz命令:上传文件(在命令行终端输入rz命令并回车,会弹出文件选择窗口,选择文件后进行上传)
  • sz命令:下载文件

scp命令

scp命令是cp命令的升级版,即:ssh cp,通过SSH协议完成文件的复制。
scp [-r] 参数1 参数2 - -r选项用于复制文件夹使用,如果复制文件夹,必须使用-r - 参数1:本机路径 或 远程目标路径 - 参数2:远程目标路径 或 本机路径 如: scp -r /export/server/jdk root@node2:/export/server/ 将本机上的jdk文件夹, 以root的身份复制到node2的/export/server/内 同SSH登陆一样,账户名可以省略(使用本机当前的同名账户登陆) 如: scp -r node2:/export/server/jdk /export/server/ 将远程node2的jdk文件夹,复制到本机的/export/server/内 # 拿取一个文件夹下的多个文件 scp user@remote_host:/remote/directory/{file1,file2,file3} local_destination/ scp user@remote_host:/remote/directory/*.txt local_destination/ # 拿取多个路径下的多个文件 scp user@remote_host:/path/file1 /path/file2 /path/file3 local_destination/ # scp命令的高级用法 cd /export/server scp -r jdk node2:`pwd`/ # 将本机当前路径的jdk文件夹,复制到node2服务器的同名路径下 scp -r jdk node2:$PWD # 将本机当前路径的jdk文件夹,复制到node2服务器的同名路径下

压缩与解压

Linux 中常见的压缩格式:tar、gzip、zip
  • .tar,称之为tarball,归档文件,即简单的将文件组装到一个.tar的文件内,并没有太多文件体积的减少,仅仅是简单的封装
  • .gz,也常见为.tar.gz,gzip格式压缩文件,即使用gzip压缩算法将文件压缩到一个文件内,可以极大的减少压缩后的体积
针对这两种格式,使用tar命令均可以进行压缩和解压缩的操作

tar命令

归档、解归档、压缩、解压:.tar.tar.gz.tar.bz2.tgz
语法: tar [选项] [文件或目录] -c:创建新的归档文件。 -x:从归档文件中提取文件。 -v:显示详细信息。 -f:后面跟归档文件名。-f选项必须在所有选项中位置处于最后一个 -z:通过gzip压缩或解压文件。-z选项如果使用的话,一般处于选项位第一个 -C:选择解压的目的地,用于解压模式 -j:通过bzip2压缩或解压文件。 -t:列出归档文件的内容。 -p:保留文件的原始权限。 -r:将文件追加到已经存在的归档文件中。 -u:更新归档文件中的文件。 -W:验证归档文件。 例子: tar -cvf archive.tar directory # 将目录打包为archive.tar文件 tar -cvf test.tar 1.txt 2.txt 3.txt # 将1.txt 2.txt 3.txt 压缩到test.tar文件内 tar -xvf archive.tar # 解压archive.tar文件到当前路径下 tar -xvf test.tar # 解压test.tar文件到当前路径下 tar -xvf test.tar -C /home/itheima # 解压test.tar,将文件解压至指定目录(/home/itheima) tar -zcvf test.tar.gz 1.txt 2.txt 3.txt # 将1.txt 2.txt 3.txt 压缩到test.tar文件内,使用gzip模式 tar -zxvf test.tar.gz # 将test.tar.gz文件解压,使用gzip模式

zip命令

将文件或目录压缩成一个zip格式的归档文件,压缩文件为zip压缩包
语法: zip [选项] 压缩文件名.zip 文件或目录 -r:用于递归地压缩目录及其内容,被压缩的包含文件夹的时候,需要使用-r选项 -m:用于将原始文件删除, -d:用于从归档文件中删除文件 例子: zip test.zip a.txt b.txt c.txt # 将a.txt b.txt c.txt 压缩到test.zip文件内 zip -r test.zip test itheima a.txt # 将test、itheima两个文件夹和a.txt文件,压缩到test.zip文件内 zip -r archive.zip directory # 压缩目录为archive.zip文件

unzip命令

解压zip压缩包,如果解压目的地有同名文件则会被覆盖
语法: unzip [选项] 压缩文件名.zip -d,指定要解压去的位置 例子: unzip test.zip # 将test.zip解压到当前目录 unzip test.zip -d /home/itheima # 将test.zip解压到指定文件夹内(/home/itheima)

实践应用

nohup python dssm_recall_train_V2.py > 20240425_train_v2_01.log & # 后台运行并将结果写写进之文件 # nohup是"No Hang UP"的缩写,它的作用是让随后运行的命令忽略挂起信号(SIGHUP)。这意味着,即使你退出了终端或者会话,该命令仍然会在后台运行。 # 当你在命令的末尾添加&时,系统会立即返回命令提示符,而不是等待命令完成。 python "$PYTHON_SCRIPT" $DATA_FILE_USR $DATA_FILE_PRDCT $START_LINE $DATA_AMOUNT $RECALL_NUM_PROCESS > "$LOG_FILE" 2>&1 & # python "$PYTHON_SCRIPT":运行指定的Python脚本。$PYTHON_SCRIPT是一个变量,表示Python脚本的路径。 # $DATA_FILE_USR:传递给Python脚本的第一个参数,代表用户数据文件。 # $DATA_FILE_PRDCT:传递给Python脚本的第二个参数,代表产品数据文件。 # $START_LINE:传递给Python脚本的第三个参数,表示数据处理的起始行。 # $DATA_AMOUNT:传递给Python脚本的第四个参数,表示要处理的数据量。 # $RECALL_NUM_PROCESS:传递给Python脚本的第五个参数,表示召回的进程数。 # > "$LOG_FILE":将标准输出重定向到指定的日志文件。$LOG_FILE是一个变量,表示日志文件的路径。 # 2>&1:将标准错误输出重定向到标准输出,使得标准输出和标准错误输出都写入日志文件。 # &:将命令放到后台执行,使得终端可以继续执行其他命令。 ls -lrt cat 20240425_train_v2_01.log # 查看文件 ps top kill pid # 请求正常结束进程 kill -9 pid # 强制结束进程 vi python dssm_recall_train_V2.py esc + :set number + 回车 # 设置显示行号 esc + :set nonumber + 回车 # 设置不显示行号 esc + 458 + G # 跳到458行 esc + 0 # 光标移动到行首 esc + $ # 光标移动到行尾 esc + i # 进入编辑模式 esc + /key_word + 回车; # 查找关键词key_word,继续查找按 n 即可 esc + undo + 回车 # 撤销上以不的修改 esc + :3,20d + 回车 # 删除3到20行 esc + :wq # 保存并退出

定时任务

方法一:sleep

## 方法一:sleep sleep 7200 && nohup python -u data_statistics.py > ../logs/data_statistics.log 2>&1 & # 这个命令有个问题:当客户端关闭后,命令进程会被取消,导致定时任务失败。改进如下 nohup bash -c 'sleep 129600 && python -u data_sss.py > ../logs/data_sss.log 2>&1' & # nohup: "no hang up" 的缩写,允许命令在用户注销后继续运行,防止终端关闭时发送的 SIGHUP 信号终止进程 # bash -c '...': 启动一个新的 bash shell 来执行引号中的命令;-c 选项告诉 bash 从字符串中读取命令 # 这种格式允许我们将多个命令组合成一个整体,这对 nohup 很重要,因为它可以将整个命令序列作为一个单元来处理;直接使用 nohup sleep 129600 && ... 可能会导致 && 被当前 shell 解释,而不是被 nohup 控制的子进程解释。 # sleep 129600: 使进程暂停 129600 秒(约 36 小时) # &&:逻辑与操作符,表示在 sleep 命令完成后执行后面的命令

方法二:at

使用echo将命令传递给 at
echo "nohup python -u data_sss.py > ../logs/data_sss.log 2>&1 &" | at now + 10 minutes atq # 查看已安排的任务 # 在 at 命令中,时间单位有以下几种常用选项:minutes 或 mins:分钟;hours:小时;days:天;weeks:周;months:月;years:年 echo "nohup python -u data_sss.py > ../logs/data_sss.log 2>&1 &" | at now + 1 week echo "nohup python -u data_sss.py > ../logs/data_sss.log 2>&1 &" | at now + 1 hour 30 minutes echo "nohup python -u data_sss.py > ../logs/data_sss.log 2>&1 &" | at 10:15 7/31/2023 echo "nohup python -u data_sss.py > ../logs/data_sss.log 2>&1 &" | at 2:30 tomorrow

方法三:cron

对于本文内容有任何疑问, 可与我联系.