Linux 常用命令与文件权限
Linux 命令通过管道组合,完成文本分析与系统管理。本文负责文本处理、权限和 Shell 重定向。
1. 面试核心
先记住这几条,再读正文- 文本处理。 grep 过滤行,sed 编辑文本,awk 按字段统计。卡 · grep、sed 与 awk
- 日志计数。
uniq只合并相邻重复行,日志计数前需排序。卡 · grep、sed 与 awk - 目录权限。 目录 r 控制列名,x 控制路径搜索,w 控制目录项修改。卡 · 文件权限
- 创建权限。
umask从创建时申请的权限中屏蔽对应位。卡 · umask 与 ACL - 重定向顺序。 Shell 从左到右处理重定向,
2>&1复制当前标准输出目标。卡 · 重定向与管道退出状态
2. 常用命令分类
| 用途 | 命令示例 |
|---|---|
| 文件查找 | find /var/log -name "*.log" -size +100M |
| 跟踪日志 | tail -F app.log,按文件名跟踪轮转 |
| 文本查看 | less file、head -n 20 file |
| 进程 | ps -ef、pgrep nginx |
| 服务 | systemctl status nginx |
| 资源 | free -h、vmstat 1 |
| 磁盘 | df -h、du -sh /data |
| 网络 | ss -lntp、curl -v、dig |
find -mtime +7 按完整的 24 小时段计算。它匹配修改时间至少达到 8 个整天的文件。精确时间边界需按任务选择条件。
crontab 的五个时间字段是分、时、日、月、周。任务环境与交互 Shell 分开。脚本应使用明确的工作目录、PATH 和日志输出。
3. grep、sed 与 awk
grep -n 'ERROR' app.log
grep -c 'ERROR' app.log
grep -E 'timeout|refused' app.log
sed -n '10p' file
sed -i.bak 's/old/new/g' config.conf
awk -F: '{print $1}' /etc/passwd
awk 'NR==10' file
grep 的 -n 输出行号,-c 统计匹配行。-E 启用扩展正则,-F 按固定字符串匹配。sed 示例会保留 .bak 副本。这里的原地替换写法适用于 GNU sed。
假设 access.log 使用标准 Nginx combined 格式。第一列是客户端地址,第九列是状态码。
awk '$9 >= 500' access.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
第二条命令输出次数最多的十个地址。sort 先让相同地址相邻。uniq 计数后,再按数字倒序排列。自定义日志格式需先确认字段位置。
大日志可用 awk 先计数,减少排序数据量。
awk '{c[$1]++} END {for (ip in c) print c[ip], ip}' access.log |
sort -nr | head -n 10
这种方法的内存随不同 IP 的数量增长。
4. 文件权限
ls -l 依次显示类型、权限、链接数和属主信息。后续字段是大小、修改时间和名称。
-rwxr-x--- 1 app devops 4096 Oct 13 10:00 deploy.sh
权限分为属主、属组和其他人三组。每组 r、w、x 分别对应 4、2、1。示例为 750,属组拥有读取和执行权限。
| 权限 | 普通文件 | 目录 |
|---|---|---|
| r | 读取内容 | 列出目录项名称 |
| w | 修改内容 | 创建、删除、重命名目录项 |
| x | 执行程序 | 搜索目录,访问已知名称 |
访问深层文件需要沿途每级目录的 x 权限。删除文件需要父目录的 w 和 x 权限。文件自身是否可写与目录项删除是两项检查。
Sticky 位进一步约束删除和重命名。文件属主、目录属主或具备相应特权者可操作。只读挂载、ACL 和安全模块还会施加额外约束。
SUID 可让可执行程序取得文件属主的有效 UID。SGID 目录让新建对象继承目录属组。共享目录可结合组权限与 SGID 使用。
软链接保存目标路径,可跨文件系统。硬链接让多个目录项指向同一 inode。文件生命周期见 磁盘与文件系统排查。
5. umask 与 ACL
无默认 ACL 时,新对象权限为 mode & ~umask。若程序以 0666 创建文件,umask 022 得到 0644。若以 0777 创建目录,则得到 0755。umask 会屏蔽权限位,不会主动添加执行权限。
ACL 为指定用户或组增加权限条目。mask 限制命名用户、命名组和属组条目的有效权限。属主和 other 条目不受该 mask 约束。
getfacl file 可查看条目及 effective 权限。条目允许访问但实际被拒绝时,应检查 mask。父目录的默认 ACL 可被新对象继承。此时权限生成按 ACL 继承规则处理,并受创建 mode 约束。
6. 重定向与管道退出状态
Shell 从左到右执行重定向。
cmd >out.log 2>&1
cmd 2>&1 >out.log
第一条将标准输出和标准错误都写入文件。第二条先把标准错误指向原标准输出。随后只有标准输出改到文件,错误仍到原目标。
| 默认只连接前一命令的标准输出。Bash 默认返回管道最后一个命令的状态。set -o pipefail 让管道反映右侧最后一个失败命令。它适合发现被后续成功命令掩盖的错误。
7 · 面试题卡片
本页题目与参考回答
7.1 怎样用 grep、awk 等命令统计日志?例如找出访问次数最多的 10 个 IP、打印文件第 10 行。
考察重点
- grep、sed、awk 的分工。
- 用管道组合出统计命令,并解释
sort必须在uniq之前。
相关内容:grep、sed 与 awk、常用命令分类。
参考回答
可用 awk 取地址列,再排序、计数并取前十。
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10。uniq 只合并相邻行,所以先用 sort 聚集相同地址。
打印第十行可用 sed -n '10p' file。awk 的等价写法是 awk 'NR==10' file。grep -n 'aaaa' file 显示匹配行及行号。统计前需确认日志格式和字段位置。
7.2 ls -l 的每一列是什么意思?目录的读、写、执行权限分别代表什么?两个用户都要操作同一个文件,应该怎样授权?
考察重点
- 三组九位权限和数字表示。
- 文件与目录上 r、w、x 的不同含义;删除文件需要父目录的 w 和 x。
- 用组或 ACL 按共享范围授权。
相关内容:文件权限。
参考回答
ls -l 显示类型、权限、链接数和属主属组。
随后是大小、时间与文件名。权限分为三组,r、w、x 对应 4、2、1。
目录 r 用于列出名称,x 用于搜索路径。修改目录项需要 w,具体访问还需要 x。删除文件还受 Sticky 位等额外约束。
两个用户共享文件可使用同一组。文件给组读写权限,沿途目录给搜索权限。共享目录加 SGID,让新文件继承属组。个别用户授权可用 ACL,并检查 mask 的有效权限。
7.3 umask 022 为什么得到文件 644、目录 755?ACL 有 rw 却写不了是什么原因?
考察重点:创建 mode、按位屏蔽与 ACL mask。
相关内容:umask 与 ACL。
参考回答
无默认 ACL 时,umask 022 会屏蔽组和其他用户的写权限,所以创建请求为 0666 的文件得到 0644,请求为 0777 的目录得到 0755。
程序请求不同的 mode,结果也会改变。
ACL 中命名用户的 rw 还受 mask 限制。用 getfacl 查看 effective 权限,再检查沿途目录权限和挂载状态。
7.4 两种 2>&1 重定向顺序有何差别?管道前段失败怎样发现?
考察重点:描述符复制顺序与 pipefail。
相关内容:重定向与管道退出状态。
参考回答
重定向从左到右执行。
>out.log 2>&1 将两种输出都写入文件。2>&1 >out.log 将错误留在原输出目标。Bash 默认取管道最后一条命令的状态。启用 pipefail 后,管道返回右侧最后一个失败状态。