创建用户

# 新建用户
sudo adduser newuser

# 添加到用户组
sudo usermod -aG sudo newuser
# 这里-aG选项表示将用户添加到指定组中。sudo是Ubuntu中默认的超级用户组。

查看系统信息

  • 查看CPU信息:

    • lscpu: 显示CPU架构信息,如型号、核心数、线程数等。
    • tophtop(需要安装): 实时显示CPU使用率及其它系统信息。

    不得不说htop比top好用太多!

  • 查看GPU信息 (如果安装了NVIDIA GPU):

    • nvidia-smi: 显示NVIDIA GPU的状态,包括使用率、温度、显存使用等。
  • 查看内存信息:

    • free -m: 显示内存使用情况,包括总量、使用中、空闲等,单位为MB。
    • vmstat: 显示内存统计信息及系统进程、交换、IO等信息。
  • 查看网络信息:

    • ifconfig(在某些系统中可能需要安装net-tools): 显示网络接口配置信息。
    • ip addr: 显示网络接口的IP地址。
    • netstat(可能需要安装): 显示网络连接、路由表、接口统计等信息。
    • nloadiftop(需要安装): 实时监控网络流量和带宽使用。

关闭桌面

如果您的Ubuntu服务器当前运行着GNOME或任何其他图形界面,并且您想要关闭这个图形界面(也就是说,让服务器运行在纯命令行模式),您可以按照以下步骤操作:

关闭GNOME或图形界面

  1. 停止图形界面服务:

    • 对于使用systemd的系统(如最新版的Ubuntu),您可以使用以下命令停止gdm(GNOME Display Manager)或类似的服务:
      sudo systemctl stop gdm3
      
    • 如果您不确定是哪个显示管理器(比如可能是lightdm, sddm等),可以先检查当前运行的显示管理器:
      systemctl list-units --type=service | grep -E 'gdm|sddm|lightdm|x11'
      
  2. 禁用自动启动:

    • 如果您不想在每次启动时自动进入图形界面,可以禁用对应的服务:
      sudo systemctl disable gdm3
      

再次启用GNOME或图形界面

当您需要再次启用GNOME或其他图形界面时,您可以使用以下命令:

  1. 启动图形界面服务:

    • 使用以下命令启动显示管理器(这里以gdm3为例):
      sudo systemctl start gdm3
      
  2. 启用自动启动:

    • 如果您希望在下次启动时自动进入图形界面,可以重新启用服务:
      sudo systemctl enable gdm3
      

注意事项

  • 停止或禁用图形界面会导致系统仅通过命令行界面可用,确保您熟悉命令行操作。
  • 根据您的具体系统配置和使用的显示管理器,命令可能略有不同。例如,如果您使用的是LightDM,您应该使用lightdm替换命令中的gdm3
  • 如果您在操作过程中遇到任何问题,请确保能够访问物理服务器或远程管理控制台,以便进行故障排除。

压缩和解压

.tar 文件

# 仅打包,并非压缩

tar -xvf FileName.tar         # 解包
tar -cvf FileName.tar DirName # 将DirName和其下所有文件(夹)打包

.gz文件

# .gz
gunzip FileName.gz  # 解压1
gzip -d FileName.gz # 解压2
gzip FileName       # 压缩,只能压缩文件

.tar.gz文件、 .tgz文件

# .tar.gz 和 .tgz
tar -zxvf FileName.tar.gz               # 解压
tar -zcvf FileName.tar.gz DirName       # 将DirName和其下所有文件(夹)压缩
tar -C DesDirName -zxvf FileName.tar.gz # 解压到目标路径

.zip文件

# 感觉.zip占用空间比.tar.gz大
unzip FileName.zip          # 解压
zip FileName.zip DirName    # 将DirName本身压缩
zip -r FileName.zip DirName # 压缩,递归处理,将指定目录下的所有文件和子目录一并压缩

.rar文件

# mac和linux并没有自带rar,需要去下载
rar x FileName.rar      # 解压
rar a FileName.rar DirName # 压缩

对Windows的NTFS硬盘进行写入挂载

执行

sudo ntfsfix /dev/nvme1n1p4

重新挂载硬盘 就可以进行写入操作了。

验证:

mount | grep -i "on /media/sirius/File"

是rw就是可以写入,or是只读。

echo

对于echo 单引号变量,就直接进行标准输出;

对于双引号变量,会对其中的变量进行引用,再标准输出。

# 对于单引号变量,不对其中的变量进行解释,直接标准输出
yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ abc='hello world'
yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ echo $abc
hello world

yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ def='hello $abc'
yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ echo $def
hello $abc

# 对于双引号变量,会对其中的变量进行引用,再标准输出
yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ def="hello $abc"
yoho@yoho-Lenovo-XiaoXinPro-16IHU-2021:~$ echo $def
hello hello world

dpkg

对于包更新

sudo dpkg -i <package_name>.deb

包卸载

sudo dpkg -r package_name

查询特定包的信息

dpkg -l | grep package_name

