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所属的所有组。who或w显示当前登录的用户。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 > 80%] Mem_A[内存 > 90%] Disk_A[磁盘 > 85%] Load[Load Avg > CPU核数] end Resource --> Monitor[持续监控] Alert --> Monitor style CPU fill:#ef5350 style Mem fill:#ffa726 style Disk fill:#ffca28 style Alert fill:#c8e6c9
图表讲解:这张图展示了系统资源监控的维度和告警阈值——持续监控能让你提前发现性能瓶颈。
CPU监控:
top或htop:实时显示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/<app><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’把多个空格换成换行)。
推荐使用htop或glances,它们显示完整的命令行参数。
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才是满负荷。