Linux 常用命令详解教程
本教程旨在提供一份全面的 Linux 常用命令列表,涵盖文件管理、系统信息获取、高级系统监控、文本处理、用户与权限管理、网络配置与诊断以及端口和防火墙管理等多个方面。每个命令都将包含其用途、常用语法、重要选项及示例,力求内容完整且实用。
一、文件和目录管理 (File and Directory Management)
文件和目录管理是 Linux 系统操作的基础。以下命令能帮助用户有效地在文件系统中进行导航、创建、删除、复制、移动和查找文件及目录。
1.1 基本导航与列表 (Basic Navigation and Listing)
ls
(列出目录内容 List directory contents)- 用途: 显示目录中的文件和子目录。
- 语法:
ls [选项][目录名]
- 常用选项:
-l
: 以长格式显示详细信息,包括权限、所有者、大小、修改日期等。-a
: 显示所有文件,包括隐藏文件(以.
开头的文件)。-h
: 以人类可读的格式显示文件大小 (例如 1K, 234M, 2G)。-A
: 显示除.
和..
之外的所有文件,包括隐藏文件。-S
: 按文件大小降序排序。-t
: 按修改时间排序,最新修改的在前。-R
: 递归列出所有子目录的内容。
- 示例:
ls -l /home/user
: 以长格式列出/home/user
目录的内容。ls -ah
: 以人类可读格式显示当前目录所有文件(包括隐藏文件)。
cd
(更改目录 Change directory)- 用途: 切换当前工作目录。
- 语法:
cd [目录路径]
- 特殊用法:
cd..
: 切换到上一级目录。cd ~
或cd
: 切换到当前用户的主目录。cd -
: 切换到上一个工作目录。
- 示例:
cd /var/log
: 切换到/var/log
目录。cd../documents
: 从当前目录切换到上一级的documents
子目录。
pwd
(打印工作目录 Print working directory)- 用途: 显示当前所在的完整目录路径。
- 语法:
pwd
- 示例:
pwd
1.2 文件与目录操作 (File and Directory Operations)
mkdir
(创建目录 Make directory)- 用途: 创建一个新的目录。
- 语法:
mkdir [选项] 目录名
- 常用选项:
-p
: 递归创建目录,如果父目录不存在则一并创建。
- 示例:
mkdir new_project
: 在当前目录下创建名为new_project
的目录。mkdir -p project/docs/images
: 递归创建project
目录及其子目录docs
和images
。
rmdir
(删除空目录 Remove empty directory)- 用途: 删除一个空的目录。
- 语法:
rmdir [选项] 目录名
- 常用选项:
-p
: 递归删除目录,当子目录被删除后其父目录变为空时,也一同被删除。--ignore-fail-on-non-empty
: 删除非空目录时忽略错误(通常不推荐,应使用rm -r
)。
- 示例:
rmdir old_folder
(如果old_folder
为空,则删除它)。
cp
(复制文件和目录 Copy files and directories)- 用途: 复制文件或目录。
- 语法:
cp [选项] 源文件/目录 目标文件/目录
- 常用选项:
-r
或-R
: 递归复制目录及其内容。-i
: 覆盖前提示。-v
: 显示详细的复制过程。
- 示例:
cp file1.txt file1_backup.txt
: 将file1.txt
复制为file1_backup.txt
。cp -r project_a/ /backup/project_a_backup
: 将project_a
目录及其所有内容复制到/backup/project_a_backup
。
mv
(移动或重命名文件和目录 Move or rename files and directories)- 用途: 移动文件或目录,或者在同一目录下对文件或目录进行重命名。
- 语法:
mv [选项] 源文件/目录 目标文件/目录
- 常用选项:
-i
: 覆盖前提示。-n
: 不覆盖已存在的目标文件。-u
: 仅当源文件比目标文件新,或目标文件不存在时,才执行移动。
- 示例:
mv report.docx documents/
: 将report.docx
移动到documents
目录。mv old_name.txt new_name.txt
: 将old_name.txt
重命名为new_name.txt
。mv temp_folder /opt/archive/
: 将temp_folder
目录移动到/opt/archive/
。
rm
(删除文件或目录 Remove files or directories)- 用途: 删除文件或目录。这是一个非常强大的命令,使用时需格外小心。
- 语法:
rm [选项] 文件/目录...
- 常用选项:
-r
或-R
: 递归删除目录及其所有内容。-f
: 强制删除,不进行提示,忽略不存在的文件和参数。-i
: 删除前逐一提示确认。-v
: 显示详细的删除过程。
- 警告:
rm -rf
命令会无提示地递归删除指定目录下的所有内容,一旦执行无法轻易恢复,务必谨慎使用。 - 示例:
rm unwanted_file.txt
: 删除unwanted_file.txt
文件。rm -rf old_project/
: 强制递归删除old_project
目录及其所有内容。
touch
(创建空文件或更新文件时间戳 Create empty file or update file timestamps)- 用途: 创建一个空文件,或者更新已有文件的时间戳(访问时间和修改时间)。
- 语法:
touch [选项] 文件名...
- 示例:
touch newfile.log
: 创建一个名为newfile.log
的空文件。touch existing_file.txt
: 更新existing_file.txt
的时间戳。
ln
(创建链接 Create links)- 用途: 在文件之间创建链接,分为硬链接和符号链接(软链接)。
- 语法:
ln [选项] 源文件 链接名
- 常用选项:
-s
: 创建符号链接(软链接)。如果不使用此选项,则创建硬链接。-v
: 显示详细过程。
- 硬链接与符号链接的区别:
- 硬链接:与原文件共享相同的inode号和数据块,删除原文件不影响硬链接的访问,除非所有硬链接和原文件都被删除。不能对目录创建硬链接,不能跨文件系统创建硬链接。
- 符号链接:一个指向原文件路径的特殊文件,类似于快捷方式。删除原文件会导致符号链接失效。可以对目录创建符号链接,也可以跨文件系统创建。
- 示例:
ln target.txt hard_link.txt
: 为target.txt
创建一个名为hard_link.txt
的硬链接。ln -s /opt/app/config.conf /etc/app_config.conf
: 为/opt/app/config.conf
创建一个名为/etc/app_config.conf
的符号链接。
1.3 文件查找与类型判断 (File Searching and Type Identification)
find
(在目录层次结构中查找文件 Search for files in a directory hierarchy)- 用途: 根据指定的条件在目录树中搜索文件和目录。
- 语法:
find [路径...][表达式选项]
- 常用表达式选项:
-name "模式"
: 按文件名模式查找 (支持通配符, 如*.txt
)。-type 类型
: 按文件类型查找 (如f
普通文件,d
目录,l
符号链接)。-user 用户名
: 按文件所有者查找。-group 组名
: 按文件所属组查找。-size [+|-]大小[cwbkMG]
: 按文件大小查找 (如+10M
大于10MB,-1k
小于1KB)。-mtime [-|+]天数
: 按文件修改时间查找 (如-7
7天内修改,+30
30天前修改)。-exec 命令 {} \;
: 对找到的每个文件执行指定的命令。-maxdepth 层数
: 限制搜索深度。
- 示例:
find /home/user -name "*.log" -mtime -7
: 在/home/user
目录及其子目录下查找最近7天内修改过的所有.log
文件。find. -type f -size +100M -exec rm {} \;
: 查找当前目录下大于100MB的普通文件并删除它们(删除前会提示)。
file
(判断文件类型 Determine file type)- 用途: 识别给定文件的类型。
- 语法:
file [选项] 文件名...
- 常用选项:
-b
或--brief
: 简要模式,不输出文件名。-i
: 输出MIME类型字符串。-z
: 尝试查看压缩文件内部。
- 示例:
file document.pdf
: 显示document.pdf
的文件类型。file -bi image.jpg
: 以MIME类型格式简要显示image.jpg
的类型。
二、系统信息与管理 (System Information and Management)
了解系统的运行状态、硬件信息和基本配置是系统管理的重要组成部分。
2.1 系统基本信息 (Basic System Information)
uname
(打印系统信息 Print system information)- 用途: 显示当前系统的内核名称、版本、主机名等信息。
- 语法:
uname [选项]
- 常用选项:
-a
: 显示所有可用信息。-r
: 显示内核发行版本。-s
: 显示内核名称。-n
: 显示网络节点主机名。-m
: 显示机器硬件名称。
- 示例:
uname -a
hostname
(显示或设置系统的主机名 Show or set the system’s host name)- 用途: 查看或临时设置系统的主机名。
- 语法:
hostname [选项][新主机名]
- 常用选项:
-s
或--short
: 显示短主机名 (第一个点之前的部分)。-f
或--fqdn
或--long
: 显示完全限定域名 (FQDN)。-i
或--ip-address
: 显示主机的IP地址 (如果可解析)。-I
或--all-ip-addresses
: 显示主机所有网络接口的IP地址。-d
或--domain
: 显示DNS域名。
- 示例:
hostname
: 显示当前主机名。sudo hostname new-server-name
: 临时将主机名设置为new-server-name
(永久更改需修改配置文件,如/etc/hostname
)。
date
(打印或设置系统日期和时间 Print or set the system date and time)- 用途: 显示或设置系统的当前日期和时间。
- 语法:
date [选项][+格式]YY][.ss]]
- 常用选项与格式:
+%Y-%m-%d %H:%M:%S
: 以年-月-日 时:分:秒
格式显示。--set="字符串"
: 设置日期和时间。
- 示例:
date
: 显示当前日期和时间。date '+%A, %B %d, %Y'
: 以 “星期几, 月份 日期, 年份” 格式显示。sudo date --set="2024-07-30 10:30:00"
: 将日期和时间设置为2024年7月30日10点30分。
uptime
(告诉系统已运行多长时间 Tell how long the system has been running)- 用途: 显示系统自上次启动以来运行了多长时间、当前用户数量以及系统平均负载。
- 语法:
uptime [选项]
- 常用选项:
-p
: 以易读格式显示运行时间。
- 示例:
uptime
whoami
(打印有效用户ID Print effective user ID)- 用途: 显示当前正在操作的用户名。
- 语法:
whoami
- 示例:
whoami
2.2 磁盘与内存使用 (Disk and Memory Usage)
df
(报告文件系统磁盘空间使用情况 Report file system disk space usage)- 用途: 显示文件系统的总空间、已用空间、可用空间和挂载点。
- 语法:
df [选项][文件/目录]
- 常用选项:
-h
: 以人类可读的格式显示 (例如 GB, MB)。-T
: 显示文件系统类型。-i
: 显示inode信息而非块使用情况。
- 示例:
df -h
du
(估算文件空间使用情况 Estimate file space usage)- 用途: 显示指定文件或目录占用的磁盘空间大小。
- 语法:
du [选项][文件/目录]
- 常用选项:
-h
: 以人类可读的格式显示。-s
: 仅显示总计大小。-c
: 显示总计大小,并在最后显示所有参数的总和。--max-depth=N
: 只显示指定深度的目录大小。
- 示例:
du -sh /var/log
: 显示/var/log
目录的总大小。du -h --max-depth=1 /home
: 显示/home
目录下第一级子目录和文件的大小。
free
(显示系统中的可用和已用物理内存和交换内存量 Display amount of free and used memory in the system)- 用途: 查看系统内存和交换空间的使用情况。
- 语法:
free [选项]
- 常用选项:
-h
: 以人类可读的格式显示。-m
: 以MB为单位显示。-g
: 以GB为单位显示。-s N
: 每N秒刷新一次。
- 示例:
free -h
2.3 系统控制 (System Control)
shutdown
(关闭系统 Schedule a system shutdown)- 用途: 安全地关闭或重启Linux系统,可以指定延迟时间或特定时间,并向登录用户发送警告信息。
- 语法:
sudo shutdown [选项] 时间 [警告信息]
- 常用选项:
-h
: 关闭系统后停止电源 (halt)。-P
: 关闭系统后切断电源 (power off),通常是-h
的默认行为。-r
: 重启系统。-c
: 取消先前安排的关机。-k
: 发送警告信息,但不实际关机。
- 时间参数:
now
: 立刻执行。+分钟数
: 指定多少分钟后执行 (例如+10
)。hh:mm
: 指定绝对时间执行 (例如23:00
)。
- 示例:
sudo shutdown -h now
: 立刻关闭系统。sudo shutdown -r +15 "系统将在15分钟后重启以进行维护"
: 15分钟后重启系统并发送消息。sudo shutdown -c
: 取消已计划的关机或重启。
reboot
(重启系统 Reboot the system)- 用途: 重启Linux系统。通常是
shutdown -r now
的一个快捷方式。 - 语法:
sudo reboot [选项]
- 常用选项:
-f
: 强制重启,不调用shutdown
。不推荐常规使用。-p
: 关闭电源(如果系统支持)。
- 示例:
sudo reboot
- 用途: 重启Linux系统。通常是
history
(显示或操作历史列表 Display or manipulate the history list)- 用途: 显示用户在当前shell会话中执行过的命令历史。
- 语法:
history [选项][数量]
- 常用选项:
-c
: 清空历史列表。-d 偏移量
: 删除指定偏移量的历史条目。
- 特殊用法:
!!
: 执行上一条命令。!编号
: 执行历史列表中指定编号的命令。!字符串
: 执行最近一条以指定字符串开头的命令。Ctrl+R
: 反向搜索历史命令。
- 示例:
history
: 显示所有命令历史。history 20
: 显示最近20条命令历史。!ls
: 执行最近一条以ls
开头的命令。
man
(系统参考手册的分页程序 an interface to the on-line reference manuals)- 用途: 显示命令、函数或配置文件的帮助手册页。
- 语法:
man [选项][章节] 命令名/主题
- 常用选项:
-k 关键字
: 根据关键字搜索手册页标题和描述 (等同于apropos
)。
- 导航: 在
man
页面中,通常使用与less
相同的导航键(如空格翻页,q
退出,/
搜索)。 - 示例:
man ls
: 显示ls
命令的手册页。man 5 passwd
: 显示/etc/passwd
文件格式的手册页 (第5章节通常是文件格式)。
clear
(清屏 Clear the terminal screen)- 用途: 清除终端屏幕上的所有内容,将提示符移到屏幕顶部。
- 语法:
clear
- 示例:
clear
(快捷键通常是Ctrl+L
alias
(定义或显示别名 Define or display aliases)- 用途: 为长命令或常用命令序列创建简短的别名。
- 语法:
alias
: 显示所有已定义的别名。alias 名称='命令'
: 定义一个别名。unalias 名称
: 删除一个别名。
- 持久化: 临时定义的别名只在当前shell会话有效。要使其永久生效,需将其添加到shell的配置文件中,如
~/.bashrc
或~/.bash_aliases
。 - 示例:
alias ll='ls -alF'
: 定义ll
作为ls -alF
的别名。alias update='sudo apt update && sudo apt upgrade -y'
: 定义update
用于更新系统。
三、高级系统监控 (Advanced System Monitoring)
除了基本的系统信息查看,Linux还提供了一系列高级工具,用于深入监控系统性能的各个方面,如CPU、内存、I/O和网络活动。
3.1 进程管理与监控 (Process Management and Monitoring)
ps
(报告当前进程的快照 Report a snapshot of the current processes)- 用途: 显示当前系统中正在运行的进程信息。
- 语法:
ps [选项]
- 常用选项:
aux
: 显示所有用户的进程(System V风格,无-
)。-ef
: 显示所有进程,以完整格式(BSD风格,有-
)。-u 用户名
: 显示指定用户的进程。--forest
: 以ASCII字符显示进程树。--sort=关键字
: 按指定关键字排序 (例如%cpu
,%mem
)。
- 示例:
ps aux
: 显示系统中所有正在运行的进程的详细信息。ps -ef | grep sshd
: 查找名为sshd
的进程。ps aux --sort=-%mem | head -n 5
: 显示内存使用率最高的5个进程。
top
(显示Linux进程 Display Linux processes)- 用途: 实时动态地显示系统中各个进程的资源占用状况,如CPU使用率、内存使用率等,默认按CPU使用率排序。
- 语法:
top [选项]
- 交互命令 (在
top
运行时):P
: 按CPU使用百分比排序。M
: 按内存使用百分比排序。N
: 按进程ID (PID) 排序。k
: 杀死一个进程 (需要输入PID和信号,默认为15 SIGTERM)。r
: 重新设置一个进程的nice值 (优先级)。h
或?
: 显示帮助。q
: 退出top
。d
: 改变刷新延迟时间。
- 常用选项:
-d 秒数
: 设置屏幕刷新间隔。-n 次数
: 刷新指定次数后退出。-b
: 批处理模式,适合将输出重定向到文件。-o +列名
: 按指定列排序 (如+%MEM
按内存排序)。
- 示例:
top
(启动实时监控)
htop
(交互式进程查看器 Interactive process viewer)- 用途:
top
的增强版,提供更友好的交互界面、颜色显示、鼠标支持、水平/垂直滚动以及完整的命令行显示。 - 语法:
htop [选项]
- 常用选项:
-d 延迟
: 设置更新之间的延迟(单位为十分之一秒,例如-d 10
表示1秒)。-u 用户名
: 只显示指定用户的进程。-s 列名
: 按指定列排序 (例如-s PERCENT_MEM
)。-t
: 以树状视图显示进程层级关系。
- 交互命令 (在
htop
运行时):F4
(或\
): 过滤进程。F5
(或t
): 切换树状视图。F6
(或<
>
): 选择排序字段。F9
(或k
): 杀死选中的进程。F10
(或q
): 退出htop
。
- 示例:
htop
- 用途:
kill
(向进程发送信号 Send a signal to a process)- 用途: 向指定的进程发送信号,常用于终止进程。
- 语法:
kill [选项] PID...
- 常用信号:
SIGTERM
(15): 默认信号,请求进程正常终止。SIGKILL
(9): 强制终止进程,进程无法捕获此信号。SIGHUP
(1): 挂起进程,常用于让守护进程重新读取配置文件。SIGINT
(2): 中断进程,等同于Ctrl+C
。
- 常用选项:
-l
: 列出所有可用的信号名称。-信号编号或名称
: 指定要发送的信号 (例如-9
或-SIGKILL
)。
- 示例:
kill 12345
: 向PID为12345的进程发送SIGTERM
信号。kill -9 54321
: 强制杀死PID为54321的进程。
pkill
(根据名称和其他属性查找或发信号给进程 Signal processes based on name and other attributes)- 用途: 根据进程名或其他属性向进程发送信号,通常用于终止进程。
- 语法:
pkill [选项] 模式
- 常用选项:
-信号
: 指定要发送的信号 (例如-9
)。-u 用户名
: 匹配指定用户的进程。-f
: 匹配完整命令行参数。
- 示例:
pkill firefox
: 终止所有名为firefox
的进程。pkill -9 -f "stale_script.py"
: 强制杀死完整命令行包含 “stale_script.py” 的进程。
jobs
(列出活动作业 List active jobs)- 用途: 显示在当前shell会话中放到后台运行或被挂起的作业。
- 语法:
jobs [选项]
- 常用选项:
-l
: 同时显示作业的进程ID (PID)。-p
: 只显示作业的进程ID。-r
: 只显示正在运行的作业。-s
: 只显示已停止(挂起)的作业。
- 示例:
jobs -l
bg
(将作业放到后台运行 Resume suspended jobs in the background)- 用途: 将一个已挂起(stopped)的作业转到后台继续运行。
- 语法:
bg
51 (作业ID可通过jobs
命令查看,通常以%
开头,如%1
) - 示例:
bg %1
(将作业号为1的挂起作业转到后台运行)
fg
(将作业放到前台运行 Resume jobs in the foreground)- 用途: 将一个在后台运行或已挂起的作业转到前台继续运行。
- 语法:
fg
- 示例:
fg %2
(将作业号为2的作业转到前台运行)
3.2 系统性能分析 (System Performance Analysis)
vmstat
(报告虚拟内存统计信息 Report virtual memory statistics)用途: 显示关于进程、内存、分页、块I/O、陷阱和CPU活动的即时信息。
语法:
vmstat [选项][延迟 [次数]]
常用选项:
-a
: 显示活动/非活动内存。-s
: 显示各种事件计数器和内存统计信息的表格。-d
: 显示磁盘统计信息。-p 分区
: 显示指定分区的详细统计信息。-t
: 在输出中添加时间戳。延迟 次数
: 每隔“延迟”秒输出一次报告,共输出“次数”次。
输出字段解释:
procs
:r
(等待运行的进程数),b
(不可中断睡眠的进程数)。memory
:swpd
(使用的虚拟内存),free
(空闲物理内存),buff
(用作缓冲的内存),cache
(用作缓存的内存)。swap
:si
(从磁盘换入的内存量/秒),so
(换出到磁盘的内存量/秒)。io
:bi
(从块设备接收到的块数/秒),bo
(发送到块设备的块数/秒)。system
:in
(每秒中断次数),cs
(每秒上下文切换次数)。cpu
:us
(用户CPU时间百分比),sy
(系统CPU时间百分比),id
(空闲CPU时间百分比),wa
(等待I/O的CPU时间百分比),st
(从虚拟机窃取的CPU时间百分比)。
示例:
vmstat 2 5
: 每2秒显示一次系统状态,共显示5次。vmstat -s
: 显示内存和事件计数器摘要。
iostat
(报告CPU统计信息和输入/输出统计信息 Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions)用途: 监控系统输入/输出设备和CPU的活动情况,用于识别磁盘或CPU瓶颈。
语法:
iostat [选项][间隔 [次数]]
常用选项:
-c
: 仅显示CPU利用率报告。-d
: 仅显示设备利用率报告。-x
: 显示扩展的I/O统计信息。-k
: 以KB为单位显示统计信息。-m
: 以MB为单位显示统计信息。-t
: 打印每个报告的时间。-p [设备 | ALL]
: 显示块设备及其所有分区的统计信息。间隔 次数
: 每隔“间隔”秒输出一次报告,共输出“次数”次。
输出字段解释 (部分):
%user
: 用户级别CPU利用率。%system
: 系统级别CPU利用率。%iowait
: CPU等待I/O操作完成的时间百分比。高%iowait
通常表示I/O瓶颈。%idle
: CPU空闲时间百分比。tps
: 每秒传输次数。Blk_read/s
(或kB_read/s
,MB_read/s
): 每秒读取的块/KB/MB数。Blk_wrtn/s
(或kB_wrtn/s
,MB_wrtn/s
): 每秒写入的块/KB/MB数。%util
: 存储设备繁忙的时间百分比。
示例:
iostat -dx 2 5
: 每2秒显示一次扩展的磁盘I/O统计信息,共显示5次。iostat -c 1
: 每1秒显示一次CPU利用率。
sar
(收集、报告或保存系统活动信息 Collect, report, or save system activity information)- 用途: System Activity Reporter,一个强大的系统性能分析工具,可以收集和报告CPU、内存、I/O、网络等多种系统活动的统计数据,支持历史数据分析。
- 安装:
sar
通常包含在sysstat
包中,可能需要手动安装:sudo apt-get install sysstat
或sudo yum install sysstat
。 - 语法:
sar [选项][间隔 [次数]]
- 常用选项:
-u
: 显示CPU利用率。-r
: 显示内存利用率。-b
: 显示I/O和传输速率统计。-d
: 显示块设备(磁盘)活动。-n DEV | EDEV |...
: 显示网络统计信息 (DEV
为网络接口,EDEV
为网络错误)。-q
: 显示运行队列长度和平均负载。-P ALL | CPU号
: 报告每个处理器的统计信息。-o 文件名
: 将数据保存到二进制文件。-f 文件名
: 从指定文件读取数据。间隔 次数
: 每隔“间隔”秒输出一次报告,共输出“次数”次。
- 示例:
sar -u 2 5
: 每2秒显示一次CPU利用率,共显示5次。sar -r 1 3
: 每1秒显示一次内存利用率,共显示3次。sar -n DEV 1
: 每1秒显示一次网络接口统计。sar -f /var/log/sa/saDD
(其中DD为日期): 查看历史系统活动报告。
lsof
(列出打开的文件 List open files)用途: 显示系统中所有进程打开的文件列表。在Linux中,“一切皆文件”,因此
lsof
可以显示打开的普通文件、目录、网络套接字、设备等。语法:
lsof [选项][文件名]
常用选项:
-i [条件]
: 显示符合条件的网络连接。例如:-i TCP:22
: 显示监听或连接到TCP端口22的进程。-i :80
: 显示监听或连接到端口80的进程。-i @主机名/IP
: 显示与指定主机相关的连接。
-u 用户名
: 显示指定用户打开的文件。-p PID
: 显示指定进程ID打开的文件。-c 命令名
: 显示由指定命令名开头的进程打开的文件。+D 目录
: 递归显示目录下被打开的文件。-t
: 只输出进程ID (PID),常用于与其他命令结合。
示例:
sudo lsof -i :80
: 查看哪些进程正在使用80端口。sudo lsof -u apache
: 查看用户apache
打开了哪些文件。sudo lsof /var/log/syslog
: 查看哪个进程打开了/var/log/syslog
文件。sudo lsof -p 1234
: 查看PID为1234的进程打开了哪些文件。
四、文本处理 (Text Processing)
Linux 提供了大量强大的文本处理工具,用于查看、搜索、编辑和分析文本文件。
4.1 文件内容查看 (Viewing File Contents)
cat
(连接文件并打印到标准输出 Concatenate files and print on the standard output)- 用途: 显示一个或多个文件的全部内容,也可用于创建或合并文件。
- 语法:
cat [选项][文件...]
- 常用选项:
-n
: 显示行号。-E
: 在每行末尾显示$
符号。
- 示例:
cat myfile.txt
: 显示myfile.txt
的内容。cat file1.txt file2.txt > combined.txt
: 合并file1.txt
和file2.txt
的内容到combined.txt
。cat -n script.sh
: 显示script.sh
的内容并带行号。
less
(与more
功能相反,但功能更强大 Opposite of more, but with more features)- 用途: 分页查看文件内容,允许向前和向后滚动,支持搜索。比
cat
更适合查看大文件。 - 语法:
less [选项] 文件名
- 常用选项:
-N
: 显示行号。-S
: 禁止长行自动换行 (内容超出屏幕宽度时可水平滚动)。-i
: 搜索时忽略大小写。-F
: 如果内容能在一屏内显示完则自动退出。-X
: 退出less
后不清屏。
- 交互命令 (在
less
运行时):- 空格键 或
f
: 向下翻一页。 b
: 向上翻一页。j
或 向下箭头: 向下滚动一行。k
或 向上箭头: 向上滚动一行。G
: 跳转到文件末尾。g
: 跳转到文件开头。/模式
: 向下搜索指定模式。?模式
: 向上搜索指定模式。n
: 重复上一次搜索 (同方向)。N
: 重复上一次搜索 (反方向)。q
: 退出less
。h
: 显示帮助。
- 空格键 或
- 示例:
less large_log_file.log
: 查看large_log_file.log
。dmesg | less -N
: 分页显示内核环形缓冲区消息并带行号。
- 用途: 分页查看文件内容,允许向前和向后滚动,支持搜索。比
head
(输出文件的第一部分 Output the first part of files)- 用途: 显示文件的开头部分,默认显示前10行。
- 语法:
head [选项][文件...]
- 常用选项:
-n 数字
或-数字
: 指定显示的行数。-c 字节数
: 指定显示的字节数。
- 示例:
head access.log
: 显示access.log
的前10行。head -n 20 error.log
: 显示error.log
的前20行。
tail
(输出文件的最后一部分 Output the last part of files)- 用途: 显示文件的末尾部分,默认显示最后10行。常用于监控实时更新的日志文件。
- 语法:
tail [选项][文件...]
- 常用选项:
-n 数字
或-数字
: 指定显示的行数。-c 字节数
: 指定显示的字节数。-f
: 持续显示文件末尾追加的内容,直到按Ctrl+C
终止。非常适用于实时日志监控。-n +数字
: 从第几行开始显示到文件末尾。
- 示例:
tail messages.log
: 显示messages.log
的最后10行。tail -n 50 system.log
: 显示system.log
的最后50行。tail -f /var/log/syslog
: 实时监控/var/log/syslog
文件的新增内容。
4.2 文本搜索与模式匹配 (Text Searching and Pattern Matching)
grep
(打印匹配模式的行 Print lines matching a pattern)
- 用途: 在文件中搜索包含指定模式(字符串或正则表达式)的行,并打印这些行。
- 语法:
grep [选项] 模式 [文件...]
- 常用选项:
-i
: 忽略模式和输入数据的大小写。-v
: 反向匹配,打印不包含模式的行。-r
或-R
: 递归搜索目录下的所有文件。-n
: 显示匹配行的行号。-c
: 只打印匹配行的计数。-l
: 只打印包含匹配模式的文件名。-w
: 整词匹配。-E
: 使用扩展正则表达式 (ERE)。-A 数字
: 打印匹配行及其后N行。-B 数字
: 打印匹配行及其前N行。-C 数字
: 打印匹配行及其前后各N行。-e 模式
: 指定多个搜索模式。-o
: 只显示匹配模式的部分。
- 示例:
grep "error" application.log
: 在application.log
中搜索包含 “error” 的行。grep -i "warning" /var/log/messages
: 在/var/log/messages
中不区分大小写地搜索 “warning”。grep -r "config_value" /etc/myapp/
: 递归搜索/etc/myapp/
目录中包含 “config_value” 的文件。ps aux | grep -v "grep"
: 显示进程列表,但不显示grep
命令本身。
4.3 文本编辑与转换 (Text Editing and Transformation)
sed
(流编辑器,用于对输入流执行基本文本转换 Stream editor for performing basic text transformations on an input stream)用途: 一个强大的流编辑器,用于对文件或输入流进行非交互式的文本替换、删除、插入、转换等操作。
语法:
sed [选项] '脚本' [输入文件...]
常用选项:
-i[后缀]
: 直接修改文件内容 (如果提供后缀,则创建备份)。-n
: 禁止自动打印模式空间的内容,通常与p
命令配合使用。-e 脚本
: 添加要执行的脚本。允许多个-e
来执行多个命令。-f 脚本文件
: 从脚本文件中读取sed
命令。-r
或-E
: 使用扩展正则表达式。
常用命令 (在脚本中):
s/旧模式/新模式/[标志]
: 替换 (substitute)。标志可以是:g
: 全局替换行内所有匹配。N
: 替换第N个匹配项。I
或i
: 忽略大小写。
d
: 删除匹配的行。p
: 打印模式空间的内容 (通常与-n
选项一起使用)。a\文本
: 在匹配行之后追加文本。i\文本
: 在匹配行之前插入文本。c\文本
: 用文本替换匹配的行。
地址 (指定命令作用的行): 可以是行号、正则表达式、或行号范围 (如
1,5
表示第1到5行;/pattern/
表示匹配模式的行)。示例:
sed 's/apple/orange/g' fruit.txt
: 将fruit.txt
中所有的 “apple” 替换为 “orange” 并输出到标准输出。sed -i 's/old_domain.com/new_domain.com/g' config.file
: 直接修改config.file
,将其中的 “old_domain.com” 全部替换为 “new_domain.com”。sed -n '/error/p' server.log
: 只打印server.log
中包含 “error” 的行。sed '1,5d' data.txt
: 删除data.txt
文件的前5行。sed '/^#/d' config.conf
: 删除config.conf
中所有以#
开头的注释行。
awk
(模式扫描和处理语言 Pattern scanning and processing language)- 用途: 一种强大的文本处理编程语言,非常适合处理结构化数据(如按列分隔的数据)、生成报告和执行复杂的文本操作。
- 语法:
awk '[选项] '模式 {动作}' [输入文件...]'
- 核心概念:
- 记录 (Record):
awk
逐行处理输入,每行被视为一个记录,默认记录分隔符是换行符。 - 字段 (Field): 每个记录被进一步分解为字段,默认字段分隔符是空格或制表符。字段可以用
$1
,$2
,…$NF
(最后一个字段) 表示,$0
表示整个记录。 - 模式 (Pattern): 在执行动作之前检查的条件。可以是正则表达式、比较表达式等。如果省略模式,则对每一行都执行动作。
- 动作 (Action): 由花括号
{}
包围的一系列命令。 BEGIN
块: 在处理任何输入行之前执行一次。END
块: 在处理完所有输入行之后执行一次。
- 记录 (Record):
- 常用选项:
-F 分隔符
: 指定输入字段分隔符。-v 变量=值
: 定义awk
脚本中可以使用的变量。-f 程序文件
: 从文件中读取awk
程序。
- 内置变量:
FS
: 输入字段分隔符 (同-F
选项)。OFS
: 输出字段分隔符 (默认为空格)。RS
: 输入记录分隔符 (默认为换行符)。ORS
: 输出记录分隔符 (默认为换行符)。NR
: 当前已处理的记录数(行号)。NF
: 当前记录中的字段数。
awk
不仅仅是一个简单的文本过滤器,它实际上是一种编程语言,拥有变量、条件语句(如if
)、循环(如for
,while
)等编程结构 。这使其能够处理比grep
或sed
更复杂的文本处理任务,例如对数据进行计算、格式化输出复杂的报告等。- 示例:
awk -F':' '{print $1, $3}' /etc/passwd
: 打印/etc/passwd
文件中以冒号分隔的第一和第三个字段(用户名和UID)。awk '/error/ {count++; print "Error on line " NR ": " $0} END {print "Total errors found: " count}' system.log
: 搜索system.log
中包含 “error” 的行,打印行号和内容,并在最后打印错误总数。ls -l | awk '{if ($5 > 1024) print $9, "is larger than 1KB"}'
: 列出当前目录中大于1KB的文件。
tr
(转换或删除字符 Translate or delete characters)- 用途: 用于字符级别的转换(如大小写转换)或删除。
- 语法:
tr [选项] SET1
- 常用选项:
-d
: 删除SET1
中指定的所有字符。-s
: 压缩SET1
(或SET2
如果提供了SET2
) 中连续重复的字符为一个。-c
: 使用SET1
的补集。
- 字符集 (SET): 可以是单个字符、字符范围 (如
a-z
,0-9
) 或特殊字符类 (如[:lower:]
,[:upper:]
,[:digit:]
,[:space:]
)。 - 示例:
echo "Hello World" | tr 'A-Z' 'a-z'
: 将标准输入中的大写字母转换为小写,输出 “hello world”。cat myfile.txt | tr -d '\r'
: 删除myfile.txt
中的回车符 (Windows换行符转Unix换行符)。echo "This has too many spaces" | tr -s ' '
: 将多个连续空格压缩为单个空格,输出 “This has too many spaces”。
cut
(从每行中删除文本区域 Remove sections from each line of files)- 用途: 从文件的每一行中提取(剪切)指定的列或字符。
- 语法:
cut [选项][文件...]
- 常用选项:
-d 分隔符
: 指定字段分隔符 (默认是制表符 TAB)。-f 字段列表
: 指定要提取的字段编号,可以用逗号分隔多个字段 (如1,3
) 或用连字符表示范围 (如2-5
)。-c 字符列表
: 指定要提取的字符位置,格式同-f
。-b 字节列表
: 指定要提取的字节位置,格式同-f
。--complement
: 提取指定字段/字符/字节之外的部分。--output-delimiter=字符串
: 指定输出字段的分隔符。
- 示例:
cut -d':' -f1,7 /etc/passwd
: 提取/etc/passwd
文件中以冒号分隔的第一和第七个字段(用户名和shell)。date | cut -c12-19
: 显示当前时间的 时:分:秒 部分。who | cut -c1-8
: 提取who
命令输出中每行的前8个字符(通常是用户名)。
4.4 文本比较与统计 (Text Comparison and Statistics)
sort
(对文本文件的行进行排序 Sort lines of text files)- 用途: 对文件内容按行进行排序,支持多种排序规则。
- 语法:
sort [选项][文件...]
- 常用选项:
-r
: 反向排序(降序)。-n
: 按数值大小进行排序。-k 字段号[,结束字段号][选项]
: 按指定的字段进行排序。字段号从1开始。可以附加排序选项,如n
(数值),r
(反向)。-t 分隔符
: 指定字段分隔符。-u
: 输出唯一的行(去除重复行,等同于sort file | uniq
)。-f
: 忽略大小写进行排序。-M
: 按月份名称排序 (Jan, Feb,…)。-h
: 人类可读数字排序 (例如 2K, 1G)。-o 输出文件
: 将排序结果写入指定文件,而不是标准输出。可以用于原地排序,例如sort -o file.txt file.txt
。
- 示例:
sort names.txt
: 按字母顺序对names.txt
的行进行排序。sort -rn data.log | head -n 5
: 对data.log
中的数字进行反向(从大到小)排序,并显示前5行。sort -t':' -k3n /etc/passwd
: 以冒号为分隔符,按第三个字段(UID)的数值大小对/etc/passwd
文件进行排序。
uniq
(报告或省略重复行 Report or omit repeated lines)- 用途: 从已排序的输入中删除或报告重复的相邻行。因此,
uniq
通常与sort
命令配合使用。 - 语法:
uniq [选项][输入文件 [输出文件]]
- 常用选项:
-c
: 在每行前输出该行重复出现的次数。-d
: 仅显示重复出现的行(每组重复行只显示一次)。-D
: 显示所有重复的行(而不是每组只显示一次)。-u
: 仅显示不重复的行。-i
: 比较时忽略大小写。-f N
或--skip-fields=N
: 跳过比较每行的前N个字段。-s N
或--skip-chars=N
: 跳过比较每行的前N个字符。
- 示例:
sort access.log | uniq -c
: 统计access.log
中每种唯一请求的次数。sort data.txt | uniq -d
: 显示data.txt
中所有重复的行。
- 用途: 从已排序的输入中删除或报告重复的相邻行。因此,
wc
(打印换行符、字和字节计数 Print newline, word, and byte counts for each file)- 用途: 统计指定文件或标准输入的行数、单词数、字符数或字节数。
- 语法:
wc [选项][文件...]
- 常用选项:
-l
: 只统计行数。-w
: 只统计单词数。-c
: 只统计字节数。-m
: 只统计字符数 (考虑多字节字符)。-L
: 打印最长行的长度。
- 示例:
wc report.txt
: 显示report.txt
的行数、单词数和字节数。ls -1 | wc -l
: 统计当前目录下的文件和目录数量。grep "error" logfile | wc -l
: 统计logfile
中包含 “error” 的行数。
diff
(逐行比较文件 Compare files line by line)- 用途: 比较两个文件的内容,并显示它们之间的差异。常用于比较代码文件、配置文件等。
- 语法:
diff [选项] 文件1 文件2
- 常用选项:
-u
或-U 数字
: 以统一格式 (unified format) 输出差异,通常更易读,并被patch
命令使用。-c
: 以上下文格式 (context format) 输出差异。-i
: 比较时忽略大小写。-w
: 忽略所有空格导致的差异。-B
: 忽略因空行导致的差异。-r
: 递归比较目录。如果比较的是目录,diff
会比较两个目录中同名的文件。-q
或--brief
: 仅报告文件是否不同,不显示具体差异。-s
: 当文件相同时报告。
- 输出格式解释:
- 默认格式:
<
表示第一个文件中的行,>
表示第二个文件中的行,行号和操作符(a
添加,d
删除,c
更改)指示如何从文件1转换到文件2。 - 统一格式 (
-u
): 以--- file1
和+++ file2
开头,差异部分用-
(来自文件1) 和+
(来自文件2) 标记。
- 默认格式:
- 示例:
diff config_v1.conf config_v2.conf
: 比较两个配置文件的差异。diff -u old_script.sh new_script.sh > script.patch
: 以统一格式生成补丁文件。diff -r project_v1/ project_v2/
: 递归比较两个项目目录。
五、用户、用户组与权限管理 (User, Group, and Permission Management)
管理用户账户、用户组以及文件和目录的访问权限是 Linux 系统安全与管理的核心。
5.1 用户信息查看 (Viewing User Information)
who
(显示当前已登录的用户 Show who is logged on)- 用途: 显示当前登录到系统的用户信息,包括用户名、终端、登录时间、来源IP等。
- 语法:
who [选项]
- 常用选项:
-a
或--all
: 显示所有信息,包括空闲时间、进程ID等。-b
或--boot
: 显示上次系统启动时间。-H
或--heading
: 显示列标题。-u
或--users
: 列出已登录用户,并显示空闲时间和PID。-q
或--count
: 只显示登录用户名和数量。am i
(或am I
): 显示运行who
命令的当前用户信息。
- 示例:
who
: 显示当前登录用户。who -H
: 显示当前登录用户并带列标题。who am i
: 显示当前终端会话的用户信息。
id
(打印真实和有效的用户和组ID Print real and effective user and group IDs)- 用途: 显示指定用户(默认为当前用户)的UID(用户ID)、GID(组ID)以及所属的用户组信息。
- 语法:
id [选项][用户名]
- 常用选项:
-u
: 只显示有效用户ID (UID)。-g
: 只显示有效组ID (GID)。-G
: 显示所有组ID。-n
: 与-u
,-g
,-G
配合使用,显示名称而非数字ID。-r
: 与-u
,-g
,-G
配合使用,显示真实ID而非有效ID。
- 示例:
id
: 显示当前用户的ID信息。id john
: 显示用户john
的ID信息。id -Gn jane
: 显示用户jane
所属的所有组的名称。
5.2 用户切换与提权 (Switching Users and Elevating Privileges)
su
(切换用户或成为超级用户 Switch user or become superuser)- 用途: 允许用户在当前终端会话中切换到另一个用户账户,如果未指定用户名,则默认切换到超级用户 (root)。
- 语法:
su [选项][用户名]
- 常用选项:
-
或-l
或--login
: 模拟一次完整的登录过程,加载目标用户的环境变量、主目录和shell配置。这是推荐的切换用户方式,以避免环境混乱。-c "命令"
: 以目标用户身份执行单个命令后退出。-s shell路径
: 指定切换后使用的shell。-p
或-m
或--preserve-environment
: 保留当前用户的环境变量。
- 示例:
su - john
: 切换到用户john
,并加载其完整的登录环境。su -
: 切换到root
用户,并加载其完整的登录环境 (需要输入root密码)。su -c "ls /root" someuser
: 以someuser
的身份执行ls /root
命令。
sudo
(以其他用户身份执行命令,通常是root Execute a command as another user, typically root)- 用途: 允许授权用户以超级用户 (root) 或其他指定用户的身份执行命令,而无需知道目标用户的密码(通常需要输入当前用户的密码进行验证)。这是比直接使用
root
账户更安全的权限提升方式。 - 语法:
sudo [选项] 命令
- 常用选项:
-u 用户名
: 以指定用户的身份执行命令。-i
: 模拟一次root
用户的登录shell,加载root
的环境。-s
: 执行由SHELL
环境变量指定的shell,通常是root
的shell。-l
: 列出当前用户可以通过sudo
执行的命令以及禁止执行的命令。-v
: 延长sudo
的密码凭证时效,而不执行命令。-k
: 使当前的sudo
密码凭证失效,下次使用sudo
时需要重新输入密码。-b
: 在后台运行命令。
- 配置文件:
sudo
的权限配置存储在/etc/sudoers
文件中,应使用visudo
命令进行编辑,以确保语法正确并防止配置错误导致系统无法使用sudo
。 - 示例:
sudo apt update
: 以root
权限更新软件包列表。sudo -u www-data crontab -l
: 以www-data
用户身份列出其cron
作业。sudo -i
: 切换到root
用户的交互式shell。
- 用途: 允许授权用户以超级用户 (root) 或其他指定用户的身份执行命令,而无需知道目标用户的密码(通常需要输入当前用户的密码进行验证)。这是比直接使用
5.3 用户账户管理 (User Account Management)
useradd
(创建新用户 Create a new user or update default new user information)- 用途: 用于在Linux系统中添加新的用户账户。
- 语法:
useradd [选项] 用户名
- 常用选项:
-m
: 创建用户的主目录(如果不存在)。-d 家目录路径
: 指定用户的主目录路径。-s shell路径
: 指定用户的默认登录shell (例如/bin/bash
,/sbin/nologin
)。-g 初始组名或GID
: 指定用户的主组。-G 附加组列表
: 指定用户所属的附加组(逗号分隔)。-c "注释"
: 为用户账户添加注释信息(例如全名)。-e YYYY-MM-DD
: 设置账户的过期日期。
- 注意:
useradd
是一个底层工具,而adduser
是一个更用户友好的脚本,通常在Debian/Ubuntu系统中使用,它会进行更多交互式设置。 - 示例:
sudo useradd -m -s /bin/bash -c "John Doe" johnd
: 创建一个名为johnd
的用户,创建其主目录,设置shell为bash,并添加注释。sudo useradd -m -G developers,testers jane
: 创建用户jane
,创建其主目录,并将其加入developers
和testers
组。
userdel
(删除用户账户 Delete a user account and related files)- 用途: 用于从系统中删除用户账户。
- 语法:
userdel [选项] 用户名
- 常用选项:
-r
: 删除用户的主目录及其中的文件,以及用户的邮件池。-f
: 强制删除用户账户,即使该用户当前已登录或其文件仍被使用。
- 示例:
sudo userdel olduser
: 删除用户olduser
(不删除其主目录)。sudo userdel -r former_employee
: 删除用户former_employee
并移除其主目录和邮件池。
usermod
(修改用户账户 Modify a user account)- 用途: 用于修改现有用户账户的各种属性。
- 语法:
usermod [选项] 用户名
- 常用选项:
-l 新登录名
: 更改用户的登录名。-d 新家目录路径 [-m]
: 更改用户的主目录。-m
选项会将旧主目录的内容移动到新主目录。-s 新shell路径
: 更改用户的默认登录shell。-g 新主组名或GID
: 更改用户的主组。-G 新附加组列表
: 更改用户所属的附加组列表(会覆盖原有的附加组)。-aG 附加组
: 将用户追加到指定的附加组,而不影响其他已有的附加组 (-a
必须与-G
一起使用)。-L
: 锁定用户账户,使其无法登录。-U
: 解锁用户账户。-e YYYY-MM-DD
: 设置账户的过期日期。-c "新注释"
: 修改用户的注释信息。
- 示例:
sudo usermod -s /usr/sbin/nologin restricted_user
: 将用户restricted_user
的shell设置为/usr/sbin/nologin
,使其无法登录。sudo usermod -aG docker current_user
: 将用户current_user
添加到docker
组。sudo usermod -L problematic_user
: 锁定用户problematic_user
的账户。
passwd
(更改用户密码 Change user password)- 用途: 用于设置或更改用户账户的密码。
- 语法:
passwd [选项][用户名]
- 行为:
- 如果未指定用户名,则更改当前用户的密码 (需要输入当前密码)。
- 如果由
root
用户执行并指定了用户名,则可以直接更改该用户的密码,无需知道其旧密码。
- 常用选项:
-d
: 删除指定用户的密码,使其可以无密码登录 (非常不安全,慎用)。-l
: 锁定指定用户的密码,使其无法通过密码登录。-u
: 解锁指定用户的密码。-e
或--expire
: 强制用户在下次登录时更改密码。-S
: 显示密码状态信息。-n 天数
: 设置密码最短有效天数。-x 天数
: 设置密码最长有效天数。-w 天数
: 设置密码过期前多少天开始警告。-i 天数
: 密码过期后账户停用前的天数。
- 示例:
passwd
: 更改当前用户的密码。sudo passwd john
: 更改用户john
的密码。sudo passwd -l jane
: 锁定用户jane
的密码。
5.4 用户组管理 (Group Management)
groupadd
(创建新用户组 Create a new group)- 用途: 用于在系统中创建一个新的用户组。
- 语法:
groupadd [选项] 组名
- 常用选项:
-g GID
: 指定新用户组的GID (组ID)。如果省略,系统会自动分配一个。-r
: 创建一个系统组。
- 示例:
sudo groupadd developers
: 创建一个名为developers
的用户组。
groupdel
(删除用户组 Delete a group)- 用途: 用于从系统中删除一个已存在的用户组。
- 语法:
groupdel [选项] 组名
- 常用选项:
-f
或--force
: 强制删除组,即使该组是某个用户的主组(通常不推荐这样做,除非明确知道后果)。
- 注意: 不能删除作为任何用户主组的组,除非先更改该用户的主组。
- 示例:
sudo groupdel old_project_team
: 删除名为old_project_team
的用户组。
groupmod
(修改用户组 Modify a group definition on the system)- 用途: 用于修改现有用户组的属性,如组名或GID。
- 语法:
groupmod [选项] 组名
- 常用选项:
-n 新组名
: 更改用户组的名称。-g 新GID
: 更改用户组的GID。-o
: 与-g
配合使用,允许GID不唯一(通常不推荐)。
- 示例:
sudo groupmod -n web_developers developers
: 将用户组developers
重命名为web_developers
。sudo groupmod -g 1005 new_team
: 将用户组new_team
的GID修改为1005。
groups
(打印用户所属的组 Print the groups a user is in)- 用途: 显示指定用户(默认为当前用户)所属的所有组的列表。
- 语法:
groups [用户名]
- 示例:
groups
: 显示当前用户所属的组。groups john
: 显示用户john
所属的组。
5.5 文件权限与归属管理 (File Permission and Ownership Management)
Linux 文件权限基于“用户-组-其他” (UGO) 模型,对每个文件或目录定义了读(r)、写(w)、执行(x)三种基本权限。
chmod
(更改文件模式位/权限 Change file mode bits)
- 用途: 修改文件或目录的访问权限。
- 语法:
chmod [选项] 模式 文件/目录...
- 模式 (Mode):
- 符号模式 (Symbolic Mode): 使用
u
(所有者/用户),g
(组),o
(其他),a
(所有) 结合+
(添加权限),-
(移除权限),=
(设置精确权限) 以及r
(读),w
(写),x
(执行)。 - 数字模式 (Octal Mode): 使用三位八进制数表示权限,每位分别对应所有者、组和其他人。每位数字是r(4), w(2), x(1)权限值的和。
- 符号模式 (Symbolic Mode): 使用
- 常用选项:
-R
: 递归地修改目录及其内容的权限。
- 表格5.1:
chmod
数字模式权限含义
数字 | r (读) | w (写) | x (执行) | 描述 |
---|---|---|---|---|
0 | - | - | - | 无权限 |
1 | - | - | x | 执行权限 |
2 | - | w | - | 写入权限 |
3 | - | w | x | 写入和执行权限 |
4 | r | - | - | 读取权限 |
5 | r | - | x | 读取和执行权限 |
6 | r | w | - | 读取和写入权限 |
7 | r | w | x | 读取、写入和执行权限 |
**示例:**
`chmod u+x script.sh`: 为文件 `script.sh` 的所有者添加执行权限。
`chmod 600 private_key.pem`: 设置 `private_key.pem` 文件的权限为所有者可读写,组和其他人无任何权限 (rw-------)。
`chmod 755 public_script.sh`: 设置 `public_script.sh` 权限为所有者可读写执行,组和其他人可读可执行 (rwxr-xr-x)。
`sudo chmod -R 750 /var/www/my_app`: 递归地设置 `/var/www/my_app` 目录及其内容的权限为所有者读写执行,所属组读执行,其他人无权限。
chown
(更改文件所有者和组 Change file owner and group)- 用途: 更改文件或目录的用户所有者和/或组所有者。通常需要超级用户权限。
- 语法:
chown [选项][新所有者][:新组] 文件/目录...
- 常用选项:
-R
: 递归地更改目录及其内容的所有权。
- 示例:
sudo chown john myfile.txt
: 将myfile.txt
的所有者更改为用户john
。sudo chown jane:developers report.doc
: 将report.doc
的所有者更改为jane
,所属组更改为developers
。sudo chown -R www-data:www-data /var/www/html
: 递归地将/var/www/html
目录及其所有内容的所有者和所属组更改为www-data
。
chgrp
(更改文件组所有权 Change file group ownership)- 用途: 单独更改文件或目录的组所有者。通常需要超级用户权限。
- 语法:
chgrp [选项] 新组 文件/目录...
- 常用选项:
-R
: 递归地更改目录及其内容的组所有权。
- 示例:
sudo chgrp editors draft.txt
: 将draft.txt
的所属组更改为editors
。sudo chgrp -R web_content /srv/my_website/assets
: 递归地将/srv/my_website/assets
目录及其所有内容的所属组更改为web_content
。
六、网络命令 (Networking Commands)
Linux 提供了丰富的网络命令,用于测试连接、配置接口、查看状态、进行远程操作和DNS查询。
6.1 网络连接测试 (Network Connectivity Testing)
ping
(向网络主机发送ICMP ECHO_REQUEST数据包 Send ICMP ECHO_REQUEST to network hosts)
- 用途: 测试与目标主机之间的网络连通性,通过发送ICMP回显请求并等待回显应答。
- 语法:
ping [选项] 主机名或IP地址
- 常用选项:
-c 次数
: 发送指定数量的回显请求包后停止。-i 间隔
: 设置发送每个包之间的间隔秒数。-s 包大小
: 设置发送包的大小(字节)。-W 超时
: 设置等待响应的超时时间(秒)。
- 示例:
ping google.com
: 持续向google.com
发送ping包,直到手动停止 (Ctrl+C
)。ping -c 5 192.168.1.1
: 向 IP 地址192.168.1.1
发送5个ping包。
6.2 网络接口配置与查看 (Network Interface Configuration and Viewing)
ip
(显示/操作路由、网络设备、接口和隧道 Show / manipulate routing, network devices, interfaces and tunnels)用途: 这是Linux系统中用于网络配置的核心工具,功能强大,已取代旧的
ifconfig
和route
等命令。子命令:
addr
(或 a): 管理网络接口的IP地址。ip addr show [dev 接口名]
: 显示指定接口(或所有接口)的IP地址信息。sudo ip addr add IP地址/掩码 dev 接口名
: 为接口添加IP地址。
sudo ip addr del IP地址/掩码 dev 接口名
: 从接口删除IP地址。link
(或 l): 管理网络设备(接口)本身。ip link show [dev 接口名]
: 显示接口的状态和属性。
sudo ip link set 接口名 up/down
: 启用或禁用指定的网络接口。sudo ip link set 接口名 mtu 数值
: 设置接口的最大传输单元 (MTU)。route
(或 r): 管理路由表。ip route show
或ip route list
: 显示内核路由表。sudo ip route add 目标网络/掩码 via 网关地址 [dev 接口名]
: 添加一条静态路由。
sudo ip route del 目标网络/掩码
: 删除一条路由。
neigh
(或 n): 管理ARP或NDP缓存(邻居表)。ip neigh show
: 显示邻居表。
ip
命令是ifconfig
的现代替代品,功能更强大,语法更一致。ifconfig
在许多新发行版中已不再默认安装。示例:
ip addr show eth0
: 显示eth0
接口的IP地址信息。sudo ip link set wlan0 down
: 禁用wlan0
无线接口。ip route add default via 192.168.1.254 dev eth0
: 添加默认网关。
ifconfig
(配置网络接口 - 旧版 Configure a network interface - deprecated)- 用途: 在较旧的Linux系统中用于配置和显示网络接口信息。
- 内容:
ifconfig
: 显示所有活动接口的信息。ifconfig 接口名
: 显示指定接口的信息。sudo ifconfig 接口名 IP地址 netmask 子网掩码 up
: 配置接口IP并启用。
- 注意: 此命令已逐渐被
ip
命令取代,在新系统中可能未预装。 - 示例:
ifconfig eth0
6.3 网络状态与套接字查看 (Network Status and Socket Viewing)
ss
(另一个调查套接字的实用程序 Another utility to investigate sockets)- 用途: 用于显示活动的套接字连接信息,是
netstat
的现代替代品,通常更快且提供更多信息。 - 语法:
ss [选项]
- 常用选项:
-t
: 显示TCP套接字。-u
: 显示UDP套接字。-x
: 显示Unix域套接字。-l
: 显示监听状态的套接字。-p
: 显示使用套接字的进程。-n
: 不解析服务名称,直接显示数字地址和端口号。-a
: 显示所有状态的套接字(监听和非监听)。-e
: 显示详细的套接字信息。-o
: 显示计时器信息。-s
: 显示套接字摘要统计。state 状态
: 过滤特定状态的连接 (如established
,listen
,time-wait
)。
ss
命令比netstat
更快、提供更多信息,并且是netstat
的推荐替代品。- 示例:
ss -tulnp
: 显示所有TCP和UDP的监听端口及其对应的进程,并以数字形式显示地址和端口。ss -tan state established
: 显示所有已建立的TCP连接。ss -tlp sport = :22
: 显示监听在SSH端口(22)的TCP连接及进程。
- 用途: 用于显示活动的套接字连接信息,是
netstat
(打印网络连接、路由表、接口统计等 - 旧版 Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships - deprecated)- 用途: 显示网络连接、路由表、接口统计等信息。
- 语法:
netstat [选项]
- 常用选项:
-t
: 显示TCP连接。-u
: 显示UDP连接。-l
: 显示监听套接字。-p
: 显示与套接字关联的进程ID和名称。-n
: 以数字形式显示地址和端口号。-a
: 显示所有活动的连接和监听端口。-r
: 显示内核路由表。-i
: 显示网络接口统计信息。-s
: 显示各协议的统计摘要。
- 注意:
netstat
已被ss
命令取代,在新系统中可能未预装或不被推荐使用。 - 示例:
sudo netstat -tulnp
: 显示所有TCP和UDP的监听端口、对应的进程,并以数字形式显示地址和端口。
6.4 远程连接与文件传输 (Remote Connection and File Transfer)
ssh
(安全Shell客户端 OpenSSH SSH client (remote login program))- 用途: Secure Shell,用于安全地远程登录到另一台Linux/Unix服务器,并执行命令。所有通信都会被加密。
- 语法:
ssh [选项] 用户名@主机名或IP地址 [命令]
- 常用选项:
-p 端口号
: 指定连接的远程SSH服务器端口 (默认为22)。-i 身份文件路径
: 指定用于公钥认证的私钥文件路径。-X
: 启用X11转发,允许在本地显示远程GUI应用的界面。-L 本地端口:目标主机:目标端口
: 设置本地端口转发。-R 远程端口:目标主机:目标端口
: 设置远程端口转发。-C
: 启用压缩,可以加快慢速网络下的传输速度。-v
: 详细模式,显示连接过程的调试信息。
- 示例:
ssh user@example.com
: 以用户user
的身份登录到example.com
。ssh -p 2222 admin@192.168.1.100 "df -h"
: 通过2222端口以admin
用户身份连接到192.168.1.100
并执行df -h
命令。ssh -L 8080:localhost:80 user@remote_server
: 将本地的8080端口转发到远程服务器的80端口。
scp
(安全复制文件 Secure copy (remote file copy program))- 用途: Secure Copy Protocol,用于在本地主机和远程主机之间,或者两台远程主机之间安全地复制文件和目录。它使用SSH进行数据传输和认证。
- 语法:
scp [选项][[用户名@]源主机:]源文件路径 [[用户名@]目标主机:]目标文件路径
- 常用选项:
-P 端口号
(注意是大写P): 指定远程主机的SSH端口。-r
: 递归复制整个目录。-i 身份文件路径
: 指定用于认证的私钥文件。-C
: 启用压缩。-v
: 显示详细的传输过程。-l 带宽限制
: 限制传输带宽 (Kbit/s)。
- 示例:
scp local_document.pdf user@remote.server.com:/home/user/documents/
: 将本地文件local_document.pdf
复制到远程服务器的指定目录。scp -r user@source.server.com:/var/www/html/ /backup/website/
: 将远程服务器上的html
目录递归复制到本地的/backup/website/
目录。scp -P 2200 file.zip user@another.host:~/backups/
: 通过2200端口将file.zip
复制到另一台远程主机的backups
目录。
sftp
(安全文件传输程序 Secure File Transfer Program)用途: 提供一个交互式的安全文件传输会话,类似于传统的FTP客户端,但所有操作都通过SSH加密通道进行。
语法:
sftp [选项][用户名@]主机名或IP地址
常用选项:
-P 端口号
(大写P): 指定远程SSH端口。-b 批处理文件
: 从批处理文件中读取命令执行。-B 缓冲区大小
: 指定传输缓冲区大小。
交互模式常用命令:
(在 sftp>提示符下使用)
get 远程文件 [本地路径]
: 下载文件。put 本地文件 [远程路径]
: 上传文件。ls [远程路径]
: 列出远程目录内容。cd 远程路径
: 更改远程当前目录。lcd 本地路径
: 更改本地当前目录。pwd
: 显示远程当前工作目录。lpwd
: 显示本地当前工作目录。rm 远程文件
: 删除远程文件。mkdir 远程目录名
: 创建远程目录。rmdir 远程目录名
: 删除远程目录。help
或?
: 显示帮助信息。exit
或quit
或bye
: 断开连接并退出SFTP。
示例:
sftp user@fileserver.example.com
: 连接到SFTP服务器。- (在
sftp>
提示符下)get important_data.zip /local/backups/
: 从远程服务器下载文件。
ftp
(文件传输协议客户端 - 旧版,不安全 File Transfer Protocol client - deprecated, insecure)用途: 用于通过文件传输协议 (FTP) 在网络上的计算机之间传输文件。
内容: FTP传输数据和凭证(用户名、密码)时通常不加密,存在安全风险。推荐使用SFTP或SCP作为更安全的选择。
语法:
ftp [主机名或IP地址]
交互模式常用命令:
(在 ftp> 提示符下使用)
user 用户名 [密码]
: 登录。get 远程文件 [本地文件名]
: 下载文件。put 本地文件 [远程文件名]
: 上传文件。mget 远程文件模式
: 下载多个文件。mput 本地文件模式
: 上传多个文件。ls
: 列出远程目录内容。cd 远程目录
: 更改远程当前目录。pwd
: 显示远程当前工作目录。delete 远程文件
: 删除远程文件。mkdir 远程目录名
: 创建远程目录。binary
: 设置二进制传输模式 (传输非文本文件时必须)。ascii
: 设置ASCII传输模式 (传输文本文件时)。bye
或quit
: 断开连接并退出FTP。
示例:
ftp ftp.example.com
: 连接到FTP服务器ftp.example.com
。- (在
ftp>
提示符下)get report.pdf
: 下载report.pdf
文件。
wget
(非交互式网络下载器 The non-interactive network downloader)- 用途: 从Web服务器下载文件,支持HTTP, HTTPS, FTP协议。它是一个非交互式工具,可以在后台运行。
- 语法:
wget [选项]......
- 常用选项:
-O 文件名
: 将下载内容保存为指定的文件名。-P 目录
: 指定下载文件的保存目录。-c
: 断点续传,继续下载未完成的文件。-r
: 递归下载整个网站或目录。-l 深度
: 递归下载时指定最大深度。-np
: 递归下载时不进入父目录。-k
: 转换链接,使下载的HTML文件可以在本地查看。-p
: 下载所有显示HTML页面所需的文件,如图片等。-b
: 后台下载。-i 文件
: 从文件中读取URL列表进行下载。--limit-rate=速度
: 限制下载速度 (例如100k
,
wget
(非交互式网络下载器 The non-interactive network downloader)
用途: 从Web服务器下载文件,支持HTTP, HTTPS, FTP协议。它是一个非交互式工具,可以在后台运行。
语法: wget [选项]...... [URL...]
常用选项:
-O 文件名
: 将下载内容保存为指定的文件名。- 示例:
wget -O latest.tar.gz https://example.com/latest-version.tar.gz
- 示例:
-P 目录
: 指定下载文件的保存目录。- 示例:
wget -P /opt/downloads https://example.com/archive.zip
- 示例:
-c
: 断点续传,继续下载未完成的文件。- 示例:
wget -c https://large.example.com/bigfile.iso
- 示例:
-r
: 递归下载整个网站或目录。- 示例:
wget -r http://example.com/docs/
- 示例:
-l 深度
: 递归下载时指定最大深度。- 示例:
wget -r -l 2 http://example.com/
(下载当前页和下一层链接)
- 示例:
-np
: 递归下载时不进入父目录。- 示例:
wget -r -np http://example.com/parent/child/
(不会下载http://example.com/parent/
的其他内容)
- 示例:
-k
: 转换链接,使下载的HTML文件可以在本地查看。通常与-r
一起使用。- 示例:
wget -r -k http://example.com/
- 示例:
-p
: 下载所有显示HTML页面所需的文件,如图片、CSS等。通常与-r
一起使用。- 示例:
wget -r -p http://example.com/page.html
- 示例:
-b
: 后台下载。日志默认输出到wget-log
。- 示例:
wget -b https://large.example.com/bigfile.iso
- 示例:
-i 文件
: 从文件中读取URL列表进行下载,每行一个URL。- 示例:
wget -i urls.txt
(其中urls.txt
包含多个下载链接)
- 示例:
--limit-rate=速度
: 限制下载速度 (例如 100k, 1m)。- 示例:
wget --limit-rate=200k https://example.com/file.zip
- 示例:
--tries=数字
: 设置重试次数 (0 表示无限)。- 示例:
wget --tries=5 https://example.com/file.zip
- 示例:
--user-agent="字符串"
: 设置自定义 User-Agent。- 示例:
wget --user-agent="MyCustomBrowser/1.0" https://example.com/
- 示例:
--no-check-certificate
: 不检查服务器的SSL证书 (不安全,慎用)。- 示例:
wget --no-check-certificate https://self-signed.example.com/
- 示例:
--user=用户名 --password=密码
: FTP或HTTP认证。- 示例:
wget --user=myuser --password=mypass ftp://ftp.example.com/file.dat
- 示例:
curl
(Client URL 请求库)
用途: 用于传输数据的命令行工具,支持多种协议,包括 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, LDAP, SMTP 等。非常灵活,常用于API测试和自动化脚本。
语法: curl [选项] [URL...]
常用选项:
-O
: 将输出写入与远程文件名相同的文件。- 示例:
curl -O https://example.com/archive.zip
(保存为archive.zip
)
- 示例:
-o 文件名
: 将输出写入指定的文件名。- 示例:
curl -o new_archive.zip https://example.com/archive.zip
- 示例:
-L
: 跟随HTTP重定向。- 示例:
curl -L http://example.com
- 示例:
-I
或--head
: 仅获取HTTP头信息。- 示例:
curl -I https://example.com
- 示例:
-H "头部信息"
: 添加自定义HTTP头部。- 示例:
curl -H "Authorization: Bearer mytoken" https://api.example.com/data
- 示例:
-X 请求方法
: 指定HTTP请求方法 (GET, POST, PUT, DELETE 等)。- 示例 (POST):
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/submit
- 示例 (POST):
-d "数据"
或--data "数据"
: 发送HTTP POST请求的数据。- 示例:
curl -d "param1=value1¶m2=value2" https://example.com/form
- 示例:
-F "表单数据"
或--form "表单数据"
: 模拟multipart/form-data提交,常用于文件上传。- 示例:
curl -F "file=@/path/to/localfile.txt" -F "name=myfile" https://example.com/upload
- 示例:
-u 用户名:密码
: 进行服务器认证。- 示例:
curl -u myuser:mypassword https://api.example.com/protected
- 示例:
-s
或--silent
: 静默模式,不显示进度条或错误信息。- 示例:
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://example.com)
- 示例:
-v
或--verbose
: 显示详细的通信信息,包括请求和响应头。- 示例:
curl -v https://example.com
- 示例:
-k
或--insecure
: 允许连接到没有有效SSL证书的HTTPS站点 (不安全,慎用)。- 示例:
curl -k https://self-signed.example.com
- 示例:
--connect-timeout 秒数
: 设置最大连接时间。- 示例:
curl --connect-timeout 5 https://example.com
- 示例:
--max-time 秒数
: 设置允许操作完成的最大总时间。- 示例:
curl --max-time 30 https://example.com/largefile
- 示例:
nslookup
(Name Server Lookup) 🌐
用途: 查询DNS域名服务器,获取域名对应的IP地址或其他DNS记录。
语法:
- 非交互模式:
nslookup [选项] [域名] [DNS服务器]
- 交互模式:
nslookup
(进入提示符后输入域名或选项)
常用选项/查询类型:
- 默认查询A记录 (IP地址)。
set type=mx
: 查询MX记录 (邮件交换服务器)。set type=ns
: 查询NS记录 (域名服务器)。set type=soa
: 查询SOA记录 (起始授权机构记录)。set type=txt
: 查询TXT记录 (文本记录)。set type=ptr
: 查询PTR记录 (反向DNS查找)。server <DNS服务器IP>
: 在交互模式下指定查询使用的DNS服务器。
示例:
nslookup example.com
(https://www.google.com/search?q=%E6%9F%A5%E8%AF%A2example.com的A记录)nslookup example.com 8.8.8.8
(使用Google https://www.google.com/search?q=DNS%E6%9F%A5%E8%AF%A2example.com)交互模式:
nslookup > server 8.8.8.8 > set type=mx > google.com > exit
nslookup -type=mx google.com
(非交互式查询MX记录)nslookup 8.8.4.4
(反向查询IP地址对应的主机名)
dig
(Domain Information Groper) ⛏️
用途: 更强大和灵活的DNS查询工具,常用于DNS故障排除。
语法: dig [@服务器] [域名] [查询类型] [选项]
常用选项/查询类型:
- 默认查询A记录。
MX
: 查询邮件交换记录。NS
: 查询域名服务器记录。SOA
: 查询起始授权机构记录。TXT
: 查询文本记录。ANY
: 查询所有类型的记录。-x <IP地址>
: 进行反向DNS查询。+short
: 只显示简短的答案。+trace
: 显示从根域名服务器开始的完整解析路径。+noall +answer
: 只显示答案部分。@<DNS服务器IP>
: 指定查询使用的DNS服务器。
示例:
dig example.com
dig example.com MX
dig @8.8.8.8 example.com NS
dig -x 8.8.4.4
dig example.com +short
dig example.com +trace
dig example.com ANY +noall +answer
traceroute
(追踪路由路径) 🗺️
用途: 显示数据包从本地主机到目标主机所经过的路由路径,以及每一跳的延迟。
语法: traceroute [选项] 主机名或IP地址
常用选项:
-n
: 不将IP地址解析为主机名,加快显示速度。-I
: 使用ICMP ECHO请求代替UDP数据报 (类似Windows的tracert)。-T
: 使用TCP SYN请求代替UDP数据报。-p 端口号
: 指定UDP或TCP的目标端口号。-m 最大跳数
: 设置最大跳数 (默认为30)。-q 查询次数
: 设置对每一跳发送的探测包数量 (默认为3)。-w 等待时间
: 设置等待探测包回复的超时时间 (秒)。
示例:
traceroute google.com
traceroute -n 8.8.8.8
traceroute -I example.com
(使用ICMP)traceroute -T -p 80 example.com
(https://www.google.com/search?q=%E8%BF%BD%E8%B8%AA%E5%88%B0example.com的TCP 80端口)
route
(显示/操作IP路由表 - 传统)
用途: (传统工具,推荐使用 ip route
) 显示和管理内核的IP路由表。
语法:
route
或route -n
(显示路由表,-n以数字形式显示IP和端口)route add [-net|-host] 目标 [netmask Nm] [gw Gw] [metric M] [[dev] If]
route del [-net|-host] 目标 [netmask Nm] [gw Gw] [metric M] [[dev] If]
常用选项/参数:
-n
: 以数字形式显示地址,不解析主机名。add
: 添加一条路由。del
: 删除一条路由。-net 目标网络
: 指定目标是一个网络。-host 目标主机
: 指定目标是一个主机。netmask Nm
: 指定网络的子网掩码。gw Gw
: 指定网关地址。dev If
: 指定路由通过哪个网络接口。metric M
: 设置路由的度量值 (成本)。
示例:
route -n
(显示当前路由表)route add default gw 192.168.1.1
(添加默认网关)route del default gw 192.168.1.1
(删除默认网关)route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.0.1
(添加一个到10.0.0.0/8网络的静态路由)route del -net 10.0.0.0 netmask 255.0.0.0
(删除上述静态路由)
七、端口查看与防火墙管理
ss
(Socket Statistics) SOCKET
用途: 用于转储套接字统计信息,可以显示比 netstat
更多的TCP和状态信息。它是 netstat
的现代替代品。
语法: ss [选项]
常用选项:
-t
: 显示TCP套接字。-u
: 显示UDP套接字。-l
: 显示监听状态的套接字。-p
: 显示使用套接字的进程。-n
: 不解析服务名称,直接显示端口号。-a
: 显示所有套接字 (监听和非监听)。-e
: 显示详细的套接字信息。-o
: 显示计时器信息。- state <状态>: 过滤特定状态的连接,如
established, listen, time-wait
。- 例如:
ss state established
- 例如:
示例:
ss -tulnp
(最常用组合:显示所有TCP和UDP监听端口及其进程,不解析名称)ss -tan
(显示所有TCP连接,不解析名称)ss -s
(显示套接字使用摘要)ss -t -a dst :22
(显示所有到22端口的TCP连接)ss -t -a src 192.168.1.100:http
(显示源自192.168.1.100的HTTP TCP连接)
netstat
(Network Statistics - 传统)
用途: (传统工具,推荐使用 ss
) 显示网络连接、路由表、接口统计等信息。
语法: netstat [选项]
常用选项:
-t
: 显示TCP连接。-u
: 显示UDP连接。-l
: 显示监听状态的套接字。-p
: 显示使用套接字的进程PID和名称 (通常需要root权限)。-n
: 以数字形式显示地址和端口号,不解析名称。-a
: 显示所有活动的连接和监听端口。-r
: 显示路由表 (类似route -n
)。-i
: 显示网络接口统计信息 (类似ifconfig
或ip -s link
)。-c
: 持续显示信息。-e
: 显示扩展信息。
示例:
netstat -tulnp
(最常用组合:显示所有TCP和UDP监听端口及其进程,不解析名称)netstat -an
(显示所有活动的连接和监听端口,不解析名称)netstat -rn
(显示路由表)netstat -i
(显示网络接口)netstat -antp | grep ESTABLISHED
(显示所有已建立的TCP连接及其进程)
iptables
(IPv4 Packet Filtering and NAT) 🔥🧱
用途: Linux内核防火墙 netfilter
的用户空间命令行工具,用于配置IPv4数据包过滤规则、NAT和包处理。功能强大但语法复杂。
基本概念:
Tables (表):
filter
: 默认表,用于数据包过滤 (INPUT, OUTPUT, FORWARD 链)。nat
: 用于网络地址转换 (PREROUTING, POSTROUTING, OUTPUT 链)。mangle
: 用于修改IP头字段 (所有链)。raw
: 用于配置豁免,使数据包不经过连接跟踪。
Chains (链):
规则的有序列表。
INPUT
: 处理发往本机的入站数据包。OUTPUT
: 处理本机发出的出站数据包。FORWARD
: 处理流经本机的转发数据包。PREROUTING
: 在路由决策之前处理数据包 (常用于DNAT)。POSTROUTING
: 在路由决策之后,数据包即将发出时处理 (常用于SNAT)。
Targets (目标):
规则匹配后执行的动作。
ACCEPT
: 接受数据包。DROP
: 丢弃数据包 (不响应)。REJECT
: 拒绝数据包 (通常会返回错误信息)。LOG
: 记录数据包信息。SNAT
: 源地址转换。DNAT
: 目标地址转换。MASQUERADE
: 动态源地址转换 (常用于共享上网)。
语法 (通用): iptables [-t 表名] 命令 链名 匹配条件 -j 目标
常用命令:
-L [链名]
: 列出规则。-v
: 显示详细信息 (包和字节计数器)。-n
: 数字格式显示IP和端口。--line-numbers
: 显示规则编号。
-A 链名
: 追加新规则到链尾。-I 链名 [规则编号]
: 插入新规则到指定位置 (默认链首)。-D 链名 规则编号或规则定义
: 删除规则。-R 链名 规则编号 规则定义
: 替换规则。-F [链名]
: 清空链中的所有规则。-Z [链名]
: 清零链中所有规则的包和字节计数器。-P 链名 目标
: 设置链的默认策略 (ACCEPT, DROP)。-N 链名
: 创建用户自定义链。-X [链名]
: 删除用户自定义空链。-E 旧链名 新链名
: 重命名用户自定义链。
常用匹配条件:
-p 协议
: 指定协议 (tcp, udp, icmp, all)。-s 源地址/掩码
: 指定源IP地址或网络。-d 目标地址/掩码
: 指定目标IP地址或网络。-i 输入接口
: 指定数据包进入的网络接口。-o 输出接口
: 指定数据包流出的网络接口。--sport 源端口
: 指定源端口 (需与-p tcp
或-p udp
配合)。--dport 目标端口
: 指定目标端口。-m 模块名 --模块选项
: 使用扩展模块 (如state, conntrack, multiport, tcp, udp
)。-m state --state NEW,ESTABLISHED,RELATED
: 匹配连接状态。-m multiport --dports 22,80,443
: 匹配多个目标端口。
示例:
- 查看规则:
sudo iptables -L -n -v
(查看filter表所有链的规则)sudo iptables -t nat -L -n -v --line-numbers
(查看nat表规则并显示行号)
- 设置默认策略: (通常先允许所有传出,拒绝所有传入和转发)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
- 允许特定端口/服务:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
(允许SSH)sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
(允许HTTP)sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
(允许HTTPS)sudo iptables -A INPUT -i lo -j ACCEPT
(允许来自本地回环接口的所有流量)sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(允许已建立和相关的连接)
- 允许特定IP:
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
- 阻止特定IP:
sudo iptables -A INPUT -s 1.2.3.4 -j DROP
(阻止单个IP)sudo iptables -A INPUT -s 1.2.3.0/24 -j REJECT
(拒绝整个子网)
- 删除规则:
sudo iptables -D INPUT 3
(删除INPUT链中编号为3的规则)sudo iptables -D INPUT -s 1.2.3.4 -j DROP
(按规则定义删除)
- 清空规则:
sudo iptables -F INPUT
(清空INPUT链)sudo iptables -F
(清空filter表所有链)sudo iptables -t nat -F
(清空nat表所有链)
- NAT示例 (SNAT/MASQUERADE - 共享上网):
- 假设
eth0
是外网接口,eth1
是内网接口 (内网IP段192.168.1.0/24
)。 sudo sysctl -w net.ipv4.ip_forward=1
(开启IP转发)sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- 假设
- NAT示例 (DNAT - 端口转发):
- 将外网接口
eth0
的TCP 8080端口转发到内网服务器192.168.1.100
的80端口。 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- 将外网接口
保存和恢复规则:
- 规则默认在重启后丢失。
- 保存:
sudo iptables-save > /etc/iptables/rules.v4
(Debian/Ubuntu,需安装iptables-persistent
)sudo ip6tables-save > /etc/iptables/rules.v6
在RHEL/CentOS系统上,通常使用systemctl enable iptables
和systemctl start iptables
(需要iptables-services
包),规则保存在/etc/sysconfig/iptables
。 - 恢复:
sudo iptables-restore < /etc/iptables/rules.v4
iptables-persistent
(Debian/Ubuntu):- 安装:
sudo apt install iptables-persistent
- 保存当前规则:
sudo netfilter-persistent save
(或sudo /etc/init.d/netfilter-persistent save
) - 系统启动时会自动加载。
- 安装:
ufw
(Uncomplicated Firewall) 🛡️
用途: 一个用户友好的 iptables
前端,旨在简化防火墙配置。
语法: sudo ufw [选项] 命令
常用命令与选项:
状态管理:
sudo ufw enable
: 启用防火墙 (并设置开机自启)。sudo ufw disable
: 禁用防火墙。sudo ufw status
: 查看防火墙状态和规则。sudo ufw status numbered
: 查看规则并显示编号。sudo ufw status verbose
: 查看详细状态。sudo ufw reload
: 重载防火墙规则 (不中断现有连接)。sudo ufw reset
: 重置防火墙到默认状态 (会禁用防火墙)。
默认策略:
sudo ufw default deny incoming
: 拒绝所有入站连接 (推荐)。sudo ufw default allow outgoing
: 允许所有出站连接 (推荐)。sudo ufw default deny outgoing
: 拒绝所有出站连接。sudo ufw default deny routed
: 拒绝所有转发的包。
规则管理 (allow/deny/reject/limit):
sudo ufw allow <端口号>[/协议]
- 示例:
sudo ufw allow 22/tcp
(允许TCP 22端口) - 示例:
sudo ufw allow 53
(允许TCP和UDP 53端口)
- 示例:
sudo ufw allow <服务名>
(服务名在
/etc/services
中定义)- 示例:
sudo ufw allow ssh
- 示例:
sudo ufw allow http
- 示例:
sudo ufw allow https
- 示例:
sudo ufw deny <端口号>[/协议]
- 示例:
sudo ufw deny 3306
(拒绝访问MySQL端口)
- 示例:
sudo ufw reject <端口号>[/协议]
(拒绝并返回消息)sudo ufw limit <端口号>[/协议]
(限制连接频率,如SSH,防止暴力破解:如果在30秒内尝试连接6次以上,则拒绝连接)
- 示例:
sudo ufw limit ssh
- 示例:
基于源/目标IP的规则:
sudo ufw allow from <IP地址>
- 示例:
sudo ufw allow from 192.168.1.100
- 示例:
sudo ufw allow from <IP地址> to any port <端口号>
- 示例:
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp
- 示例:
sudo ufw deny from <IP地址>
- 示例:
sudo ufw deny from 1.2.3.4
- 示例:
基于网络接口的规则:
sudo ufw allow in on <接口名> to any port <端口号>
- 示例:
sudo ufw allow in on eth1 to any port 80
- 示例:
删除规则:
sudo ufw delete <规则定义>
- 示例:
sudo ufw delete allow 80
- 示例:
sudo ufw delete allow from 1.2.3.4
- 示例:
sudo ufw delete <规则编号>
(通过
sudo ufw status numbered
获取编号)- 示例:
sudo ufw delete 3
- 示例:
应用程序配置文件:
ufw
可以使用应用程序配置文件 (位于/etc/ufw/applications.d
)。sudo ufw app list
: 列出可用的应用程序配置文件。sudo ufw app info <应用名>
: 显示应用程序配置文件的详细信息。sudo ufw allow <应用名>
: 允许应用程序配置文件中定义的所有规则。
- 示例:
sudo ufw allow 'Nginx Full'
- 示例:
日志:
sudo ufw logging on [low|medium|high|full]
sudo ufw logging off
- 日志通常记录在
/var/log/ufw.log
。
示例流程:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
(或sudo ufw allow 22/tcp
)sudo ufw allow http
(或sudo ufw allow 80/tcp
)sudo ufw allow https
(或sudo ufw allow 443/tcp
)sudo ufw enable
sudo ufw status
firewall-cmd
(Firewalld Command Line Client) 🔥 Zones
用途: firewalld
服务的命令行客户端,是 RHEL/CentOS 7+ 和 Fedora 等发行版的默认防火墙管理工具。它使用 “区域 (zones)” 和 “服务 (services)” 的概念。
基本概念:
- Zones (区域): 网络连接可以被分配到不同的区域,每个区域有自己独立的防火墙规则集。预定义区域如
public
,home
,work
,dmz
,internal
,external
,block
,drop
,trusted
。 - Services (服务): 预定义的 XML 文件,描述了服务所需的端口和协议 (如
ssh
,http
)。 - Permanent vs Runtime Configuration:
- 默认情况下,
firewall-cmd
修改的是运行时配置,重启后失效。 - 添加
--permanent
选项可以修改永久配置,但需要firewall-cmd --reload
或重启firewalld
服务才能生效。
- 默认情况下,
语法: sudo firewall-cmd [选项] [操作]
常用命令与选项:
状态与管理:
sudo systemctl status firewalld
: 查看firewalld
服务状态。sudo systemctl start firewalld
: 启动服务。sudo systemctl stop firewalld
: 停止服务。sudo systemctl enable firewalld
: 设置开机自启。sudo systemctl disable firewalld
: 禁止开机自启。sudo firewall-cmd --state
: 查看防火墙运行状态。sudo firewall-cmd --reload
: 重载防火墙规则 (不中断现有连接,使永久配置生效)。sudo firewall-cmd --complete-reload
: 完全重载 (中断现有连接)。
区域管理:
sudo firewall-cmd --get-default-zone
: 获取默认区域。sudo firewall-cmd --set-default-zone=<区域名>
: 设置默认区域。sudo firewall-cmd --get-active-zones
: 获取当前活动的区域及其绑定的接口。sudo firewall-cmd --get-zones
: 列出所有可用区域。sudo firewall-cmd --zone=<区域名> --list-all
: 列出指定区域的所有配置。sudo firewall-cmd --zone=<区域名> --add-interface=<接口名>
: 将接口添加到指定区域 (运行时)。sudo firewall-cmd --zone=<区域名> --add-interface=<接口名> --permanent
: 永久添加。sudo firewall-cmd --zone=<区域名> --change-interface=<接口名>
: 修改接口所属区域。sudo firewall-cmd --zone=<区域名> --remove-interface=<接口名>
: 从区域移除接口。sudo firewall-cmd --zone=<区域名> --add-source=<IP或子网>
: 将源IP/子网添加到区域。
服务管理:
sudo firewall-cmd --get-services
: 列出所有预定义的服务。sudo firewall-cmd --zone=<区域名> --add-service=<服务名>
(运行时)sudo firewall-cmd --zone=<区域名> --add-service=<服务名> --permanent
(永久)- 示例:
sudo firewall-cmd --permanent --zone=public --add-service=http
- 示例:
sudo firewall-cmd --zone=<区域名> --remove-service=<服务名>
(运行时)sudo firewall-cmd --zone=<区域名> --remove-service=<服务名> --permanent
(永久)sudo firewall-cmd --zone=<区域名> --list-services
: 列出区域中允许的服务。
端口管理:
sudo firewall-cmd --zone=<区域名> --add-port=<端口号>/<协议>
(运行时)sudo firewall-cmd --zone=<区域名> --add-port=<端口号>/<协议> --permanent
(永久)- 示例:
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
- 示例:
sudo firewall-cmd --zone=<区域名> --remove-port=<端口号>/<协议>
(运行时)sudo firewall-cmd --zone=<区域名> --remove-port=<端口号>/<协议> --permanent
(永久)sudo firewall-cmd --zone=<区域名> --list-ports
: 列出区域中允许的端口。
Panic Mode:
sudo firewall-cmd --panic-on
: 紧急模式,丢弃所有入站和出站数据包。sudo firewall-cmd --panic-off
: 关闭紧急模式。sudo firewall-cmd --query-panic
: 查询紧急模式状态。
Direct Rules (直接规则 - 类似iptables语法,不推荐常规使用):
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j ACCEPT
Rich Rules (富规则 - 更灵活的规则定义):
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject'
示例流程 (public区域):
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --set-default-zone=public
(通常public是默认)sudo firewall-cmd --permanent --zone=public --add-service=ssh
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp
(允许一个端口范围)sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all
八、常用配置文件与文本编辑器
常见重要配置文件 ⚙️
以下是一些Linux系统中常见的配置文件及其典型路径和用途:
/etc/passwd:
- 用途: 存储用户账户信息(如用户名、用户ID (UID)、组ID (GID)、用户描述、家目录路径、默认shell)。密码字段通常是一个
x
,表示加密后的密码存储在/etc/shadow
中。 - 格式:
username:password_placeholder:UID:GID:comment:home_directory:login_shell
- 用途: 存储用户账户信息(如用户名、用户ID (UID)、组ID (GID)、用户描述、家目录路径、默认shell)。密码字段通常是一个
/etc/shadow:
用途: 安全地存储用户加密后的密码和密码老化信息。此文件通常只有root用户可读。
格式:
username:encrypted_password:last_password_change_date:min_password_age:max_password_age:warning_period:inactivity_period:expiration_date:reserved_field
encrypted_password
:!
或*
表示账户被锁定或没有密码。- 日期字段通常是从1970年1月1日开始的天数。
/etc/group:
- 用途: 存储用户组信息(组名、组ID (GID)、组成员列表)。
- 格式:
group_name:password_placeholder:GID:user_list_comma_separated
/etc/fstab (Filesystem Table):
用途: 定义磁盘分区、各种块设备或远程文件系统如何在系统启动时挂载到文件系统中,或者在需要时由
mount -a
命令挂载。格式:
device_spec mount_point fstype options dump pass_num
device_spec
: 设备(如/dev/sda1
)或UUID(如UUID=xxxxxxxx-xxxx...
)mount_point
: 挂载点(如/
、/home
、/var
)fstype
: 文件系统类型(如ext4
、xfs
、ntfs
、nfs
)options
: 挂载选项(如defaults
、rw
、ro
、noatime
)dump
:dump
工具是否备份(0或1)pass_num
:fsck
检查文件系统的顺序(0表示不检查,1表示根文件系统,2表示其他)
/etc/hosts:
用途: 提供静态的IP地址到主机名的映射。在DNS解析之前,系统会检查此文件。常用于本地测试或强制解析特定域名到特定IP。
格式:
IP_address canonical_hostname [aliases...]
- 示例:
127.0.0.1 localhost loopback
- 示例:
192.168.1.100 myserver myapp.local
- 示例:
/etc/resolv.conf:
- 用途: 配置DNS解析器,指定域名服务器(nameserver)的IP地址以及搜索域(search domain)。在许多现代发行版中,此文件可能由网络管理服务(如NetworkManager或systemd-resolved)动态生成和管理,不建议手动编辑。
- 格式:
nameserver IP_address_of_DNS_server
search domain1.com domain2.net
options timeout:1
~/.bashrc (用户特定):
- 用途: Bash shell的用户特定配置文件。当用户启动一个新的交互式非登录shell时(如打开一个新的终端窗口),此文件中的命令会被执行。常用于设置别名、环境变量、自定义提示符等。
- 位置: 用户家目录下 (
~
表示家目录,如/home/username/.bashrc
)
/etc/profile (系统全局):
- 用途: Bash (及其他Bourne兼容shell) 的系统全局配置文件。当任何用户登录系统时(登录shell),此文件中的命令会被执行。它通常会调用
/etc/profile.d/
目录下的脚本。 - 注意: 修改此文件会影响系统所有用户。
- 用途: Bash (及其他Bourne兼容shell) 的系统全局配置文件。当任何用户登录系统时(登录shell),此文件中的命令会被执行。它通常会调用
/etc/profile.d/*.sh:
- 用途:
/etc/profile
通常会执行此目录下的所有.sh
脚本,用于模块化地配置系统范围的环境变量和启动程序。
- 用途:
/etc/bash.bashrc (系统全局,某些发行版):
- 用途: 系统全局的bashrc文件,为所有用户的交互式非登录shell执行。
/var/log/syslog (Debian/Ubuntu) 或 /var/log/messages (RHEL/CentOS):
- 用途: 系统主要的日志文件,记录了内核消息、系统服务消息、以及各种应用程序的日志。是故障排除的重要来源。
- 管理: 通常由
rsyslogd
或syslog-ng
服务管理。
/etc/ssh/sshd_config:
- 用途: OpenSSH服务器 (sshd) 的配置文件。控制SSH服务的行为,如监听端口、是否允许root登录、认证方法等。
/etc/sysctl.conf:
- 用途: 用于在系统启动时配置内核参数。
sysctl -p
可以加载此文件中的设置。
- 用途: 用于在系统启动时配置内核参数。
常用文本编辑器 📝
在Linux命令行下,最常用的文本编辑器是 vi
(或其增强版 vim
) 和 nano
。
nano
nano
是一个简单易用的命令行文本编辑器,适合初学者。屏幕底部会显示常用快捷键。
启动:
nano 文件名
(如果文件不存在,则创建新文件)nano
(不带文件名,之后可保存为新文件)
常用快捷键 (Ctrl 代表 Control 键):
Ctrl + G
: 获取帮助 (显示所有快捷键)。Ctrl + O
: 保存文件 (Write Out)。会提示输入文件名,回车确认。Ctrl + X
: 退出nano
。如果文件已修改但未保存,会提示是否保存。Ctrl + W
: 搜索文本 (Where is)。Ctrl + \
: 替换文本 (Replace)。Ctrl + K
:剪切当前行 (Cut Text)。Ctrl + U
: 粘贴剪切的文本 (Uncut Text)。Ctrl + C
: 显示当前光标位置 (行号、列号)。Ctrl + J
: 对齐当前段落 (Justify)。Ctrl + T
: 检查拼写 (需要安装spell
包)。Alt + U
: 撤销上一次操作。Alt + E
: 重做上一次撤销的操作。- 方向键: 移动光标。
PageUp / PageDown
: 上下翻页。Home / End
: 移动到行首/行尾。
示例: sudo nano /etc/hosts
(编辑hosts文件,需要sudo权限)
vi
/ vim
(Vi IMproved)
vi
是一个功能强大的模态编辑器,学习曲线较陡峭,但熟练后效率极高。vim
是 vi
的增强版,提供了更多功能(如语法高亮、多级撤销等)。大多数现代系统实际上的 vi
命令是指向 vim
的。
模式:
- 命令模式 (Command Mode): 默认模式。用于移动光标、删除文本、复制粘贴等操作。按键不会直接输入文本。
- 插入模式 (Insert Mode): 用于输入文本。从命令模式按
i
,a
,o
等键进入。按Esc
键返回命令模式。 - 末行模式 (Last Line Mode / Ex Mode): 在命令模式下按
:
进入。用于执行保存、退出、搜索替换等命令。
启动:
vi 文件名
或vim 文件名
基本操作 (命令模式下):
- 移动光标:
h
: 左j
: 下k
: 上l
: 右w
: 移动到下一个单词的开头b
: 移动到上一个单词的开头0
(零): 移动到当前行行首^
: 移动到当前行第一个非空白字符$
: 移动到当前行行尾gg
: 移动到文件第一行G
: 移动到文件最后一行行号G
: 移动到指定行号 (例如10G
到第10行)
- 进入插入模式:
i
: 在当前光标前插入I
: 在当前行首插入a
: 在当前光标后追加A
: 在当前行尾追加o
: 在当前行下方插入一个新行O
: 在当前行上方插入一个新行
- 删除文本:
x
: 删除当前光标处的字符dw
: 删除一个单词 (从光标处到词尾)dd
: 删除当前行数字dd
: 删除从当前行开始的指定数量的行 (例如3dd
删除3行)D
: 删除从光标到行尾的内容
- 复制 (Yank) 与粘贴 (Put):
yw
: 复制一个单词yy
: 复制当前行 (y 代表 yank)数字yy
: 复制多行p
: 在光标后粘贴 (小写p)P
: 在光标前粘贴 (大写P)
- 撤销与重做:
u
: 撤销上一次操作 (undo)Ctrl + r
: 重做上一次撤销的操作 (redo)
- 搜索:
/模式
: 向下搜索 “模式” (按n
查找下一个,N
查找上一个)?模式
: 向上搜索 “模式”
末行模式命令 (按 :
后输入):
:w
: 保存文件 (write)。:w 文件名
:另存为指定文件名。:q
: 退出 (quit)。如果文件已修改但未保存,会阻止退出。:q!
: 强制退出,不保存修改。:wq
或:x
: 保存并退出。:e 文件名
: 编辑另一个文件。:set number
或:set nu
: 显示行号。:set nonumber
或:set nonu
: 关闭行号。:%s/旧字符串/新字符串/g
: 全局替换 (g代表global)。:%s/旧字符串/新字符串/gc
: 全局替换,每次替换前确认 (c代表confirm)。:!外部命令
: 执行外部shell命令 (例如:!ls -l
)。
示例: sudo vim /etc/ssh/sshd_config
学习 vim
:
- 可以在终端中运行
vimtutor
命令,这是一个交互式的vim
教程。
这只是 vim
功能的冰山一角,但足以应付日常的配置文件编辑。