grep

grep 是一个用于在文本文件中搜索指定模式(字符串)的命令行工具。它的名称来自于 “Global Regular Expression Print” 的缩写,这是它最初的主要功能之一,即在文本中查找匹配正则表达式的行并打印出来。grep 在 Unix 和类 Unix 操作系统中广泛使用。

grep 的基本用法如下:

grep [选项] 模式 [文件]
  • [选项]:用于指定搜索行为的选项,例如 -i(不区分大小写)、-v(反向匹配)、-r(递归搜索目录)、-l(仅显示匹配文件名)等。
  • 模式:要搜索的文本模式或正则表达式。
  • [文件]:要搜索的文件名列表,如果未提供文件名,则 grep 会从标准输入中读取数据。

例如,要在一个文件 example.txt 中查找包含字符串 “apple” 的所有行,你可以使用以下命令:

grep "apple" example.txt

grep 将输出所有包含 “apple” 的行。

以下是一些常见的 grep 选项:

  • -i:忽略大小写。
  • -v反向匹配,只显示不包含模式的行。

在小红书的笔试题中就有用cat和grep输出不包含空行的文本,用到了正则表达式的’^$‘和grep -v

  • -r:递归搜索目录中的文件。
  • -l:仅显示包含模式的文件名,而不显示匹配的行。

grep 是一个非常强大和灵活的文本搜索工具,可以用于各种情况,包括日志分析、数据提取、代码搜索等。它支持正则表达式,因此可以进行高级的模式匹配和搜索操作。

Vim

☆ 命令模式下我们能做什么 ① 移动光标 ② 复制 粘贴 ③ 剪切 粘贴 删除 ④ 撤销与恢复

命令模式

移动光标到首行或末行(!)

移动光标到首行 => gg

移动光标到末行 => G

☆ 翻屏 向上 翻屏,按键:ctrl + b (before) 或 PgUp

向下 翻屏,按键:ctrl + f (after) 或 PgDn

向上翻半屏,按键:ctrl + u (up)

向下翻半屏,按键:ctrl + d (down)

☆ 快速定位光标到指定行(!) 行号 + G,如150G代表快速移动光标到第150行。

复制/粘贴(!)

① 复制当前行(光标所在那一行)

按键:yy

粘贴:在想要粘贴的地方按下p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用P键

② 从当前行开始复制指定的行数,如复制5行,5yy

粘贴:在想要粘贴的地方按下p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用P键

剪切/删除(!)

在VIM编辑器中,剪切与删除都是dd

如果剪切了文件,但是没有使用p进行粘贴,就是删除操作

如果剪切了文件,然后使用p进行粘贴,这就是剪切操作

① 剪切/删除当前光标所在行

按键:dd (删除之后下一行上移)

粘贴:p

注意:dd 严格意义上说是剪切命令,但是如果剪切了不粘贴就是删除的效果。

② 剪切/删除多行(从当前光标所在行开始计算)

按键:数字dd

粘贴:p

特殊用法:

③ 剪切/删除光标所在的当前行(光标所在位置)之后的内容,但是删除之后下一行不上移

按键:D (删除之后当前行会变成空白行)

撤销/恢复(!)

撤销:u(undo)

恢复:ctrl + r 恢复(取消)之前的撤销操作【重做,redo】

末行模式

☆ 末行模式下我们能做什么

文件保存、退出、查找与替换、显示行号、paste模式等等

保存/退出(!)

:w => 代表对当前文件进行保存操作,但是其保存完成后,并没有退出这个文件

:q => 代表退出当前正在编辑的文件,但是一定要注意,文件必须先保存,然后才能退出

:wq => 代表文件先保存后退出(保存并退出)

如果一个文件在编辑时没有名字,则可以使用:wq 文件名称,代表把当前正在编辑的文件保存到指定的名称中,然后退出

:q! => 代表强制退出但是文件未保存(不建议使用)

查找/搜索(!)

切换到命令模式,然后输入斜杠/(也是进入末行模式的方式之一)

进入到末行模式后,输入要查找或搜索的关键词,然后回车

如果在一个文件中,存在多个满足条件的结果。在搜索结果中切换上/下一个结果:N/n (大写N代表上一个结果,小写n代表next)

如果需要取消高亮,则需要在末行模式中输入:noh【no highlight】

文件内容的替换(!)

第一步:首先要进入末行模式(在命令模式下输入冒号:)

第二步:根据需求替换内容

① 只替换光标所在这一行的第一个满足条件的结果(只能替换1次)

:s/要替换的关键词/替换后的关键词 + 回车

案例:把hello rhel中的 rhel替换为 rhel8

切换光标到hello rhel这一行

:s/rhel/rhel8

② 替换光标所在这一行中的所有满足条件的结果(替换多次,只能替换一行)

:s/要替换的关键词/替换后的关键词/g g=global全局替换

案例:把hello rhel中的所有rhel都替换为rhel8

切换光标到hello rhel这一行

:s/rhel/rhel8/g

