Linux命令行与脚本-02-文件权限与进程管理:掌握Linux安全核心

全文摘要

本文将带你深入理解Linux的文件权限体系和进程管理机制,帮助你掌握系统安全与性能监控的核心技能。你将学到Linux权限模型的组成、用户与组的管理方式、进程的查看与控制方法、系统资源的监控技巧,以及如何通过权限管理保护系统安全。通过阅读本文,你将理解Linux的多用户安全架构,能够进行基本的用户管理和进程监控。

全书总结

文件权限是Linux多用户安全架构的核心,它决定了谁可以访问文件和目录、可以进行什么操作。本文系统梳理了Linux权限模型的三重控制(读/写/执行)、用户/组/其他三类主体、权限修改的方法、特殊权限(SUID/SGID/Sticky)的作用,以及用户和组的管理方式。同时介绍了进程管理的核心概念,包括进程的查看、信号与终止、后台任务管理、系统资源监控等内容。适合系统管理员、DevOps工程师、以及对Linux系统管理感兴趣的技术人员阅读。


一、Linux权限模型:三重控制、三类主体

Linux采用简洁但强大的权限模型,每个文件有9个权限位,分为三类主体。

flowchart TB
    subgraph Permission[权限位 9位]
        direction TB
        subgraph Owner[所有者权限 前3位]
            R1[r 读]
            W1[w 写]
            X1[x 执行]
        end

        subgraph Group[组权限 中3位]
            R2[r 读]
            W2[w 写]
            X2[x 执行]
        end

        subgraph Other[其他权限 后3位]
            R3[r 读]
            W3[w 写]
            X3[x 执行]
        end
    end

    subgraph Meaning[权限含义]
        Read[读:查看内容<br/>目录:列出文件]
        Write[写:修改内容<br/>目录:创建删除文件]
        Exec[执行:运行文件<br/>目录:进入目录]
    end

    Permission --> Meaning

    style Owner fill:#e3f2fd
    style Group fill:#fff9c4
    style Other fill:#c8e6c9

图表讲解:这张图展示了Linux权限模型的基本结构——理解这个模型是掌握Linux文件安全的关键。

三个权限位(rwx)的含义:

  • r(read):读权限。对于文件,允许查看文件内容;对于目录,允许列出目录中的文件(需要同时有执行权限)。
  • w(write):写权限。对于文件,允许修改文件内容;对于目录,允许在目录中创建、删除文件(需要同时有执行权限)。
  • x(execute):执行权限。对于文件,允许执行(作为程序或脚本);对于目录,允许进入目录(cd)。

三类主体

  • 所有者(user):文件的创建者或当前所有者
  • 组(group):文件所属的组,组内成员拥有相应权限
  • 其他(others):既不是所有者也不在组中的用户

权限表示为rwxrwxrwx形式,如-rwxr-xr--

  • 第一个字符是文件类型(-普通文件,d目录,l符号链接)
  • 接下来3个字符是所有者权限
  • 中间3个字符是组权限
  • 最后3个字符是其他权限

-rwxr-xr--表示:所有者可以读写执行,组成员可以读和执行,其他人没有任何权限。


二、修改权限与所有者

chmod和chown是管理权限和所有者的核心命令。

flowchart TB
    subgraph Chmod[chmod 修改权限]
        direction TB
        Symbolic[符号模式<br/>u+x,g-w,o=r]
        Absolute[绝对模式<br/>chmod 755 file]
    end

    subgraph Chown[chown 修改所有者]
        direction TB
        Owner[修改所有者<br/>chown user file]
        Group[修改组<br/>chown :group file]
        Both[同时修改<br/>chown user:group file]
    end

    subgraph Chgrp[chgrp 修改组]
        direction TB
        Group2[仅修改组<br/>chgrp group file]
    end

    Chmod --> Usage[日常使用]
    Chown --> Usage
    Chgrp --> Usage

    style Chmod fill:#e3f2fd
    style Chown fill:#fff9c4
    style Chgrp fill:#c8e6c9

