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 [-|+]天数: 按文件修改时间查找 (如-77天内修改,+3030天前修改)。-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)的作业转到后台继续运行。
- 语法:
bg51 (作业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 > exitnslookup -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.comdig example.com MXdig @8.8.8.8 example.com NSdig -x 8.8.4.4dig example.com +shortdig example.com +tracedig 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.comtraceroute -n 8.8.8.8traceroute -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 DROPsudo iptables -P FORWARD DROPsudo 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 MASQUERADEsudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPTsudo 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:80sudo 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 incomingsudo ufw default allow outgoingsudo 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 enablesudo 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 firewalldsudo systemctl enable firewalldsudo firewall-cmd --set-default-zone=public(通常public是默认)sudo firewall-cmd --permanent --zone=public --add-service=sshsudo firewall-cmd --permanent --zone=public --add-service=httpsudo firewall-cmd --permanent --zone=public --add-service=httpssudo firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp(允许一个端口范围)sudo firewall-cmd --reloadsudo 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_fieldencrypted_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_numdevice_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_serversearch domain1.com domain2.netoptions 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 功能的冰山一角,但足以应付日常的配置文件编辑。