③ 针对整个文档中的所有行进行替换,只替换每一行中满足条件的第一个结果

:%s/要替换的关键词/替换后的关键词

案例:把每一行中的第一个hello关键词都替换为hi

:%s/hello/hi

④ 针对整个文档中的所有关键词进行替换(只要满足条件就进行替换操作)

:%s/要替换的关键词/替换后的关键词/g

案例:替换整个文档中的hello关键词为hi

:%s/hello/hi/g

显示行号

基本语法:

:set nu
nu = number】,行号

可视化模式

1)如何进入到可视化模式

在命令模式中,直接按ctrl + v(可视块)或V(可视行)或v(可视),然后按下↑ ↓ ← →方向键来选中需要复制的区块,按下y 键进行复制(不要按下yy),最后按下p 键粘贴

退出可视模式按下Esc

2)可视化模式复制操作

第一步:在命令模式下,直接按小v,进入可视化模式

第二步:使用方向键↑ ↓ ← →选择要复制的内容,然后按y键

第三步:移动光标,停在需要粘贴的位置,按p键进行粘贴操作

3)为配置文件添加#多行注释(!)

第一步:按Esc退出到命令模式,按gg切换到第1行

第二步:然后按Ctrl+v进入到可视化区块模式(列模式)

第三步:在行首使用上下键选择需要注释的多行

第四步:按下键盘(大写)“I”键,进入插入模式(Shift + i)

第五步:输入#号注释符

第六步:输入完成后,连续按两次Esc即可完成添加多行注释的过程

4)为配置文件去除#多行注释(!)

第一步:按Esc退出到命令模式,按gg切换到第1行

第二步:然后按Ctrl+v进入可视化区块模式(列模式)

第三步:使用键盘上的方向键的上下选中需要移除的#号注释

第四步:直接按Delete键即可完成删除注释的操作

strace

通过strace命令可以看见某条指令发起了哪些系统调用。

strace -o hello.log ./hello
strace -o hello.py.log python3 ./hello.py

strace是一个Linux命令,用于跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

strace命令的语法如下:

strace [选项] 命令 [参数]

选项说明:

  • -a:跟踪所有系统调用,包括不常用的系统调用。
  • -c:统计每一系统调用的所执行的时间,次数和出错的次数等。
  • -d:输出strace关于标准错误的调试信息。
  • -e:指定要跟踪的系统调用。
  • -f:跟踪由fork调用所产生的子进程。
  • -o:将输出保存到指定文件中。
  • -p:跟踪指定PID的进程。
  • -s:指定输出的行宽。
  • -t:输出时间戳。
  • -tt:输出毫秒级别的时间戳。
  • -T:输出每个系统调用所花费的时间。
  • -u:跟踪用户空间的地址空间。
  • -v:输出更详细的信息。

示例:

  • 跟踪ls命令的系统调用:
strace ls
  • 跟踪ls命令的系统调用,包括不常用的系统调用:
strace -a ls
  • 跟踪ls命令的系统调用,统计每个系统调用的所执行的时间、次数和出错的次数等:
strace -c ls
  • 跟踪ls命令的系统调用,输出到指定文件中:
strace -o trace.log ls
  • 跟踪指定PID为100的进程的系统调用:
strace -p 100
  • 跟踪用户空间的地址空间:
strace -u

strace是一个非常强大的工具,可以用于诊断、调试和教学。通过使用strace,可以了解进程是如何与内核进行交互的,从而帮助解决各种问题。

man

man指令是Linux和类Unix操作系统中内置的命令,用于显示命令、实用程序和函数的参考页面。它是一个非常有用的工具,可用于学习和使用这些系统上可用的大量工具。

要使用man,只需键入man后跟您要了解的命令、实用程序或函数的名称。例如,要了解ls命令,您将键入man ls

每个命令的man页面分为几个部分,包括:

  • NAME: 命令的名称和简短描述。
  • SYNOPSIS: 使用命令的语法。
  • DESCRIPTION: 命令的详细描述,包括其选项和参数。
  • EXAMPLES: 如何使用命令的示例。
  • FILES: 命令使用的文件列表。
  • SEE ALSO: 其他相关命令列表。

sar

sar -P all 1

sar是Linux系统上用于收集系统性能数据的命令。它可以收集CPU、内存、磁盘、网络等方面的数据。sar命令的输出可以用于监控系统性能、诊断系统问题、进行性能分析等。

sar命令的语法如下:

sar [选项] [间隔] [持续时间]

选项说明:

  • -a: 收集所有可用的数据。
  • -b: 收集块设备的数据。
  • -c: 收集CPU的数据。
  • -d: 收集磁盘设备的数据。
  • -e: 收集内存的数据。
  • -f: 从指定文件中读取数据。
  • -i: 收集网络设备的数据。
  • -n: 指定收集的数据项。
  • -r: 收集实时数据。
  • -u: 收集用户空间的数据。
  • -v: 输出更详细的信息。
  • -P: 可以加上ALL ,列出各个CPU上的情况

