Linux 常用命令(持续更新)

1. 系统信息参数

  • 查看当前操作系统发行版本
1
2
3
cat /etc/issue
# Asianux Server 4 (Hiranya SP4)
# Kernel \r on an \m
  • 查看当前操作系统内核信息
1
2
3
4
5
6
7
8
9
uname -a
# Linux TD-APP-10 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 26 11:55:21 ICT 2014 x86_64 x86_64 x86_64 GNU/Linux
# 内核名称 主机名称 内核release 内核版本 机器名称 处理器 硬件平台 操作系统。

cat /proc/version
Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017

cat /etc/os-release

  • 物理 cpu 个数
1
2
3
# uniq :删除重复行
# wc –l :统计行数
cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
  • 逻辑 cpu 个数
1
cat /proc/cpuinfo | grep "processor" | wc -l
  • cpu 内核数
1
cat /proc/cpuinfo | grep "cpu cores" | uniq
  • cpu 型号
1
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
  • 单个物理 cpu 封装的逻辑CPU数量
1
cat /proc/cpuinfo | grep "siblings" | uniq
  • 查看内存总数
1
cat /proc/meminfo | grep MemTotal
  • 查看硬盘大小
1
df -h
  • 显示和设置系统的主机名
1
2
3
4
# 临时修改主机名
hostname [主机名]
# 永久修改主机名,是对/etc/hostname文件的内容进行修改
hostnamectl set-hostname [主机名]

2. 切换用户

2.1. su

1
2
3
4
5
# 格式为两种:
su -l USERNAME(-l为login,即登陆的简写)
su USERNAME
# 如果不指定USERNAME(用户名),默认即为root。
# 两者区别为,前者在改变用户的同时,也会切换工作目录,也会改变环境变量

2.2. sudo

1
2
3
# 用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。
# 若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
sudo(选项)(参数)

2.3. 注

su -使用root的密码,而sudo su使用用户密码

3. 启停后台screen

3.1. 常用语法

  • screen -ls : 列出当前所有的 session
  • screen -S yourname : 新建一个 yourname 的 session
  • screen -R yourname : 先试图恢复 yourname 的离线作业,若找不到,即建立新的作业
  • screen -r yourname : 恢复 yourname 的离线 screen 作业
  • screen -S id.yourname -X quit : 删除 screen

3.2. 常用操作

  • Ctril+a 再 d : detach,保持当前 screen 到后台并回到主终端

4. 快速定位到用户目录

  • cd ~ : ~ 是用户的主目录,等价于 /home/username

5. 删除面板上已输入命令

  • Ctrl+k : 删除从光标到行尾的部分
  • Ctrl+u : 删除从光标到行首的部分

6. 查找并显示给定命令的绝对路径

  • which (选项) (参数) : 环境变量 $PATH 中保存了查找命令时需要遍历的目录。which指令会在环境变量 $PATH 设置的目录里查找符合条件的文件。也就是说,可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

7. 端口

7.1 端口占用

查看某端口被谁占用

1
2
netstat -tunlp | grep 8080
netstat -anp | grep 8080

参数含义:

  • -a (all)显示所有选项,默认不显示LISTEN相关
  • -t (tcp)仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化成数字。
  • -l 仅列出有在 Listen (监听) 的服務状态
  • -p 显示建立相关链接的程序名
  • -r 显示路由信息,路由表
  • -e 显示扩展信息,例如uid等
  • -s 按各个协议进行统计
  • -c 每隔一个固定时间,执行该netstat命令。

7.2 端口监听

nc用于设置路由器,它能通过 TCPUDP 在网络中读写数据,是网络工具中的瑞士军刀

1
2
# -l 使用监听模式,管控传入的资料
nc -l [通信端口...]

8. 查看文件编码格式

1
2
3
4
5
6
7
8
# 直接查看
$ file [filename]

