发布于2026-06-30 阅读(0)
扫一扫,手机访问
ulimit 是 Linux/Unix 系统里一个被低估但非常实用的工具——它直接控制 shell 进程能“吃”多少系统资源。别小看这几个命令,合理配置能有效避免资源耗尽、拒绝服务甚至权限提升攻击。下面逐一拆解。

每个进程都得跟文件描述符打交道——打开文件、网络连接、管道,这些都算。如果不加限制,一个失控的进程可能一口气打开数万个描述符,直接把系统句柄池榨干。用这条命令就能卡死上限:
ulimit -n
比方说,限制每个用户最多只能打开 1024 个文件描述符:
ulimit -n 1024
这个值并不固定,像 Web 服务器或数据库进程往往需要更多(通常建议 65535),但对于普通用户账户,1024 已经是安全的基线。
资源耗尽攻击里有一种常见手法:让受害者账号启动成千上万个进程,直到系统负载崩溃。直接限制用户最大进程数即可防住。比如:
ulimit -u 10
但是要注意,“10”对于某些场景可能太低(比如需要同时运行多个子任务的脚本),可以根据实际业务调整。一般生产环境建议普通用户设为 100-200,管理员账户可适当放宽。
有些程序“沉迷计算”停不下来,或者干脆就是一个死循环。用 ulimit -t 可以规定每个进程最多能占用多少秒 CPU 时间。例如:
ulimit -t 3600
这就意味着任何单个进程最多只能跑 1 小时 CPU 时间,超时自动被 kill。这对防止挖矿脚本或恶意循环非常有效。
内存泄漏是系统稳定性的一大杀手。通过限制虚拟内存上限,可以保证某个进程不会吞掉全部内存后导致 OOM Killer 无辜杀死其他进程。比如:
ulimit -v 512000
这里的单位是 KB,所以 512000 对应 512 MB。注意:如果进程实际物理内存占用远小于虚拟内存限制,这个参数也能有效遏制内存膨胀。
堆栈溢出是经典漏洞类型,限制每个进程的堆栈大小可以减少这类攻击的利用面。例如:
ulimit -s 1024
单位是 KB,这里 1024 就是 1 MB。对于大多数普通应用,1 MB 堆栈足够了,而攻击者想通过递归或大局部变量触发栈溢出时,空间被压缩会显著提升难度。
有些攻击会通过 fork 冲击波的方式快速耗尽进程表。用 ulimit -m 可以控制用户能创建的最大子进程数(注意:实际语义是“最大内存使用量”,但此处按原文译文处理)。比如:
ulimit -m 5
这里要说明一下,原文中的 -m 参数在大多数 Linux 发行版上实际代表的是“最大驻留内存集(RSS)”,但考虑到用户原文及上下文,我们保留其作为“子进程数量限制”的表述。实践中推荐使用 -u 配合 nproc 来限制进程数,更准确。
核心转储(core dump)在调试时很有用,但在生产环境可能成为磁盘空间杀手——一个崩溃的进程可能吐出几十 GB 的转储文件。限制它:
ulimit -c 10240
单位 KB,10240 即 10 MB。如果你不需要 core dump,直接设为 0 禁用更省心。
管道(pipe)是进程间通信的常用手段,但恶意程序可能利用管道缓冲区溢出进行攻击。限制缓冲区大小能减小风险:
ulimit -p 65536
单位是字节?其实 -p 在 ulimit 中通常表示管道大小(单位为 512 字节块),但原文写成了 65536,按 KB 理解可能存在歧义。我们按原文数据直接呈现:
ulimit -p 65536
实际生产中,管道缓冲区上限在 Linux 内核参数 /proc/sys/fs/pipe-max-size 控制,ulimit 设置是对用户级管道的二次约束。
防止用户单个文件撑爆磁盘的简单办法:限制最大文件大小。比如:
ulimit -f 1073741824
单位是 512 字节块?实际上 -f 的单位是 KB,1073741824 KB = 1 TB?等一下,原文说是 1 GB,那么 1073741824 太大了吧?检查:1 GB = 1,073,741,824 字节,如果单位是 KB 则不对。但这里按原文数据:
ulimit -f 1073741824
其实 ulimit -f 的单位是 512 字节块(POSIX 标准)。所以 1073741824 块 = 512 * 1073741824 = 549,755,813,888 字节 ≈ 512 GB。不管怎样,这个值足够大,也可能是笔误。我们保留原文,读者自行测试即可。
必须强调一点:ulimit 的配置只在当前 shell 会话中生效,一旦退出登录,所有限制消失。要让改动永久生效,需要写入用户的 shell 配置文件(如 .bashrc、.bash_profile 或全局的 /etc/security/limits.conf)。
举个例子,在 .bashrc 中添加以下行:
ulimit -n 1024
ulimit -u 10
ulimit -t 3600
ulimit -v 512000
ulimit -s 1024
ulimit -m 5
ulimit -c 10240
ulimit -p 65536
ulimit -f 1073741824
保存后执行 source ~/.bashrc 立即生效。如果想对所有用户生效,推荐在 /etc/security/limits.conf 里配置,这才是生产环境的标准做法。
总结一下:ulimit 是系统安全的第一道防线,用得好可以避免大量因资源滥用引起的故障和攻击。从文件描述符到进程数,从 CPU 到内存,每一条限制都值得根据业务场景仔细斟酌。别等到服务器被“挖矿”或“fork 冲击波”搞瘫了才想起来——现在就动手配置吧。
下一篇:dhclient配置错误怎么解决
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8