间隔说明:

  • 间隔以秒为单位,默认为1秒。

持续时间说明:

  • 持续时间以秒为单位,默认为无限长。

示例:

  • 收集所有可用的数据,间隔为1秒,持续时间为10秒:
sar -a 1 10
  • 收集CPU的数据,间隔为5秒,持续时间为1分钟:
sar -c 5 60
  • 收集内存的数据,间隔为1分钟,持续时间为1小时:
sar -e 1 3600
  • 收集网络设备的数据,间隔为1小时,持续时间为24小时:
sar -i 1 86400

sar命令的输出格式:

sar命令的输出格式如下:

时间戳 数据项 值

时间戳以秒为单位,数据项表示收集的数据类型,值表示数据的值。

sar命令的常用用法:

  • 监控系统性能:使用sar命令可以监控系统的CPU、内存、磁盘、网络等方面的性能。
  • 诊断系统问题:使用sar命令可以帮助诊断系统性能问题。
  • 进行性能分析:使用sar命令可以进行性能分析,以了解系统的瓶颈。

以下是一些sar命令的常用用法:

  • 监控CPU使用率:
sar -c
  • 监控内存使用率:
sar -e
  • 监控磁盘读写速度:
sar -d
  • 监控网络流量:
sar -i
  • 监控系统负载:
sar -u

readelf

readelf -h /bin/sleep

image-20231006090246530

readelf命令是Linux系统上用于显示ELF文件信息的命令。它可以显示ELF文件的文件头、程序头、节头、符号表、重定位表等信息。readelf命令可以用于调试程序、学习ELF文件格式等。

readelf命令的语法如下:

readelf [选项] 文件

选项说明:

  • -a: 显示所有信息。
  • -h: 显示文件头信息。
  • -l: 显示程序头信息。
  • -S: 显示节头信息。
  • -s: 显示符号表信息。
  • -r: 显示重定位表信息。
  • -d: 显示动态链接信息。
  • -e: 显示所有头信息。
  • -x: 显示只读数据段。
  • -z: 显示字符串表。

示例:

  • 显示可执行文件ls的所有信息:
readelf -a ls
  • 显示可执行文件ls的文件头信息:
readelf -h ls
  • 显示可执行文件ls的程序头信息:
readelf -l ls
  • 显示可执行文件ls的节头信息:
readelf -S ls
  • 显示可执行文件ls的符号表信息:
readelf -s ls
  • 显示可执行文件ls的重定位表信息:
readelf -r ls
  • 显示可执行文件ls的动态链接信息:
readelf -d ls

readelf命令的输出格式:

readelf命令的输出格式取决于指定的选项。

readelf命令的常用用法:

  • 调试程序:使用readelf命令可以查看程序的符号表和重定位表信息,这对于调试程序很有帮助。
  • 学习ELF文件格式:使用readelf命令可以查看ELF文件的所有信息,这对于学习ELF文件格式很有帮助。

以下是一些readelf命令的常用用法:

  • 查看可执行文件的所有信息:
readelf -a 文件
  • 查看可执行文件的文件头信息:
readelf -h 文件
  • 查看可执行文件的程序头信息:
readelf -l 文件
  • 查看可执行文件的节头信息:
readelf -S 文件
  • 查看可执行文件的符号表信息:
readelf -s 文件
  • 查看可执行文件的重定位表信息:
readelf -r 文件
  • 查看可执行文件的动态链接信息:
readelf -d 文件

ps

ps命令是Linux系统上用于显示当前系统进程信息的命令。它可以显示进程的PID、进程名称、进程状态、用户、CPU使用率、内存使用率等信息。ps命令可以用于监控系统进程、诊断系统问题、进行性能分析等。

ps命令的语法如下:

ps [选项]

选项说明:

  • -a: 显示所有进程。
  • -u: 显示用户进程。
  • -x: 显示所有进程,包括守护进程。
  • -l: 显示详细信息。
  • -e: 此参数的效果和指定"A"参数相同。
  • -f: 显示完整的命令行。
  • -o: 指定显示的列。
  • -pid: 指定进程的PID。
  • -ppid: 指定进程的父进程的PID。
  • -sid: 指定进程的会话ID。
  • -tty: 指定进程的终端。

示例:

  • 显示所有进程:
ps -a
  • 显示用户进程:
ps -u
  • 显示所有进程,包括守护进程:
ps -x
  • 显示详细信息:
ps -l
  • 显示完整的命令行:
ps -f
  • 指定显示的列:
ps -o pid,ppid,comm,state,pcpu,mem
  • 指定进程的PID:
ps -p 1234
  • 指定进程的父进程的PID:
ps -ppid 1234
  • 指定进程的会话ID:
ps -sid 1234
  • 指定进程的终端:
ps -tty /dev/tty1

ps命令的输出格式:

ps命令的输出格式取决于指定的选项。

