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内创建多个文件夹,在多个文件夹内再创建多个相同的文件夹
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 image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406241809117.png?table=block&id=24c182b8-5c81-4fc2-b5ca-2eed835c7ef5&cache=v2)
命令模式:
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 image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406251002383.png?table=block&id=d3366781-8c33-4d65-b50a-f05700169734&cache=v2)
Linux系统中可以:
- 配置多个用户
- 配置多个用户组
- 用户可以加入多个用户组中
![notion image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406250953917.png?table=block&id=212f7493-bc6c-4d06-8fbb-6443a574a885&cache=v2)
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-get
和 apt-cache
相比,apt
命令更为简洁和用户友好,集成了大多数常用的功能。(.deb 安装文件)- 安装软件包:从软件仓库中下载并安装软件包。
- 更新软件包:将已安装的软件包更新到最新版本。
- 删除软件包:卸载已安装的软件包,并可选择删除配置文件。
- 查询软件包:查询软件包的信息,如可用版本、依赖关系等。
- 管理软件源:添加、删除或配置软件源。
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 # 再次尝试安装
# 方法 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
注意事项
- 依赖关系:确保安装了所有必需的依赖包,通常可以通过包管理器(如
apt
、yum
、pacman
等)来安装。
- 权限:安装步骤可能需要超级用户权限(使用
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
- 登录主机,打开终端,切换到 root
- 修改 IP 配置文件:
vim /etc/netplan/00-installer-config.yaml
文件打开后是这样的
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
- 应用配置:
sudo netplan apply
- 遇到问题:
- 提示权限太 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)域名映射:
- 打开终端(Terminal)应用程序。
- 打开 hosts 文件:输入下面的命令,输入密码后,会打开 hosts 文件。
# nano和vim 二选一都可以 sudo nano /etc/hosts # nano更轻量化,更直观容易上手 sudo vim /etc/hosts # vim功能更丰富
- 编辑 hosts 文件:在 hosts 文件的末尾添加一行,包括要映射的 IP 地址和主机名,格式如下:
IP地址 主机名
![notion image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406281526593.png?table=block&id=703741be-dce5-4aac-a8fd-0dffcf5aac34&cache=v2)
- 保存 hosts 文件:在 nano 编辑器中,按下
Ctrl + O
保存文件,然后按下Enter
确认文件名。
- 退出 nano 编辑器:按下
Ctrl + X
退出编辑器。
- 测试 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¶m2=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地址相当于小区地址,在小区内可以有许多住户(程序),而门牌号(端口)就是各个住户(程序)的联系地址
常见虚拟端口分类
- 系统端口(Well-known Ports):
- 范围:0 到 1023
- 描述:这些端口号被标准化,用于常见的服务和协议,如 HTTP(端口号 80)、HTTPS(端口号 443)、FTP(端口号 21)、SSH(端口号 22)、Telnet(端口号 23)等。
- 注册端口(Registered Ports):
- 范围:1024 到 49151
- 描述:这些端口号用于用户注册应用程序或服务,没有标准化,但是分配由 IANA(Internet Assigned Numbers Authority)进行管理。
- 动态和私有端口(Dynamic and/or Private Ports):
- 范围:49152 到 65535
- 描述:这些端口号通常被客户端应用程序使用,用于临时连接和通信。它们不受 IANA 管理,可以动态分配。
nmap 被查看的IP地址 nmap 127.0.0.1 # 查看本机暴露的端口 sudo lsof -i :8080 # 将列出所有占用 8080 端口的进程及其详细信息 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 image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406241410095.png?table=block&id=43c64330-ce71-42cd-838e-bb9d0f302679&cache=v2)
然后在本地软件连接,这里使用的是 Xterminal:
![notion image](https://www.notion.so/image/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2FAn-Jhon%2Fimage_bed%2F202406241413631.png?table=block&id=27952666-4787-40b6-80bc-454190fd664b&cache=v2)
2、命令行远程登录其他主机
SSH可以让我们通过SSH命令,远程的登陆到其它的主机上,比如:在node1执行:
ssh root@node2
,将以root用户登录node2(主机名,在使用主机名登录之前需要将主机名与 IP 的映射关系添加到 /etc/hosts 文件中,详见域名解析章节)服务器,输入密码即可成功登陆;或者ssh node2
,将以当前用户直接登陆到node2服务器,前提是对端服务器也要有相同的用户名,如果没有会提示:Permission denied, please try again.
可能会遇到的情况:
- 对方服务器的 SSH 禁止以 root 账户登录
- 在对端服务器(可以用对端服务器的其他账户登录切换到 root 或使用 sudo 操作)上修改 SSH 的配置文件
- 找到下面两项并修改为 yes;如果没有就添加,如果被注释就取消注释
- 保存退出后重启 SSH 服务
- 重新尝试
ssh root@node2
sudo vim /etc/ssh/sshd_config
PermitRootLogin yes PasswordAuthentication yes
sudo systemctl restart sshd
- 登录之后如何退出:
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_rsa
和 id_rsa.pub
2、将公钥分发给对端服务器(也可以分发给自己,自己登录自己)
ssh-copy-id server2 # 不指定用户时,SSH 会默认使用当前系统的当前用户名进行连接 ssh-copy-id user@server2 # 指定用户和服务器(对端可能没有当前系统的当前用户,所以需要指定)
比如三台服务服务器之间想实现互相免密登录,那么就需要分别在三台服务器上生成密钥对,然后分别分发给其他对端。
- 服务器一生成密钥对,将公钥分发给服务器二、服务器三
- 服务器二生成密钥对,将公钥分发给服务器一、服务器三
- 服务器三生成密钥对,将公钥分发给服务器一、服务器二
- 免密登陆
ssh remote_user@remote_host
取消密钥认证:
- 登录目标主机
ssh remote_user@remote_host
- 编辑
authorized_keys
文件
找到并删除包含
user1
用户公钥的那一行,然后保存并退出(在 vim
中按 :wq
保存并退出)。vim ~/.ssh/authorized_keys
- 验证删除结果
退出目标主机,再次尝试使用 SSH 密钥登录
- 删除本地私钥(可选)
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_keys
,ssh-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命令:上传文件
- 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命令的高级用法 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 [选项] [文件或目录] -c:创建新的归档文件。 -x:从归档文件中提取文件。 -v:显示详细信息。 -f:后面跟归档文件名。-f选项必须在所有选项中位置处于最后一个 -z:通过gzip压缩或解压文件。-z选项如果使用的话,一般处于选项位第一个 -C:选择解压的目的地,用于解压模式 -j:通过bzip2压缩或解压文件。 -t:列出归档文件的内容。 -p:保留文件的原始权限。 -r:将文件追加到已经存在的归档文件中。 -u:更新归档文件中的文件。 -W:验证归档文件。 例子: tar -cvf archive.tar directory # 将目录打包为archive.tar文件 tar -xvf archive.tar # 解压archive.tar文件 tar -cvf test.tar 1.txt 2.txt 3.txt # 将1.txt 2.txt 3.txt 压缩到test.tar文件内 tar -xvf test.tar # 将test.tar文件解压 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模式 tar -xvf test.tar -C /home/itheima # 解压test.tar,将文件解压至指定目录(/home/itheima)
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 # 保存并退出