图表讲解:这张图展示了权限和所有者管理的命令家族——这些命令是系统安全的基石。

chmod(change mode)修改文件权限。两种方式:

  • 符号模式:用字母表示权限变化。u=user(所有者),g=group(组),o=other(其他),a=all(所有)。+=添加权限,-=删除权限。chmod u+x script.sh给所有者添加执行权限。chmod go-rwx secret.txt删除组和其他人的所有权限。
  • 绝对模式:用数字表示权限。r=4,w=2,x=1。rwx=7(4+2+1),r-x=5(4+1),rw-=6(4+2)。chmod 755 script.sh设置权限为rwxr-xr-x(所有者全权限,组和其他人读和执行)。755是可执行文件的常见权限,644是普通文件的常见权限。

chown(change owner)修改文件的所有者和组。chown alice file.txt把file.txt的所有者改为alice。chown alice:developers file.txt同时修改所有者(alice)和组(developers)。只有root才能修改文件的所有者。

chgrp(change group)只修改文件的组。chgrp developers file.txt把file.txt的组改为developers。普通用户可以把自己的文件转让给其他组,但不能改变所有者。

权限陷阱:错误的权限设置可能导致安全问题。例如,chmod 777 file.txt给所有人所有权限,任何人都能修改或删除该文件。chmod 000 file.txt删除所有权限,即使是所有者也无法访问(可以用chmod恢复)。对于重要文件,最小权限原则是最佳实践——只给予必要的权限。


三、用户与组管理

Linux是多用户系统,理解用户和组的管理是系统管理的基础。

flowchart TB
    subgraph UserMgmt[用户管理]
        direction TB
        AddUser[添加用户<br/>useradd alice]
        DelUser[删除用户<br/>userdel alice]
        ModUser[修改用户<br/>usermod]
        Passwd[设置密码<br/>passwd alice]
    end

    subgraph GroupMgmt[组管理]
        direction TB
        AddGrp[添加组<br/>groupadd dev]
        DelGrp[删除组<br/>groupdel dev]
        AddMem[添加成员<br/>usermod -aG dev alice]
        DelMem[删除成员<br/>gpasswd -d alice dev]
    end

    subgroup Info[查看信息]
        Id[id alice<br/>查看用户信息]
        Groups[groups alice<br/>查看所属组]
        W[w<br/>查看登录用户]
        Cat[/etc/passwd<br/>用户数据库]
    end

    UserMgmt --> Admin[系统管理]
    GroupMgmt --> Admin
    Info --> Admin

    style AddUser fill:#e3f2fd
    style AddGrp fill:#fff9c4
    style Info fill:#c8e6c9

图表讲解:这张图展示了用户和组管理的完整工具链——这些命令构建了Linux的多用户安全架构。

用户管理命令

  • useradd alice创建用户alice,同时在/home创建/home/alice主目录。useradd -m -s /bin/zsh alice创建用户并指定Shell。
  • userdel alice删除用户alice,但不删除主目录。userdel -r alice同时删除用户和主目录。
  • usermod -aG sudo alice把alice添加到sudo组,赋予管理员权限。
  • passwd alice修改alice的密码。root可以修改任何用户的密码,普通用户只能修改自己的密码(需要输入旧密码)。

组管理命令

  • groupadd developers创建组developers。
  • groupdel developers删除组developers。
  • usermod -aG developers alice把alice添加到developers组(-a表示append,追加)。
  • gpasswd -d alice developers从developers组删除alice。

用户信息存储

  • /etc/passwd:用户数据库,每行一个用户,包含用户名、UID、GID、主目录、Shell等信息。密码不存储在这里(存储在/etc/shadow中)。
  • /etc/shadow:影子密码文件,包含加密后的密码,只有root可读。
  • /etc/group:组数据库,包含组名、GID、组成员列表。

查看用户信息

  • id alice显示alice的UID、GID和所属的组。
  • groups alice显示alice所属的所有组。
  • whow显示当前登录的用户。
  • whoami显示当前用户名。