ps命令的常用用法:

  • 监控系统进程:使用ps命令可以监控系统进程的状态,以了解系统的运行情况。
  • 诊断系统问题:使用ps命令可以帮助诊断系统问题,例如进程卡死、内存泄漏等。
  • 进行性能分析:使用ps命令可以进行性能分析,以了解系统的瓶颈。

以下是一些ps命令的常用用法:

  • 查看所有进程:
ps -a
  • 查看用户进程:
ps -u
  • 查看所有进程,包括守护进程:
ps -x
  • 查看详细信息:
ps -l
  • 查看完整的命令行:
ps -f
  • 查看指定进程的信息:
ps -p 1234
  • 查看指定进程的父进程的信息:
ps -ppid 1234
  • 查看指定进程的会话ID:
ps -sid 1234
  • 查看指定进程的终端:
ps -tty /dev/tty1

taskset

taskset命令是Linux系统上用于设置进程亲和力的命令。亲和力是指进程运行在哪些CPU上。taskset命令可以用于提高进程的性能或稳定性。

taskset命令的语法如下:

taskset [选项] 进程ID [CPU列表]

选项说明:

  • -c: 指定CPU列表。
# 查看逻辑cpu个数
grep -c processor /proc/cpuinfo
  • -p: 指定进程ID。
  • -a: 指定所有进程。

示例:

  • 将进程ID为1234的进程绑定到CPU 0:
taskset -c 0 1234
  • 将所有进程绑定到CPU 0:
taskset -c 0 -a
  • 将进程ID为1234的进程绑定到CPU 0 和 1:
taskset -c 0,1 1234

taskset命令的输出格式:

taskset命令没有输出格式。

taskset命令的常用用法:

  • 提高进程的性能:将进程绑定到特定的CPU可以提高进程的性能,因为进程不需要在多个CPU之间切换。
  • 提高进程的稳定性:将进程绑定到特定的CPU可以提高进程的稳定性,因为进程不会与其他进程竞争CPU资源。

以下是一些taskset命令的常用用法:

  • 将计算密集型进程绑定到特定的CPU:
taskset -c 0,1,2,3 ./my_computation_intensive_program
  • 将IO密集型进程绑定到特定的CPU:
taskset -c 4,5,6,7 ./my_io_intensive_program
  • 将需要实时响应的进程绑定到特定的CPU:
taskset -c 0 ./my_real_time_program

网络命令

ipconfig, ifconfig, ip

ipconfig是windows中的命令,linux上是ifconfig,但ip命令比ifconfig更强大,旨在取代ifconfig命令。

ping

ping命令是DOS命令,一般用于检测网络是否通畅以及网络连接速度,结果只越大,说明速度越慢。它使用网络层的ICMP协议。

ping [参数选项] [主机名或IP地址]

linux

参数含义
-c设置完成要求回应的次数
-i指定收发信息的间隔时间
-s设置数据包的大小
-w在设定的秒后退出

windows

参数含义
-t连续对IP地址执行ping命令,直到用户以<control+c>键强制中断
-l指定ping命令的数据长度
-n执行特定次数的ping命令

netstat

netstat 用来查看当前操作系统的网络连接状态、路由表、接口统计等信息,来自于 net-tools 工具包,ss 是 netstat 的升级版。

参数含义
-a显示主机中所有活动的网络连接信息 (包括监听、非监听状态的服务端口)
-n以数字的形式显示相关的主机地址、端口等信息
-p显示与网络连接相关联的进程号、进程名称信息 (该选项需要 root 权限)
-l显示处于监听 (Listen) 状态的网络连接及端口信息
-t查看 TCP (Transmission Control Protocol,传输控制协议) 相关的信息
-u显示 UDP (User Datagram Protocol,用户数据报协议) 协议相关的信息
-r显示路由表信息
-i显示网卡列表
-g显示组播组的关系
-s显示网络统计信息

常用命令选项:

netstat [-anpt] [-anpu] [-anptu] [-anpltu] [-ntlp]

ss

ss 命令来自于 iproute 包,是 netstat 的升级版本。netstat 通过遍历 /proc 来获取 socket 信息,ss 使用 netlink 与内核 tcp_diag 模块通信获取 socket 信息。 格式:

ss [OPTION]... [FILTER]
参数含义
-a显示主机中所有活动的网络连接信息 (包括监听、非监听状态的服务端口)
-n以数字的形式显示相关的主机地址、端口等信息
-p显示与网络连接相关联的进程号、进程名称信息 (该选项需要 root 权限)
-l显示处于监听 (Listen) 状态的网络连接及端口信息
-t查看 TCP (Transmission Control Protocol,传输控制协议) 相关的信息
-u显示 UDP (User Datagram Protocol,用户数据报协议) 协议相关的信息
-xunix sock 相关
-w裸套接字相关
-e扩展的信息
-m内存用量
-o计时器信息
#显示本地打开的所有端口
ss -l
#列出当前 socket 详细信息
ss -s
#显示每个进程具体打开的 socket
ss -pl
#显示所有 tcp socket
ss -at
#显示所有的 udp socket
ss -au
#显示所有已建立的 ssh 连接
ss -o state established '( dport = :ssh or sport = :ssh )'
#显示所有已建立的HTTP连接
ss -o state established '( dport = :http or sport = :http )'