# vim 中查看并修改
$ vim [filename]
:set fileencoding # 查看文件编码格式
:set fileencoding=utf-8 # 修改文件编码格式
:set fileformat=unix # 修改文件编码换行模式

9. SCP

加密的方式在本地主机和远程主机之间复制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
scp (选项) (参数)

# 选项
-4:使用ipv4;
-6:使用ipv6;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-r:以递归方式复制
-q:不显示传输进度条

# 参数
源文件:指定要复制的源文件。
目标文件:目标文件。格式为user@host:filename(文件名为目标文件的名称)。

# 从远程机器复制到本地,例如:从10.10.10.10机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/目录中。
scp -P 10000 root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
# 上传本地目录到远程机器指定目录,例如:上传本地目录/opt/soft/mongodb到远程机器10.10.10.10上/opt/soft/scptest的目录中
scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest

10. 进程相关

10.1. 查看 java 进程

jps(Java Virtual Machine Process Status Tool)java 提供的一个显示当前所有 java 进程 pid 的命令

1
2
3
4
5
6
7
8
9
# jps 存放在 JAVA_HOME/bin/jps
jps [参数]

# 参数
-q:只显示pid,不显示class名称,jar文件名和传递给main方法的参数
-m 输出传递给main方法的参数
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
-v 输出传递给JVM的参数
-V 隐藏输出传递给JVM的参数

10.2. shell脚本启动的服务进程

  1. 如果使用 nohop 方式启动脚本,会有一个如下进程
    username 23418 1 0 Oct10 ? 00:00:00 /bin/bash ./start.sh
  2. PID是真正服务的父进程,所以需要查询该PID的子进程,才是服务的真正进程
    $ ps -ef|grep 23418

11. 软链接

11.1. 创建

1
2
3
4
ln -s [实际目标文件或目录] [链接放置的文件或目录]

# 在 /home/test2 下建立软链接,链接到 /data/test1,即效果为新增 /home/test2/test1
ln -s /data/test1/ /home/test2/

11.2. 修改

1
ln –snf  [新被链接文件或目录] [目标文件或目录]

11.3. 删除

1
2
3
4
rm –rf [软链接名称]

# 删除软链接 /home/test2/test1,最后不能带/,否则会删除被链接的文件,并且之后软链接还在
rm –rf /home/test2/test1

12. grep

语法 grep 查找内容

参数

  • grep -v : 反向查找,即不含指定文本的行
  • -l : --file-with-matches,列出文件内容符合指定的范本样式的文件名称
  • -d <动作> : --directories=<动作>,当指定要查找的是目录而非文件时,必须使用这项参数,否则将回报信息并停止动作
  • -r/-R : --recursive,等同于 -d recurse
  • -n : 显示行号
  • -E : 等于 egrep,开启扩展匹配,可匹配多个关键字
1
2
3
4
5
6
7
8
# 查找 apache 的进程
$ ps -ef|grep apache

# 查找 apache 的进程,并排除 gerp 的进程
ps -ef|grep apache |grep -v grep

# 只列出包含指定文本的文件名
grep -r -l "查询内容" 文件目录

12.1. 使用正则

标准的字符类

字符类 表示1 表示2
字母数字字符 [:alnum:] [0-9A-Za-z]
字母字符 [:alpha:] [A-Za-z]
数字 [:digit:] [0-9]
小写字母 [:lower:] [a-z]
大写字母 [:upper:] [A-Z]
空字符: 空格键符 和 制表符 [:blank:]
空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符 [:space:]
1
2
# 匹配 IP 地址
egrep '[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}' 文件名

12.2. 注意

  1. 在管道中使用时,必须使用双中括号来包裹标准字符,使用大括号时要转义:
1
2
# 查找日志文件中,在20220330那天,生成时间中分钟数是50多的文件,文件格式为 log_20220330090101.log
ll | grep "log_20220330[[:digit:]]\{2\}5[[:digit:]]\{3\}\.log"

13. 压缩

13.1. tar