sudo允许普通用户以root身份执行命令。sudo command以root权限执行命令,sudo -i切换到root Shell,sudo su -切换到root环境。sudo的使用被记录在/var/log/auth.log中,审计方便。应该限制sudo的使用范围,只给特定用户必要的权限。


四、进程管理基础

进程是正在运行的程序的实例。管理进程是系统管理员的日常任务。

flowchart TB
    subgraph ProcView[查看进程]
        direction TB
        PS[ps<br/>当前终端的进程]
        PSAux[ps aux<br/>所有进程]
        Top[top<br/>动态监控]
        Htop[htop<br/>交互式监控]
    end

    subgraph ProcCtrl[控制进程]
        direction TB
        Kill[kill<br/>发送信号]
        Killall[killall<br/>按名称杀死]
        Pkill[pkill<br/>按模式匹配]
        CtrlC[Ctrl+C<br/>中断前台进程]
    end

    subgraph ProcBg[后台任务]
        direction TB
        Amp[& 符号<br/>后台运行]
        Jobs[jobs<br/>查看后台任务]
        Fg[fg<br/>调到前台]
        Bg[bg<br/>调到后台]
        NoHup[nohup<br/>忽略SIGHUP]
    end

    ProcView --> Monitor[进程监控]
    ProcCtrl --> Monitor
    ProcBg --> Monitor

    style PS fill:#e3f2fd
    style Top fill:#fff9c4
    style Kill fill:#ef5350
    style Amp fill:#c8e6c9

图表讲解:这张图展示了进程管理的核心操作——这些命令是系统运维的基本工具。

查看进程

  • ps显示当前终端的进程,输出很简洁。
  • ps aux显示所有进程的详细信息。a表示所有终端的进程,u表示用户友好的格式,x表示包括没有控制终端的进程。ps aux | grep nginx查找nginx相关的进程。
  • top动态显示进程信息,按CPU使用率排序,实时更新。按q退出。
  • htop是top的增强版,有彩色界面和鼠标支持,更易用。需要单独安装。

控制进程

  • kill PID向进程发送信号,默认是SIGTERM(15),请求进程终止。kill -9 PID发送SIGKILL(9),强制杀死进程(无法被忽略)。kill -l列出所有信号。
  • killall name按名称杀死进程,如killall nginx杀死所有nginx进程。
  • pkill pattern按模式匹配杀死进程,如pkill -f "python script.py"杀死运行script.py的Python进程。

后台任务

  • command &在后台运行命令,不占用当前终端。
  • jobs列出当前Shell的后台任务。
  • fg %1把任务1调到前台。
  • bg %1让后台暂停的任务1继续运行。
  • nohup command &忽略SIGHUP信号,退出Shell后进程继续运行。输出默认重定向到nohup.out。

五、系统资源监控

监控CPU、内存、磁盘等资源是运维的重要工作。

flowchart TB
    subgraph Resource[资源类型]
        direction TB
        CPU[CPU<br/>top/htop<br/>vmstat]
        Mem[内存<br/>free<br/>vmstat]
        Disk[磁盘<br/>df<br/>du]
        Net[网络<br/>ss<br/>iftop]
        Proc[进程<br/>ps<br/>pstree]
    end

    subgraph Alert[告警阈值]
        CPU_A[CPU &gt; 80%]
        Mem_A[内存 &gt; 90%]
        Disk_A[磁盘 &gt; 85%]
        Load[Load Avg &gt; CPU核数]
    end

    Resource --> Monitor[持续监控]
    Alert --> Monitor

    style CPU fill:#ef5350
    style Mem fill:#ffa726
    style Disk fill:#ffca28
    style Alert fill:#c8e6c9

图表讲解:这张图展示了系统资源监控的维度和告警阈值——持续监控能让你提前发现性能瓶颈。

CPU监控

  • tophtop:实时显示CPU使用率和进程列表。
  • vmstat 1:每秒输出一次CPU、内存、交换空间的统计信息。
  • cat /proc/cpuinfo:显示CPU的详细信息(型号、频率、缓存等)。 -uptime:显示系统运行时间和平均负载(1分钟、5分钟、15分钟)。负载超过CPU核数时,说明系统过载。