traceroute

traceroute 命令可以用于测试从当前主机到目的主机之间经过了哪些网络结点,并显示各个中间结点的连接状态(响应时间)。对于无法响应的结点,连接状态将显示为 “*”,预设数据包大小是 40Bytes,用户可另行设置。如果没有 traceroute 命令可执行 yum -y install traceroute 安装。

格式:

traceroute [参数] [主机|IP]

参数:

参数含义
-d使用 Socket 层级的排错功能
-f设置第一个检测数据包的存活数值 TTL 的大小
-F设置勿离断位
-g设置来源路由网关,最多可设置 8 个
-i使用指定的网络界面送出数据包
-lI 使用 ICMP 回应取代 UDP 资料信息
-m设置检测数据包的最大存活数值 TTL 的大小
-n直接使用 IP 地址而非主机名称
-p设置 UDP 传输协议的通信端口
-r忽略普通的 Routing Table,直接将数据包送到远端主机上
-s设置本地主机送出数据包的 IP 地址
-t设置检测数据包的 TOS 数值
-v详细显示指令的执行过程
-w设置等待远端主机回报的时间
-x开启或关闭数据包的正确性检验
[root@c7-1 ~]#traceroute 20.0.0.25
traceroute to 20.0.0.25 (20.0.0.25), 30 hops max, 60 byte packets
 1  20.0.0.25 (20.0.0.25)  0.942 ms  0.782 ms  0.647 ms
#可以看到这两台机器之间没有经过路由,是直连或连着交换机的状态

[root@c7-1 ~]#traceroute www.baidu.com
traceroute to www.baidu.com (112.80.248.75), 30 hops max, 60 byte packets
 1  gateway (20.0.0.2)  5.900 ms  5.817 ms  5.758 ms
 2  * * *
 3  * * *
 4  * * *
......

nslookup

nslookup是一个用于查询域名系统(DNS)以获取有关域名、IP地址和其他DNS记录信息的网络管理命令行工具。

nslookup 域名

示例:

[root@c7-1 ~]#nslookup www.baidu.com
Server:		20.0.0.2
Address:	20.0.0.2#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 112.80.248.75
Name:	www.a.shifen.com
Address: 112.80.248.76

[root@c7-1 ~]#nslookup www.google.com
Server:		20.0.0.2
Address:	20.0.0.2#53

Non-authoritative answer:
Name:	www.google.com
Address: 104.244.46.208
Name:	www.google.com
Address: 2001::1f0d:5211

[root@c7-1 ~]#cat /etc/resolv.conf	#域名解析配置文件

# Generated by NetworkManager

# 一行一个 DNS,最多配置三个 DNS,优先使用第一个 DNS 服务器

nameserver 20.0.0.2