1
2
3
4
5
6
7
8
打包:tar -cvf [目标文件名].tar [原文件名/目录名]
解包:tar -xvf [原文件名].tar
# 注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。

# 查看包含文件
tar -tzvf tmp.tar.gz
# 解压单个文件
tar -zxvf tmp.tar.gz fooo/1.log

13.2. tar.gz

1
2
3
4
5
6
7
8
# 方式一:利用前面已经打包好的tar文件,直接用压缩命令。
压缩:gzip [原文件名].tar
解压:gunzip [原文件名].tar.gz

# 方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]
解压并解包: tar -zxvf [原文件名].tar.gz -C /date/tmp
注:z代表用gzip算法来压缩/解压。

14. top

1
2
3
4
5
6
7
top - 12:05:27 up 1118 days, 17:08,  3 users,  load average: 0.08, 0.06, 0.00
Tasks: 471 total, 1 running, 470 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.5%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 132110604k total, 131593952k used, 516652k free, 214532k buffers
Swap: 67108856k total, 15100916k used, 52007940k free, 12616408k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

14.1. 任务队列信息,同 uptime 命令的执行结果

  • 系统时间:12:05:27
  • 运行时间:up 1118 days, 17:08
  • 当前登录用户:3 users
  • 负载均衡(uptime):load average: 0.08, 0.06, 0.00
    • average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
    • 数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了

14.2 Tasks — 任务(进程)

  • 总进程:471 total
  • 运行:1 running
  • 休眠:470 sleeping
  • 停止:0 stopped
  • 僵尸进程:0 zombie

14.3 Cpu(s) — 状态信息

  • 用户空间占用CPU的百分比(user space):0.2%us
  • 内核空间占用CPU的百分比(sysctl):0.2%sy
  • 改变过优先级的进程占用CPU的百分比:0.0%ni
  • 空闲CPU百分比(idolt):99.5%id
  • IO等待占用CPU的百分比(wait):0.1%wa
  • 硬中断占用CPU的百分比(Hardware IRQ):0.0%hi
  • 软中断占用CPU的百分比(Software Interrupts):0.0%si

14.4 Mem — 内存状态

  • 物理内存总量:132110604k total
  • 使用的物理内存总量:131593952k used
  • 空闲的物理内存总量:516652k free
  • 用在内核缓存的内存总量:214532k buffers

14.5 Swap — swap交换分区信息

  • 交换区内存总量:67108856k total
  • 使用的交换区的总量:15100916k used
  • 空闲的交换区总量:52007940k free
  • 缓存的交换区总量:12616408k cached

14.6 各进程(任务)的状态监控

  • PID:进程id
  • USER:进程所有者
  • PR:进程优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  • SHR:共享内存大小,单位kb
  • S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
  • %CPU:上次更新到现在的CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比
  • TIME+:进程使用的CPU时间总计,单位1/100秒
  • COMMAND:进程名称(命令名/命令行)

14.6.1. VIRT:virtual memory usage 虚拟内存

  1. 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
  2. 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

14.6.2. RES:resident memory usage 常驻内存

  1. 进程当前使用的内存大小,但不包括swap out
  2. 包含其他进程的共享
  3. 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
  4. 关于库占用内存的情况,它只统计加载的库文件所占内存大小

14.6.3. SHR:shared memory 共享内存

  1. 除了自身进程的共享内存,也包括其他进程的共享内存
  2. 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
  3. 计算某个进程所占的物理内存大小公式:RES-SHR
  4. swap out后,它将会降下来

14.6.4. DATA

  1. 数据占用的内存。如果top没有显示,按f键可以显示出来。
  2. 真正的该程序要求的数据空间,是真正在运行中要使用的。

15. 文本处理

15.1. head在屏幕上显示指定文件的起始若干行

head [OPTION] [FILE]

  • 在未指定行数时默认显示前10行。
  • 处理多个文件时会在各个文件之前附加含有文件名的行
  • 当没有文件或文件为-时,读取标准输入
