跳到主要内容
约 6 分钟4 张卡

Linux 常用命令与文件权限

Linux 命令通过管道组合,完成文本分析与系统管理。本文负责文本处理、权限和 Shell 重定向。

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 后,管道返回右侧最后一个失败状态。

8. 参考资料​