内存监控

  • free -h:人类可读格式显示内存使用情况。total总量,used已用,free空闲,available可用。注意Linux的used包含cached和buffers,实际可用内存是free+available。
  • vmstat -s 1:每秒显示内存统计信息。
  • cat /proc/meminfo:显示详细的内存信息。

磁盘监控

  • df -h:显示文件系统使用情况(挂载点、总容量、已用、可用、使用百分比)。关注使用率超过85%的分区。
  • du -sh *:显示当前目录下每个文件/目录的大小(-s汇总,-h人类可读)。du -sh * | sort -h按大小排序。
  • iotop:监控进程的I/O活动,需要root权限。

网络监控

  • ss(socket statistics):显示网络连接状态,替代netstat。ss -tulpn显示所有监听的TCP/UDP端口。
  • iftop:实时显示网络带宽使用情况,按连接显示。
  • nload:简单的网络负载监控器,显示入站和出站流量。

综合监控工具

  • glances:集成了CPU、内存、磁盘、网络、进程的监控工具,有Web界面和告警功能。
  • dstat:多功能系统资源统计工具,可以自定义显示的内容。

六、日志管理与故障排查

当系统出现问题时,日志文件是故障排查的关键信息来源。

flowchart TB
    subgraph Logs[常见日志位置]
        direction TB
        Auth[/var/log/auth.log<br/>认证日志]
        Syslog[/var/log/syslog<br/>系统日志]
        Kern[/var/log/kern.log<br/>内核日志]
        Dmesg[dmesg<br/>启动日志]
        App[/var/log/&lt;app&gt;<br/>应用日志]
    end

    subgraph Tools[日志工具]
        direction TB
        Jctl[journalctl<br/>systemd日志]
        Tail[tail -f<br/>实时跟踪]
        Grep[grep<br/>搜索关键字]
        Less[less<br/>分页查看]
    end

    Logs --> Troubleshoot[故障排查]
    Tools --> Troubleshoot

    style Auth fill:#e3f2fd
    style Syslog fill:#fff9c4
    style Jctl fill:#c8e6c9

图表讲解:这张图展示了Linux日志系统的布局——日志是故障排查的第一手资料。

传统日志系统使用syslogd,日志文件通常在/var/log/下:

  • /var/log/auth.log/var/log/secure:认证相关日志,记录登录、sudo使用等信息。
  • /var/log/syslog:系统日志,包含各种系统事件。
  • /var/log/kern.log:内核日志,记录内核模块和驱动的事件。
  • /var/log/dmesg:系统启动时的内核消息,可以用dmesg命令查看。
  • 应用日志:如/var/log/nginx/(Nginx)、/var/log/apache2/(Apache)、/var/log/mysql/(MySQL)。

systemd日志:使用journald统一管理日志,journalctl查询日志。

  • journalctl:显示所有日志(类似tail -f /var/log/syslog)。
  • journalctl -u ssh:显示sshd服务的日志。
  • journalctl -b:显示本次启动的日志。
  • journalctl --since "1 hour ago":显示最近1小时的日志。
  • journalctl -f:实时跟踪日志(类似tail -f)。

日志分析技巧

  • tail -f /var/log/syslog:实时跟踪日志文件的变化,按Ctrl+C退出。
  • grep ERROR /var/log/app.log:搜索包含ERROR的行。
  • grep "192.168.1.100" /var/log/nginx/access.log:搜索特定IP的访问记录。
  • less /var/log/syslog:分页查看大日志文件,用/搜索、n跳到下一个匹配。

结语

文件权限和进程管理是Linux系统安全的两大支柱。权限模型让多用户环境下的文件共享成为可能,每个用户的数据都被妥善保护。进程管理让系统管理员能够监控系统运行状态,及时发现问题。