1
2
3
4
-n, --lines=[-]NUM       显示前NUM行而不是默认的10行;如果NUM前有"-",那么会打印除了文件末尾的NUM行以外的其他行
-c, --bytes=[-]NUM 显示前NUM字节;如果NUM前有"-",那么会打印除了文件末尾的NUM字节以外的其他内容
-q, --quiet, --silent 不打印文件名行
-v, --verbose 总是打印文件名行

15.2. tail在屏幕上显示指定文件的末尾若干行

tail [OPTION] [FILE]

1
2
3
4
-n, --lines=[-]NUM       显示末尾NUM行而不是默认的10行;如果NUM前有"+",那么会打印除了文件起始的NUM行以外的其他行
-c, --bytes=[-]NUM 显示前NUM字节;如果NUM前有"+",那么会打印除了文件起始的NUM字节以外的其他内容
-f, --quiet, --silent 不打印文件名行
-v, --verbose 总是打印文件名行

16. 配置 jdk

16.1. 全局

root 用户配置 /etc/profile

JDK9 之后就没有了 dt.jartools.jar,不用配置 CLASSPATH

1
2
3
4
5
6
7
8
9
10
[root]# vim /etc/profile

JAVA_HOME=/opt/jdk1.7.0_07
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH

[root]# source /etc/profile

16.2. 分用户

用户账号配置 ~/.bash_profile,配置内容与上面一致,最后要

1
[user1]$ source ~/.bash_profile

16.3. 当前 session

只能影响当前 session,更换后需要重新执行

1
2
3
export JAVA_HOME=/usr/java/jdk1.8.0_25
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

17. 别名

设置命令别名,可以将参数放到当前用户主目录下的 .profile 或者 .bashrc里,两者为隐藏文件,前者针对当前普通用户,后者针对 root 用户。

1
alias [自定义命令]=`[源命令]` 

18. 调度

1. crontab

周期执行的任务一般由 cron 这个守护进程来处理 (ps -ef|grep cron)cron 读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。

1.1. 命令

1
2
3
4
5
crontab 
-u username 省略用户表表示操作当前用户的crontab
-e 编辑工作表
-l 列出工作表里的命令
-r 删除工作作

1.2. 配置

cron 在 3 个地方查找配置文件:

  • /var/spool/cron/

    这个目录下存放的是每个用户包括 root 的 crontab 任务,每个任务以创建者的名字命名,比如 tom 建的 crontab 任务对应的文件就是 /var/spool/cron/tom。一般一个用户最多只有一个 crontab 文件。
  • /etc/crontab

    这个文件负责安排由系统管理员制定的维护系统以及其他任务的 crontab。
  • /etc/cron.d/

    这个目录用来存放任何要执行的 crontab 文件或脚本。

2. at 执行一次,将在某个特定的时间执行的任务调度

3. anacron 关机后恢复尚未执行的程序 anacron

19. 字符集

修改显示字符

1
2
LANG="en_US.UTF-8"
export LANG

20. 免密登陆

1. 生成密钥

使用 ssh-keygen -t rsa,此时用户目录下的 .ssh 会生成 id_rsa(私钥)id_rsa.pub(公钥) 两个文件

2. 密钥发送到其他主机

  1. 方法一 : 使用 ssh-copy-id -i <id_ras.pub 路径>* <用户>@<ip> ,此时,会在 .ssh 生成 authorized_keys 文件
  2. 方法二 : 直接在机器下建立 .ssh/authorized_keys 文件,将其他机器的密钥写入文件

