权限管理与系统资源
校招考察频度:★ 高频(高频面试生死线·线上排查实战) 一句话速记:
r=4, w=2, x=1;目录的x是能否cd进入,文件的删改权在父目录的写权限;查端口必背ss -tunlp与lsof -i :port;看内存认准available而非free;磁盘打爆先df -h查挂载,再du -sh *揪大文件,删不掉查lsof | grep deleted。
在生产环境中,权限配置不当轻则导致服务无权写日志而崩溃,重则引发全盘安全漏洞;而端口冲突与磁盘被打爆则是后端线上最常见的应急排障场景。
一、Linux 文件权限体系
在 Linux 中,每个文件和目录都关联着一套严格的三元组访问控制权限:
Linux 权限结构拆解(八进制权限数值 754)
1. 核心权限位与八进制数值转换
| 权限字符 | 权限名称 | 对应数值(二进制/八进制) | 对文件的含义 | 对目录的含义(关键考点!) |
|---|---|---|---|---|
r | 读(Read) | 4(2^2) | 允许读取文件内容(如 cat、head) | 允许列出目录下的文件清单(执行 ls) |
w | 写(Write) | 2(2^1) | 允许修改、覆写文件内容 | 允许在目录内创建、重命名、删除文件 |
x | 执行(Execute) | 1(2^0) | 允许将文件作为程序/脚本执行 | 允许进入该目录(执行 cd 跳转) |
- | 无权限 | 0 | 无该项操作权限 | 无该项操作权限 |
2. 生产常见权限数值与含义
755(rwxr-xr-x):系统目录与可执行脚本标准权限。属主具备完全控制(读写执行),属组和其他人仅具备读取和进入/执行权限;644(rw-r--r--):普通数据文件与配置文件的标准权限。属主可读写,其他所有人仅可读取;600(rw-------):高敏感安全文件。仅属主一人可读写,其他人完全不可见(如 SSH 私钥~/.ssh/id_rsa、数据库明文密码文件);777(rwxrwxrwx):全员完全控制。任何人都可以删除和篡改文件,生产环境严格禁止使用!
二、权限与所有权修改命令
1. chmod:修改文件或目录权限
# 1. 数字模式修改(最常用)
chmod 755 deploy.sh
chmod 644 application.yml
# 2. 符号模式修改(常用于快捷增加执行权限)
chmod +x start.sh # 为所有人增加可执行权限
chmod u+w,g-w data.txt # 给属主增加写权限,剥夺属组写权限
# 3. 递归修改整个目录结构
chmod -R 755 /data/app/2. chown:修改文件属主与属组
# 变更属主为 appuser
chown appuser /data/app/app.jar
# 同时变更属主(appuser)与属组(appgroup),并递归应用到整个目录
chown -R appuser:appgroup /data/app/3. 特权提权:sudo 与 su
sudo <command>:以超级管理员(root)特权执行单条指令,操作会被完整记录到安全审计日志中;suvssu -的区别(高频追问):su appuser:虽然切换了用户身份,但是依然保留了原用户的环境变量($PATH、$HOME);su - appuser(带减号):完全重新登录,完整加载目标用户的登录 Shell、个人环境变量与配置文件,生产操作强烈推荐带-。
三、网络与端口占用排查(面试必问实战)
服务启动时最经典的报错:java.net.BindException: Address already in use。面试官必问:“怎么查是谁占用了 8080 端口?怎么释放?”
1. 端口占用定位三大方案对比
| 工具命令 | 执行语法 | 适用场景与优劣 |
|---|---|---|
ss(推荐) | ss -tunlp | grep 8080 | 现代 Linux 默认推荐。基于内核 Netlink 机制,执行极快,百万连接场景下绝不卡死 |
lsof | lsof -i :8080 | 输出最直观清晰。直接列出占用端口的 COMMAND、PID、USER,非常便于快速识别 |
netstat | netstat -tunlp | grep 8080 | 传统老工具。老版本服务器常见,但高并发连接数多时性能较慢(全表扫描 /proc) |
ss 常用参数拆解
-t:仅查看 TCP 协议套接字;-u:查看 UDP 协议套接字;-n:以数字形式显示 IP 与端口(不发起反向 DNS 解析,大幅加快查询响应);-l:仅显示处于 LISTEN(监听) 状态的套接字;-p:显示占用套接字的进程 PID 与程序名称(通常需要sudo权限才能完整显示全部进程)。
2. 端口与网络连通性探测
# 1. 快速检查本机或远程目标端口是否处于开放连通状态(nc 即 netcat)
nc -zv 127.0.0.1 8080
telnet 127.0.0.1 8080
# 2. 模拟发起 HTTP 请求,仅打印响应头(快速验证 Web 服务健康状态)
curl -I http://127.0.0.1:8080/health
# 3. 测试网络层物理连通性与丢包率(基于 ICMP)
ping -c 4 192.168.1.1四、系统资源与磁盘空间排查流程
1. 内存查看:free -h
$ free -h
total used free shared buff/cache available
Mem: 15Gi 3.2Gi 1.1Gi 240Mi 11Gi 11Gi
Swap: 2.0Gi 0B 2.0Gi2. 磁盘爆满排障工作流
线上服务器磁盘写入满(Disk Full 100%)会导致数据库无法刷盘、应用打日志直接崩溃。标准排查决策树如下:
磁盘空间 100% 报警应急排查全流程决策树
常用排查命令清单
- 查看挂载分区:
df -h - 查找大文件:
du -sh /data/* | sort -hr | head -n 10 - 安全清空大日志:
> app.log(避免用rm) - 查未释放幽灵句柄:
lsof | grep deleted - 查 Inode 耗尽:
df -i
五、环境变量与 Shell 配置文件
$PATH:系统寻找可执行二进制文件的搜索路径集合,各路径之间以冒号:分隔;- 临时追加路径:
export PATH=$PATH:/usr/local/bin; - 配置文件持久化加载差异:
/etc/profile:系统全局配置,对机器上的所有用户在登录时生效;~/.bashrc:当前用户独享配置,每次打开终端时自动加载;
- 立即生效:修改配置后执行
source ~/.bashrc立即刷新,无需退出重登。
六、高频面试追问
-
线上生产环境排查日志打爆磁盘时,直接使用
rm -f app.log会带来什么隐患?推荐怎么做?- 直接
rm可能导致正在运行的程序持有句柄不释放(空间不回收且排查困难),或者在重新创建同名文件时因为权限问题写不进日志; - 生产推荐做法:使用清空重定向操作符瞬间将文件截断置空,既能立即释放磁盘空间,又保持原文件句柄不断开:
> app.log # 或 cat /dev/null > app.log
- 直接
-
什么是 umask?为什么在 Linux 下新建的文件默认权限是 644,新建的目录默认权限是 755?
umask是系统的权限掩码,用来在创建文件或目录时“剥夺”特定的权限位;- 默认情况下,Linux 规定文件的基准权限是
666(出于安全考虑默认不给执行权限x),目录的基准权限是777; - 主流 Linux 系统的默认 umask 值为
022; - 新建文件权限 =
666 & ~022=644(rw-r--r--);新建目录权限 =777 & ~022=755(rwxr-xr-x)。