掌握这些技能,你将能够:

  • 管理用户和权限:创建用户、分配权限、实现最小权限原则
  • 监控系统状态:了解系统资源使用情况,提前发现性能瓶颈
  • 排查系统故障:通过日志和命令找到问题根源
  • 保障系统安全:合理的权限设置是安全的第一道防线

Linux的强大在于其透明性——一切都可以通过命令行观察和控制。随着你的技能增长,你会发现自己能做的事情越来越多。

接下来的文章将深入软件安装、文本处理、Shell脚本编程等主题,进一步扩展你的Linux工具箱。


常见问题解答

Q1:777权限有什么问题,为什么不推荐使用?

:777(rwxrwxrwx)给所有人(所有者、组、其他人)全部权限,任何用户都能读、写、执行该文件。这违反了最小权限原则,带来严重安全风险。

任何人都能修改或删除文件,可能导致数据泄露或系统被破坏。对于可执行文件,777允许任何人修改代码,可能植入恶意代码。对于目录,777允许任何人在其中创建/删除文件,可能被用作恶意软件的存储地。

推荐使用755(可执行文件)或644(普通文件),给其他人必要的权限,但不要给写权限。只有需要多人协作的目录(如共享文件夹)才考虑777或775。


Q2:如何递归修改目录及其内容的权限?

:使用-R(recursive)选项:chmod -R 755 /path/to/dir递归修改dir及其所有内容的权限。chown也支持-R:chown -R user:group /path/to/dir递归修改所有者。

注意:递归操作会影响大量文件,使用前要确认目录内容。

find命令可以更精确地控制:find /path -type f -exec chmod 644 {} +递归修改文件权限为644,find /path -type d -exec chmod 755 {} +递归修改目录权限为755。+告诉find将找到的文件作为参数传递给chmod。


Q3:僵尸进程是什么,如何处理?

:僵尸进程(Zombie Process)是已经终止但父进程还没有”收尸”(调用wait()获取退出状态)的进程。僵尸进程不占用CPU和内存,但占用进程表项(PID)。

如果父进程没有正确处理子进程的退出,会积累大量僵尸进程,导致系统PID耗尽,无法启动新进程。处理方法:(1)找到僵尸进程的父进程:ps aux | grep Z(僵尸进程的状态是Z);(2)杀掉父进程:kill -9 PPID,父进程死后,僵尸进程会被init(PID 1)收养,init会调用wait()清理它们。

长期解决:修复父进程,正确调用wait()或使用waitpid()循环等待子进程退出。


Q4:如何查看进程的命令行参数?

ps的输出会截断命令行参数,要看到完整的参数行:(1)ps auxf:forest格式,显示进程树和完整命令行;(2)ps -eo pid,cmd:指定输出字段,cmd是完整命令行;(3)cat /proc/PID/cmdline:直接读取进程的命令行参数文件,参数以null分隔;(4)pgrep -a command:查找进程并显示完整命令行。

最常用的是ps aux | grep pattern,但如果命令行很长,可能被截断。ps aux | grep python | tr -s ' ' '\n'可以换行显示完整命令(tr -s ’ ’ ‘\n’把多个空格换成换行)。

推荐使用htopglances,它们显示完整的命令行参数。


Q5:top命令的load average代表什么?

:load average(平均负载)是系统在特定时间间隔内的平均活动进程数,包括正在运行(R)和等待CPU(可中断睡眠,D)的进程。top显示的三个数字分别是1分钟、5分钟、15分钟的平均负载。

负载是否”过高”取决于CPU核心数:如果负载小于CPU核心数,说明系统有能力处理;如果负载大于CPU核心数,说明系统过载。例如,4核CPU的负载为5,意味着平均有1个进程在等待CPU。

持续高负载(> CPU核数)意味着需要升级硬件或优化程序/减少并发。对于单核CPU,负载1.0已经是满负荷;对于4核CPU,负载4.0才是满负荷。


更新时间:2026年3月2日 作者:Linux技术专栏 标签:#文件权限 进程管理 用户管理 系统监控 日志分析