21. 新增用户

  1. 创建用户
  • adduser [用户名] : 该命令其实是个 perl 脚本,底层调用 useradd ,会在 /home 目录下会自动创建同名文件夹
  • useradd [用户名] : 直接调用会创建一个三无用户,无用户家目录,无指定shell版本,无密码
    • -c [备注] : 添加备注,会保存在 passwd 的备注栏位中
    • -d [登入目录] : 指定用户登入时的启始目录
    • -g [群组] : 指定用户所属的群组
    • -G [群组] : 指定用户所属的附加群组
    • -m : 自动建立用户的登入目录
    • -s : 指定用户登入后所使用的 shell
    • -u : 指定用户 id
  • passwd [用户名] : 为指定用户添加密码
  1. 删除用户
  • userdel [username] :
    • -r : 会将它在系统上的文件也删除掉
  1. 修改用户信息

使用 id 来查看用户信息,使用 usermod 来修改用户信息

1
2
3
# 用户 oracle,用户组 oinstall,附属组是 dba,创建文件时,文件属组是 oinstall
[root@host1]$ id
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)
  • usermod [参数] [用户组] [用户名] : 修改用户组
    • -g or --gid : 修改用户的属组
    • -a or --append : 把用户追加到某些组中,仅与 -G 选项一起使用
    • -G or --groups : 把用户追加到某些组中,仅与 -a 选项一起使用

22. 文件修改用户

1
2
# 将文件夹 file_root 用户切换为 user 用户
sudo chown user:user file_root/ -R

23. 查看指定几行

  1. 从第 3000 行开始,显示 1000 行,即显示 3000~3999 行
    cat filename | tail -n +3000 | head -n 100
  2. 显示 1000 行到 3000 行
    cat filename| head -n 3000 | tail -n +1000
  3. 从第 5 行开始,显示到第 10 行
    sed -n '5,10p' filename

24. 删除指定时间前文件

  1. 删除20分钟前的文件
  • find ./tmp -maxdepth 1 -type f -mmin +20 -exec rm {} \;
  1. 删除20天前的文件
  • find ./tmp -maxdepth 1 -type f -mtime +20 -exec rm {} \;

参数

  1. 时间处理
  • mtime(Modify time)\mmin : 修改天数/分钟数
  • atime(Access time)\amin : 访问天数/分钟数
  • ctime(Change time)\cmin : 状态变更天数/分钟数
  • n : 从现在算起向前推第 n 天当天
  • +n : 表示从现在算起向前推第 n 天之前所有的,不包括第 n 天当天
  • n=0 : 表示今天
  • n=+0 : 表示今天之前
  1. -exec 参数
  • {} 表示命令的参数, 即为所找到的文件
  • 命令的末尾必须以 ; 结束

25. 分区和挂载

查看分区

  • lsblk : 列出系统的所有块设备及其逻辑分区
  • fdisk : 主要用于创建或删除硬盘分区

26. 查看文件被进程占用

lsof |grep /tmp/.lock

26. 文件查看

1. view

语法格式: view [参数] 文件名,是 vi 命令的别名命令

常用参数:

  • +数字: 设置从文件第N行开始编辑
  • -b: 使用二进制模式
  • -c: 加载文件后执行指定命令
  • -e: 使用Ex模式
  • -m: 不允许修改文件内容
  • -n: 不使用交换分区,只用物理内存
  • -o: 打开指定数量的窗口
  • -p: 打开指定数量的标签页
  • -R: 使用只读模式
  • -s: 静默执行模式
  • -T: 设置使用的终端
  • -u: 使用vimrc,而不是.vimrc
  • -v: 使用Vi模式
  • -y: 使用简易模式
  • -Z: 使用受限模式
  • --help: 显示帮助信息
  • --literal: 不扩展通配符
  • --noplugin: 跳过指定插件
  • --remote: 连接至远程服务器
  • --version: 显示版本信息

2. more, less

区别:

  • less 可以按键盘上下方向键显示上下内容
  • less 不必读整个文件,加载速度比 more 更快
  • less 退出后,在屏幕上不会留下刚显示的内容
  • less 是 GNU 的一部分,more 是 util-linux 软件包的一部分,可以从 Linux 内核中获取

1. more

语法格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]

