拿到一台新的RHEL9服务器,别急着装环境、配服务。我见过太多人一上手就急着跑安装命令,结果后面遇到"文件找不到""权限报错""备份解不开"这类问题,再回头补课,浪费时间不说,排查思路还容易乱。文件操作和账户权限管理,是Linux日常运维的地基。地基不牢,上面盖什么都晃。
这篇就围绕RHEL9,把"文件查看与查找、文件压缩、账户与权限管理"这三块一次性讲透。不讲屠龙之技,只讲生产环境里天天要用的那些命令和思路。看完你应该能搞清楚:面对一堆文件和日志,怎么快速定位目标的合理姿势是什么;打包压缩时tar、gzip、xz到底该怎么搭配;以及用户权限的设计和排查,哪些坑是新手必踩的。
不管你是刚从CentOS 7切过来的老运维,还是刚开始接触红帽系Linux的初学者,这套内容都值得收着慢慢看。RHEL9和CentOS Stream 9同源,命令体系也一致,你在这上面练会的技能,在别的主流发行版上同样通用。先聊文件查看,这是所有操作的开端。
1. 文件查看:从ls到less,把每一层信息都利用起来
有人觉得文件查看嘛,不就是ls一下、cat一下,有啥好讲的?真不是。生产环境里,你看文件不只是为了"看见",而是为了从文件名、大小、时间、权限这些元数据里,快速判断当前系统的状态。
1.1 ls不止列名字,更要学会看元数据
ls是Linux里用得最多的命令之一,但大部分人只用了个皮毛。裸敲ls,只有文件名,信息量约等于零。真正干活得用ls -l,或者更一步到位,用ls -lh。
ls -lh /var/log/messages -rw-r-----. 1 root root 2.3M Nov 12 09:45 /var/log/messages这一行输出里藏着五个关键信息点:文件类型和权限(-rw-r-----)、硬链接数(1)、属主和属组(root root)、文件大小(2.3M)、最后修改时间(Nov 12 09:45)。这四个字段在排查问题时都非常关键:看到文件大小异常增长,多半是日志没轮转;看到时间戳是几天前的,说明服务可能已经停止写入了。
再加个-d参数,专门看目录本身的信息,而不是目录里的内容:
ls -ld /etc drwxr-xr-x. 141 root root 12288 Nov 12 08:30 /etc目录的"大小"指的是它存储条目所需的元数据空间,不是里面所有文件的总大小,别弄混。想一看到文件就快速判断类型,用file命令比看后缀名靠谱得多,Linux不靠后缀名识别文件,后缀名只是给人看的约定。
1.2 查看文件内容的正确打开方式
cat确实是最直觉的文件查看命令,但它不适合看大文件——cat会把整个文件塞进终端,几万行的日志直接刷屏,找关键信息得靠肉眼,效率为零。而且cat没有任何分页和回看机制,看长文件属于自虐。
生产环境看文件,我的习惯是分场景选择:
- 看小配置文件,比如/etc/hosts、/etc/fstab,用cat就行,干净直接。
- 想边看边搜,用less。它支持上下翻页、/关键词搜索、按n/N跳转上下一个匹配,打开了还能随时按q退出,不用担心终端被刷爆。
- 只关心文件开头,用head,默认显示前10行,常用head -n 30看更多。
- 只关心文件末尾,用tail,默认后10行。配合-f参数可以持续跟踪文件新增内容,这是排查日志的核心手段。
- 想看文件中间某一段,可以用sed -n '100,150p',直接打印第100到150行。
我在看日志的时候最常用的组合是tail加grep管道,比如:
tail -f /var/log/secure | grep "Failed password"这条命令能实时过滤出认证失败的记录,系统被扫描爆破时,屏幕上会一行行刷出攻击来源。RHEL9的日志系统还是以rsyslog为主,/var/log/secure这个路径记录认证相关事件,和以前一样,不用切换到新版systemd-journald生态里去找路。
1.3 生产环境查看技巧和易错提醒
查看文件时有一个很多人忽略的细节:用less打开配置文件后,想确认当前文件的完整路径,敲:f就能看到,包括总行数和当前行号。这个动作在改配置、对接文档时很实用,能避免搞不清自己到底在看哪个文件。
再提醒一个坑:cat二进制文件会导致终端失控。如果你不小心cat了一个二进制文件,屏幕上冒出大量乱码,直接按Ctrl+C,然后执行reset命令恢复终端。这不是什么故障,是这个行为本身就不该发生。
另外,RHEL9默认的ls输出是带颜色的,但颜色区分的是文件类型,不是紧急程度,别过度依赖配色来判断文件。真的想快速过滤类型,用find的-type参数更精准。
2. 文件查找:find命令是主力,也是重灾区
文件查找是运维里的高频动作。找配置文件、找日志、找大文件清理空间,都离不开find。但find又是一个参数极多、坑极多的命令,我单独拿一节来讲透。
2.1 find的核心匹配方式和执行动作
find的基本结构是"路径 + 条件 + 动作"。路径不写默认是当前目录,这个默认行为在生产环境其实有点危险,因为你不知道当前目录到底在哪,容易扫出一大堆无关结果。规范做法是显式写路径,例如find /var/log,把目标锁定住。
按名称查找是最常用的条件,用-name参数,支持通配符:
find /etc -name "*.conf" find /var -name "messages*"注意:find的-name匹配的是文件名,不是路径。想匹配完整路径用-path。这个细节很容易被忽略,结果命令扫不出目标,让人误以为文件不存在。
按类型查找用-type。f是普通文件、d是目录、l是符号链接。按大小查找用-size,加号表示大于,减号表示小于,不加号减号表示精确匹配:
find / -type f -size +1G这条命令在生产环境特别实用。磁盘满了,又不知道哪个文件在吞噬空间,先按大小从大到小扫一遍,再配合du确认,清理效率直接翻倍。find的-size默认单位是512字节块,不过你可以显式加后缀,G、M、K都很直观。
时间维度查找用-mtime,修改时间,单位是天。mtime +7表示7天之前修改过的文件,mtime -1表示最近24小时内修改过的文件:
find /var/log -mtime +30 -exec ls -lh {} \;2.2 exec参数来回传结果,find和grep能协同作战
查找文件只是第一步,真正解决问题往往要对查到的文件做进一步处理。这时就需要-exec参数,它能把find查找到的结果逐个传给后面的命令执行,{}代表当前文件名,以;结尾:
find /var/log -name "*.log" -size +100M -exec truncate -s 0 {} \;这条命令把所有超过100M的.log文件清空为0字节,在磁盘告警但日志服务不能停的时候非常管用。注意,truncate把文件立即置空,属于不可逆操作,执行前一定要确认匹配范围。比truncate更稳妥的做法是先-exec ls -lh做一遍查看,确认没问题再执行真正的清空动作。
find结果和grep配合也很常见。你要找一个含有特定内容的文件,但不知道它在哪个文件里,可以用xargs把查找结果传给grep:
find /etc -type f -name "*.conf" | xargs grep "PasswordAuthentication"这条命令会列出所有包含这个配置项的.conf文件。注意文件名中含空格的场景,直接管道可能出错,稳妥做法是find结尾加-print0,xargs再加-0,用空字符分隔,就不会被空格干扰。RHEL9的find命令支持这个参数,习惯好一点能少踩很多坑。
2.3 两大翻车场景和一个加分用法
find的第一个常见坑是权限导致的不良体验。以普通用户执行find /,会把所有无权访问的目录报成Permission denied,刷一屏错误,真正的结果反而被淹没。要么切换root执行,要么把标准错误丢进黑洞:
find / -xdev -name "passwd" 2>/dev/null这里顺便介绍一个加分用法,-xdev参数限制find不跨文件系统。查根目录时不扫描挂载点和网络存储,既能避免在全盘上百G的文件系统里做无用功,也能避开冗余报错。这个参数在多盘服务器上既提速又减噪。
第二个坑是find的-exec语法写错。很多人把结尾的;写成;或者忘记加空格,直接报语法错误。提醒两件事:分号前必须有转义,因为分号在bash里本身有特殊含义;分号和前面命令之间必须有空格。写的时候多用花括号的转义写法"{}",确保文件路径里带空格也能被正确处理。
3. 文件压缩:tar、gzip、bzip2、xz,挑对组合才算会打备份
文件压缩是备份、传输、归档绕不开的操作。RHEL9里内置了多种压缩工具,各有各的脾气,组合起来用效果最佳。这一节就把打包压缩这件事掰开揉碎说清楚。
3.1 压缩工具原理和取舍
Linux下最常用的打包工具是tar,它本身不做压缩,只负责把一堆文件合并成一个归档文件。压缩是tar调用了外部的压缩程序完成的,不同压缩程序的参数、速度和压缩率差异很大。
- gzip,参数是-z,速度快、压缩率一般,兼容性最好。后缀是.tar.gz或.tgz。日常备份首选它,胜在稳。
- bzip2,参数是-j,压缩率比gzip高,但速度和兼容性稍差。后缀是.tar.bz2。
- xz,参数是-J,压缩率三者中最高,压缩时间也最长。适合不常解压的归档文件。后缀是.tar.xz。
- zstd,RHEL9的tar已经支持--zstd参数,压缩速度和压缩率平衡得更好,是近些年大数据量备份场景里逐渐流行起来的选择。如果目标机器tar版本够新,值得优先考虑。
- 单纯的zip格式,用zip和unzip命令处理。zip最大的优势是跨平台通用,Windows解压无压力。缺点是打包会丢Linux的文件属性。
生产环境备份日志和配置文件,我通常选tar加gzip的组合。压缩率高,解压快,兼容性广,在应急恢复的时候,你能指望的是最通用、最不可能出意外的工具。
3.2 tar的打包和压缩用法
打包压缩一把梭:
tar -czvf /backup/etc-backup.tar.gz /etc这个命令里的c表示创建归档,z表示gzip压缩,v是verbose显示过程,f指定归档文件名。这四个参数是打包压缩的黄金组合,新手把这四个字母记熟,日常够用了。
解压操作恰好相反,把c换成x,表示extract提取:
tar -xzvf /backup/etc-backup.tar.gz -C /tmp/etc-restore-C参数指定解压目标目录,这个非常重要。不指定就解压到当前目录,容易把文件散落一地。我建议养成习惯,解压前先mkdir建一个干净目录,然后-C到里面去,避免污染工作目录。
不对劲的时候,先看看压缩包里有什么,别急着解压。tar的t参数可以只列出内容,不实际解压:
tar -tzf /backup/etc-backup.tar.gz | head这条命令是偷懒神器。拿到一个来路不明的打包文件,先列一下内容,确认没有意外路径(比如绝对路径的/etc、带../的越界路径)再解压,安全系数高一大截。从安全角度说,解压不可信文件前先审查路径,比解压完再排查靠谱得多。
3.3 压缩解压的常见坑
第一个坑是tar解压时报"tar: This does not look like a tar archive"。出现这个提示,大概率是文件后缀名误导了你——比如把zip文件命名为.tar.gz。遇到这种情况,先file命令看真实格式,再选用对应用户命令处理,别硬来。
第二个坑是解压会覆盖同目录下已有文件,而且默认不会警告。tar解压是静默覆盖的,这和其他平台的体验不太一样。我在恢复配置的时候都会先把解压目标目录清空或者用新目录,防止旧版本文件混在新版本文件里,产生一些特别难排查的配置冲突问题。
第三个坑涉及打包时的路径。用绝对路径打包,比如tar -czf /backup/var.tar.gz /var/log,解压时默认会还原到绝对路径,直接覆盖系统目录。这个特性很危险。正确的做法是进入目标目录的上级目录,用相对路径打包,解压时就解压出相对路径,方便随意放置。比如备份/etc时,先cd /,再tar -czf /backup/etc.tar.gz etc,效果一样,但恢复时会落到当前目录的etc子目录里,安全性大幅提升。
4. 账户与权限管理:安全边界的第一道闸门
文件是服务器上的资产,账户和权限决定谁能碰这些资产。RHEL9在账户体系上保留了经典的/etc/passwd和/etc/shadow双文件结构,逻辑清晰,也适合对照着排查用户状态。从创建用户到设置权限,每一步都有讲究。
4.1 账户创建、锁定和删除的完整生命周期
创建用户的命令是useradd,但直接裸用会有隐患。RHEL9默认会为用户创建同名的私有组,主目录会在/home下自动生成,并且会复制/etc/skel里的骨架文件。这个/etc/skel目录值得留意,里面放着.bashrc、.bash_profile这类初始化文件,每个新用户默认都会获得一份。
如果接手了一台存量服务器,又怕新用户权限过大,可以限制用户只能做基本操作:
useradd -s /sbin/nologin -M deploy-s /sbin/nologin告诉系统这个用户不能登录shell,-M表示不创建主目录。这类账户通常用于跑应用服务,不给登录权限,也就减少了被爆破的风险面。RHEL9里nologin的路径就在/sbin/nologin,虚拟终端和SSH登录都会被拒绝,正合用途。
锁定账户用usermod或者passwd都能办到,两者的区别在于:
usermod -L username # 锁定用户,会在/etc/shadow密码字段前加! usermod -U username # 解锁用户,去掉!如果你正在排查"为什么某个用户突然登录不了",先看/etc/shadow里密码字段开头有没有!或*。有这两个符号之一,都说明密码认证是无效状态。用passwd -S username可以看到用户当前的密码状态,省得打开文件人工比对。
删除用户直接userdel,但会留下用户的文件归属地。想连主目录和邮件池一起清掉,用:
userdel -r username在生产环境删除用户前,我强烈建议先把用户锁定而不是直接删除,观察一两个业务周期再删。很多服务是绑定在uid上的,直接把用户删了,后续起服务报错再找人,整个排查链路会变得非常难受。锁定观察一段时间,确认没有引用,再删除才是稳的。
4.2 密码策略和sudo授权那么点事
RHEL9默认采用SHA-512算法存储密码哈希,不以明文保存。你自己也别想着去改密码哈希,正确的改密码姿势是:
passwd username然后按提示输入两次新密码。root用户可以给自己修改,普通用户只能改自己的密码。批量环境里可以用echo配合管道,比如echo "新密码" | passwd --stdin username,但生产环境不建议这么干,因为shell历史记录和进程列表会泄露密码明文。稳妥做法是设置后立刻清空历史记录,或者干脆用交互方式。
sudo授权文件在/etc/sudoers。直接编辑这个文件容易把自己锁在门外,正确姿势是用visudo命令编辑。它会在保存时做语法检查,有语法错误根本存不进去,这是红帽系专门为sudo配置准备的安全网。给用户添加sudo权限,最典型的一段:
username ALL=(ALL) ALL含义是:该用户可以在所有主机上,以所有用户身份,执行所有命令。企业里更精细的做法是限制命令集,比如只允许用systemctl管理某几个服务:
username ALL=(root) /usr/bin/systemctl restart webapp这种最小权限原则,不是说不会用ALL,而是生产环境的管理员授权应该按需分配。出问题的时候,能做的操作面越小,误操作的概率就越低。这一点在等保合规审计里也是加分项。
4.3 权限的魔法数字:读、写、执行和八进制
Linux文件权限是三个维度:针对文件属主(u)、属组(g)、其他用户(o)。每个维度有读(r=4)、写(w=2)、执行(x=1)三件事,用数字累加表示。7=4+2+1是全部权限,5=4+1是读加执行,6=4+2是读加写。这是Linux权限系统的根基,不理解它,后面一切权限相关的排查都无从下手。
查看权限用ls -l,修改权限用chmod。最常用的是数字写法:
chmod 750 /opt/script.sh750表示:属主有全部权限(7),属组成员有读和执行权限(5),其他人无权限(0)。目录的x权限表示能否进入目录,你给一个目录配了读写权限但没有执行权限,别人可以列出目录名却进不去,这种"半通不通"的状态在实际操作中最容易让人困惑。设置目录权限时,务必先给x。
递归修改目录下所有文件用-R参数:
chmod -R 644 /var/www/html但裸用-R有一个问题,它会不分文件类型把所有对象都改成同一个权限。一个web目录里如果有脚本文件需要保持执行权限,这样一刀切会把脚本的执行权限剥掉。更精细的做法是分开处理,对目录用find配合-type d设置755,对文件用-type f设置644:
find /var/www/html -type d -exec chmod 755 {} \; find /var/www/html -type f -exec chmod 644 {} \;这个习惯极其推荐,特别是处理程序集发布包的时候,用这种组合式chmod代替单纯的chmod -R,能避免很多"明明权限看着没问题,但服务就是起不来"的疑难杂症。
4.4 setuid、setgid和粘滞位:少见但必须认识的三个位
除了常规的rwx九位权限,Linux还保留了三个特殊权限位,平时少见,但遇到对应场景时不知道就会卡壳。
setuid(用s表示,数字位是4),作用在可执行文件上。效果是用户执行这个文件时,临时获得文件属主的身份。最典型的例子就是/usr/bin/passwd,普通用户能改密码,靠的就是这个setuid位。RHEL9上查看:
ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 32656 Nov 10 22:55 /usr/bin/passwd看到属主权限位上是s,就是setuid标志。
setgid(数字位是2),作用在目录上时,新创建的文件会自动继承目录的属组。这在多人协作的项目目录里非常有用——不管谁往共享目录里放文件,文件属组都自动归到共享组,不会因为创建者个人属组不同导致批处理无法互相访问。
粘滞位(数字位是1),作用在目录上时,只有文件属主、目录属主或root才能删除目录里的文件。典型的例子是/tmp目录,权限是1777。任何用户都能在/tmp里创建文件,但只能删除自己的,防止A用户删B用户临时文件这类越权操作。设置方法:
chmod +t /shared/temp chmod 1777 /shared/temp这两个写法效果一样。理解这三个位,再看到权限输出里出现s或t的异样标志,你就知道这文件/目录肩负着特殊职责,排查时不会一头雾水。
4.5 ACL授权:比chmod更精细的权限控制
chmod能控制的权限粒度是"属主、属组、其他"三层,但实际协作需求往往更细——比如要让某个不在属组里的用户能编辑一个文件,可又不希望把这个用户加进组里。这时候ACL(访问控制列表)就派上用场了。
给特定用户授权一个文件,用setfacl:
setfacl -m u:zhangsan:rw /data/project/report.txtzhangsan就获得了这个文件的读写权限,但文件属主和属组并不包含他。查看ACL用getfacl:
getfacl /data/project/report.txt控制输出转到最后,能看到user:zhangsan:rw-这样一条附加记录。
RHEL9默认对根文件系统的ACL支持是开启的,所以直接用就行,不需要额外挂载参数。用ACL后,ls -l输出末尾会多一个加号,比如-rw-r-----+,这就是文件带ACL标记的提示。ACL是chmod体制之外的一种灰度补充,适合临时协作和特殊授权场景。日常管理还是优先用标准chmod,不要把ACL用成常态,否则后续权限变更时,ACL记录会成为查漏排查时最容易遗漏的位置。
写在权限管理之后,结合前文做个综合演练
讲了一堆命令,最后串一个实际场景,把文件查找、压缩、权限管理拧成一条线。假设某天磁盘告警,你要找出最大的几个日志文件,备份后清空,并确保新日志能正常写入。
第一步,找出大文件:
find /var/log -type f -size +500M -exec ls -lh {} \;第二步,打包备份:
cd /var/log tar -czf /backup/logs-$(date +%F).tar.gz messages secure文件名带日期是备份的好习惯,恢复时知道时间点,排查时有据可查。
第三步,清空旧日志。这里强调用truncate而不是用rm,因为正在运行的进程持有日志文件的句柄,直接rm掉文件后空间不会立刻释放,还可能导致服务写日志异常。truncate -s 0则将内容清空而保留文件句柄,服务无感,磁盘空间也能腾出来:
truncate -s 0 /var/log/messages /var/log/secure第四步,确认日志服务还活着:
systemctl status rsyslog这一套走完,磁盘空间释放,备份留存,服务不受惊动。整个过程用到的命令就是前文里反复出现的find、tar、truncate,再配合systemctl查看服务状态。没有任何高深技巧,全是基本功的串联。
我对这套流程的个人体会是:好的运维习惯不是会多少冷门命令,而是把常见命令用对场景、用对顺序。find不扫全盘、tar解压不分叉、chmod不改一刀切、特殊权限认识s和t、ACL只做补充不做常态——把这些做到位,你手上的RHEL9服务器就会稳定得多。后面真遇到复杂的权限和故障场景,这套基础足够你不慌不忙地拆解问题,一步步定位原因。