[root@c7-1 ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
112.80.248.75 www.baidu.com
#/etc/hosts 文件中记录着一份主机名与 IP 地址的映射关系表,一般用来保存经常需要访问的主机的信息。当访问一个未知的域名时,先查找该文件中是否有相应的映射记录,如果找不到再去向 DNS 服务器查询。

ARP

ARP(Address Resolution Protocol,地址解析协议)缓冲区是在计算机或网络设备上维护的一个表格,用于存储 IP 地址与MAC 地址之间的映射关系。ARP 协议用于将目标主机的 IP 地址解析成其对应的 MAC 地址,从而实现数据在网络上的正确传输。

在一个局域网中,当计算机 A 需要与计算机 B 进行通信时,A 需要知道 B 的 MAC 地址才能正确发送数据包。这时,A 发送一个 ARP 请求广播,询问网络中是否有拥有特定 IP 地址的设备,并且请求对应设备的 MAC 地址。设备 B 收到请求后,会回复一个 ARP 响应,包含其自己的 MAC 地址。一旦 A 收到了 B 的 MAC 地址,它就可以将数据包正确地发送给 B。

ARP 缓冲区(或称为 ARP 表格、ARP 缓存)在这个过程中起到了重要作用。当设备 A 解析了设备 B 的 IP 地址并获取到 B 的 MAC 地址后,它将这个映射关系存储在 ARP 缓冲区中。这样,以后 A 需要与 B 通信时,就无需再次发送 ARP 请求,而是直接从 ARP 缓冲区中获取 B 的 MAC 地址,从而加速通信过程。

arp 命令用于操作主机的 arp 缓冲区,可以用来显示 arp 缓冲区中的所有条目、删除指定的条目或者添加静态的 ip 地址与 MAC 地址对应关系。

格式:

arp [-vn]  [<HW>] [-i <if>] [-a] [<hostname>]             <-Display ARP cache
arp [-v]          [-i <if>] -d  <host> [pub]               <-Delete ARP entry
arp [-vnD] [<HW>] [-i <if>] -f  [<filename>]            <-Add entry from file
arp [-v]   [<HW>] [-i <if>] -s  <host> <hwaddr> [temp]            <-Add entry
arp [-v]   [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub          <-''-

参数:

-a<主机>: 显示 arp 缓冲区的所有条目 -H<地址类型>: 指定 arp 指令使用的地址类型 -d<主机>: 从 arp 缓冲区中删除指定主机的 arp 条目 -D: 使用指定接口的硬件地址 -e: 以 Linux 的显示风格显示 arp 缓冲区中的条目 -i<接口>: 指定要操作 arp 缓冲区的网络接口 -s<主机><MAC地址>:设置指定的主机的 IP 地址与 MAC 地址的静态映射 -n: 以数字方式显示 arp 缓冲区中的条目 -v: 显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息 -f<文件>: 设置主机的 IP 地址与 MAC 地址的静态映射

示例:

#显示 ARP 表
arp -n	或	ip neigh
#ARP 静态绑定 MAC 地址可以防止 ARP 欺骗
arp -s 10.0.0.6 00:0c:29:32:80:38
#删除 arp 缓存条目
arp -d 10.0.0.6
#指定回复的 MAC 地址
arp -i eth0 -Ds 10.0.0.2 eth1 pub

FTP

FTP(File Transfer Protocol)是一种用于在网络上传输文件的标准协议。你可以使用命令行界面或者专门的 FTP 客户端来测试和使用 FTP 命令。下面是一些基本的 FTP 命令以及如何进行测试:

  1. 连接到 FTP 服务器: 使用以下命令连接到 FTP 服务器,其中 <server_address> 是服务器的地址(域名或 IP 地址):

    ftp <server_address>
    

    输入该命令后,你将会被要求输入用户名和密码来进行身份验证。

  2. 浏览远程目录: 连接成功后,你可以使用 ls 命令列出远程服务器上的文件和目录。

  3. 切换远程目录: 使用 cd 命令来切换远程服务器上的目录:

    cd <directory_name>
    
  4. 下载文件: 使用 get 命令来下载远程服务器上的文件到本地:

    get <remote_file_name>
    
  5. 上传文件: 使用 put 命令来上传本地文件到远程服务器:

    put <local_file_name>
    
  6. 退出 FTP 会话: 使用 quitbye 命令来退出 FTP 会话:

    quit
    

请注意,上述命令只是 FTP 命令的一小部分,而实际的 FTP 客户端可能提供更多功能和选项。如果你在终端或命令提示符中直接使用上述命令,确保你已经连接到一个可用的 FTP 服务器,并且你已经登录并有足够的权限进行操作。

lsof

列出所有打开了的网络文件

[root@ecs-centos-7 ~]# lsof -i
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ntpd       567   ntp   18u  IPv4  12657      0t0  UDP localhost:ntp
ntpd       567   ntp   22u  IPv6  16095      0t0  UDP ecs-centos-7.4-64bit-20200212:ntp 
dhclient   651  root    6u  IPv4  14594      0t0  UDP *:bootpc 
master     960  root   13u  IPv4  15791      0t0  TCP localhost:smtp (LISTEN)
master     960  root   14u  IPv6  15792      0t0  TCP localhost:smtp (LISTEN)
mysqld    1053 mysql   13u  IPv6  15147      0t0  TCP *:mysql (LISTEN)
sshd      1348  root    3u  IPv4  16698      0t0  TCP *:ssh (LISTEN)

列出所有 IPV4/6 网络文件

列出所有已经打开了的 ipv4 网络文件

[root@ecs-centos-7 ~]# lsof -i 4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ntpd       567  ntp   16u  IPv4  12651      0t0  UDP *:ntp 
ntpd       567  ntp   18u  IPv4  12657      0t0  UDP localhost:ntp 
ntpd       567  ntp   21u  IPv4  16094      0t0  UDP ecs-centos-7.4-64bit-20200212:ntp 
dhclient   651 root    6u  IPv4  14594      0t0  UDP *:bootpc 
master     960 root   13u  IPv4  15791      0t0  TCP localhost:smtp (LISTEN)
sshd      1348 root    3u  IPv4  16698      0t0  TCP *:ssh (LISTEN)

所有已经打开了的 ipv6 网络文件

[root@ecs-centos-7 ~]# lsof -i 6
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ntpd     567   ntp   17u  IPv6  12652      0t0  UDP *:ntp 
ntpd     567   ntp   19u  IPv6  12658      0t0  UDP localhost:ntp 
ntpd     567   ntp   22u  IPv6  16095      0t0  UDP ecs-centos-7.4-64bit-20200212:ntp 
master   960  root   14u  IPv6  15792      0t0  TCP localhost:smtp (LISTEN)
mysqld  1053 mysql   13u  IPv6  15147      0t0  TCP *:mysql (LISTEN)
sshd    1348  root    4u  IPv6  16700      0t0  TCP *:ssh (LISTEN)

列出在指定端口上打开的文件

使用 lsof -i:端口号 可以获得所有在指定端口号上打开的文件

[root@ecs-centos-7 ~]# lsof -i:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     1348 root    3u  IPv4  16698      0t0  TCP *:ssh (LISTEN)
sshd     1348 root    4u  IPv6  16700      0t0  TCP *:ssh (LISTEN)
sshd    27741 root    3u  IPv4 458958      0t0  TCP ecs-centos-7.4-64bit-20200212:ssh->113.118.121.220:42395 (ESTABLISHED)
sshd    27819 root    3u  IPv4 459250      0t0  TCP ecs-centos-7.4-64bit-20200212:ssh->113.118.121.220:19807 (ESTABLISHED)
sshd    27895 root    3u  IPv4 459828      0t0  TCP

上面例子列出了所有在22号端口上打开的文件

在服务器开发中,经常会部署一个网关或者代理程序,用来和客户端通讯,网关或者代理程序需要开放一个固定的端口供客户端连接用

如果客户端连接不上网关或者代理程序,我们可以用上述命令检查网关或代理程序的端口是否开启,来排除因为端口关闭了导致连接不上网关的情况

列出使用了指定协议(TCP/UDP) 的文件

使用 lsof -i TCP/UDP 列出使用了TCP 或 UDP 协议的文件

[root@cghost8 /home/cgyx]# lsof -i TCP | more
COMMAND      PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd        1704   root    3u  IPv4   13593      0t0  TCP *:ssh (LISTEN)
sshd        1704   root    4u  IPv6   13595      0t0  TCP *:ssh (LISTEN)
redis-serer   1725   root    4u  IPv4   19773      0t0  TCP localhost:6380 (LISTEN)
nc          2067   cgyx    4u  IPv4   39167      0t0  TCP *:60600 (LISTEN)
mysqld      3020  mysql    4u  IPv6 5514608      0t0  TCP 192.168.70.10:mysql->192.168.70.10:37084 (ESTABLISHED)

使用 lsof -i TCP:3306 列出使用了TCP 协议并且端口为3306的文件

[root@cghost8 /home/cgyx]# lsof -i TCP:3306
COMMAND      PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mysqld      3020 mysql    4u  IPv6 5514608      0t0  TCP 192.168.70.10:mysql->192.168.70.10:37084 (ESTABLISHED)

使用 lsof -i TCP:1-1024 列出使用了TCP协议并且端口范围为 1 到 1024 的文件

[root@cghost8 /home/cgyx]# lsof -i TCP:1-1024
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd     1704   root    3u  IPv4   13593      0t0  TCP *:ssh (LISTEN)
sshd     1704   root    4u  IPv6   13595      0t0  TCP *:ssh (LISTEN)
cupsd    1709   root   12u  IPv6   39148      0t0  TCP localhost:ipp (LISTEN)
cupsd    1709   root   13u  IPv4   39149      0t0  TCP localhost:ipp (LISTEN)
smbd     1824   root   35u  IPv6   17658      0t0  TCP *:microsoft-ds (LISTEN)
smbd     1824   root   36u  IPv6   17659      0t0  TCP *:netbios-ssn (LISTEN)
smbd     1824   root   37u  IPv4   17660      0t0  TCP *:microsoft-ds (LISTEN)
smbd     1824   root   38u  IPv4   17661      0t0  TCP *:netbios-ssn (LISTEN)

列出指定进程ID打开的文件

进程ID是操作系统进程的唯一标识,以下命令列出了进程ID为 1053 相关的文件, 从结果中可以知道这个进程ID对应的进程是MySQL

[root@ecs-centos-7 ~]# lsof -p 1053
COMMAND  PID  USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
mysqld  1053 mysql  cwd    DIR              253,1      4096 1055765 /var/lib/mysql
mysqld  1053 mysql  rtd    DIR              253,1      4096       2 /
mysqld  1053 mysql  txt    REG              253,1 251841448  534935 /usr/sbin/mysqld
mysqld  1053 mysql  mem    REG              253,1    209512  659436 /usr/lib64/mysql/plugin/validate_password.so
mysqld  1053 mysql    1w   REG              253,1    206658  924771 /var/log/mysqld.log
mysqld  1053 mysql    2w   REG              253,1    206658  924771 /var/log/mysqld.log

上述命令中,-p 选项后面可以指定多个进程ID,每个进程ID之间用逗号分隔,如果想排除掉某个进程打开的文件,可以在该进程ID前面加上 ^符号

lsof -p 1,2,3,^4

上述命令会列出进程1,进程2,进程3打开的所有文件,同时忽略进程4打开的文件

杀死指定用户的所有进程

前面介绍了列出指定用户所有打开的文件,我们可以组合 kill 命令一起使用,实现杀死指定用户的所有进程的功能,具体的命令如下

kill -9 `lsof -t -u tt`

上述命令中,lsof -u tt 是列出tt用户所有打开的文件,加上 -t 选项之后表示结果只列出PID列,也就是进程ID列,其他列都忽略,前面的 kill -9 表示强制结束指定的进程ID