常用参数:

  • +n: 从笫n行开始显示
  • -n: 定义屏幕大小为n行
  • +/pattern: 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
  • -c: 从顶部清屏,然后显示
  • -d: 提示 “Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃`- 功能
  • -l: 忽略Ctrl+l(换页)字符
  • -p: 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  • -s: 把连续的多个空行显示为一行
  • -u: 把文件内容中的下画线去掉

常用操作:

  • Enter: 向下n行,需要定义,默认为1行
  • Ctrl+F空格键: 向下滚动一屏
  • Ctrl+B: 返回上一屏
  • =: 输出当前行的行号
  • :f: 输出文件名和当前行的行号
  • V: 调用vi编辑器
  • !命令: 调用Shell,并执行命令
  • q: 退出more

2. less

语法格式: less [参数] 文件

常用参数:

  • -b <缓冲区大小>: 设置缓冲区的大小
  • -e: 当文件显示结束后,自动离开
  • -f: 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
  • -g: 只标志最后搜索的关键词
  • -i: 忽略搜索时的大小写
  • -m: 显示类似 more 命令的百分比
  • -N: 显示每行的行号
  • -o: <文件名> 将less 输出的内容在指定文件中保存起来
  • -Q: 不使用警告音
  • -s: 显示连续空行为一行
  • -S: 行过长时间将超出部分舍弃
  • -x <数字>: 将“tab”键显示为规定的数字空格
  • /字符串: 向下搜索“字符串”的功能
  • ?字符串: 向上搜索“字符串”的功能
  • n: 重复前一个搜索(与 / 或 ? 有关)
  • N: 反向重复前一个搜索(与 / 或 ? 有关)

常用操作:

操作 键位
向前移动一行 k上键y
向后移动一行 j下键e回车键
向前翻一页 b[pageup]键
向后翻一页 空格键[pagedown]键
向前翻半页 u
向后翻半页 d
移动到最后一行 G
移动到第一行 g
显示帮助界面 Hh
退出less 命令 Qq

27. 防火墙/安全组设置

对于较旧的系统或使用传统防火墙的,一般使用 iptables 工具,对于使用较新版本的 RHEL/CentOS/Fedora 等系统,会使用 firewalld 工具。

在进行任何更改之前,最好备份当前的防火墙规则配置

1. iptables

  • 查看所有规则:sudo iptables -L -n -v
  • 查看规则带有行号(便于定位修改):sudo iptables -L --line-numbers
  • 添加规则:sudo iptables -A INPUT -p tcp --dport PORT_NUMBER -j ACCEPT (允许特定TCP端口的流量)
  • 删除规则:首先通过 sudo iptables -L --line-numbers找到规则的行号,然后使用 sudo iptables -D CHAIN编号 删除规则,例如 sudo iptables -D INPUT 5(删除INPUT链中的第5条规则)。
  • 保存规则:为了使更改永久生效,需要将规则保存到配置文件,具体命令根据发行版有所不同,如在 Debian 系系统中可以使用 iptables-save > /etc/iptables/rules.v4,并确保在系统启动时加载这些规则

2. firewalld

  • 启动防火墙:systemctl start firewalld
  • 关闭防火墙:systemctl stop firewalld
  • 查看防火墙状态:systemctl status firewalld
  • 查看所有区域及其默认策略:sudo firewall-cmd --list-all-zones
  • 查看特定服务或端口是否开放:sudo firewall-cmd --query-service=SERVICE_NAME 或 sudo firewall-cmd --query-port=PORT/tcp
  • 开放端口:sudo firewall-cmd --zone=public --permanent --add-port=PORT/tcp
  • 关闭端口:首先使用上述命令打开端口,然后用 --remove-port 替换 --add-port 来关闭
  • 重载配置:每次修改规则后,需使用 sudo firewall-cmd --reload 使更改生效
  • 添加服务:sudo firewall-cmd --permanent --add-service=SERVICE_NAME
  • 保存配置:--permanent 标志表示所做的更改是永久的,不需要手动保存