今天五条命令,看着简单,但 ls -l 那一行输出里藏着第 6 天(权限)和第 19 天(SELinux)的全部地基。别急着跳过。
$ ls -l / # 根目录下都有啥
$ ls -l /etc | head # 配置文件都在这
$ ls -l /var/log # 日志都在这,最常去
$ pwd # 我现在在哪
$ cd /var/log ; cd ~ # 切目录,~ 是家目录
ls
ls 就是 list,列出目录里有什么。不加参数只给你一堆文件名,加了 -l(long,长格式)才是运维真正要看的东西。
在你虚拟机里敲 ls -l /etc,随便挑一行出来,长这样:
- -rw-r--r--
- 十个字符的权限。第一位是类型,后九位分三组,下面单独讲。
- .
- 这个点表示文件带 SELinux 安全上下文。Ubuntu 上没有,是红帽系独有的标记。如果看到的是加号
+,说明还有额外的 ACL 权限。 - 1
- 硬链接数。目录的话这个数字表示里面有几个子目录。基本不用管。
- root
- 属主——这个文件归谁。
- root
- 属组——归哪个组。
- 158
- 大小,默认单位是字节。这就是为什么要加
-h。 - Aug 12 09:23
- 最后修改时间。排障时这一列极其重要——服务突然出问题,先看配置文件是不是最近被人动过。
- hostname
- 文件名。
那十个字符怎么读
第一个字符是类型:- 普通文件,d 目录(directory),l 软链接(相当于 Windows 的快捷方式)。
后面九个分成三组,每组都是 rwx:
rw- r-- r--
属主 属组 其他人
r = 读 w = 写 x = 执行 - = 没这个权限
所以上面那行的意思是:属主能读能写,属组和其他所有人只能读。
几个组合,运维天天用
$ ls -lt # 按修改时间排,最新的在最上面
$ ls -lh # 大小显示成 4.0K / 2.3M
$ ls -la # 显示隐藏文件(以 . 开头的)
$ ls -lS # 按文件大小排,最大的在前
$ ls -ltr # 按时间排,最新的在最下面(看日志目录常用)
ls -lt 是排障利器。「昨天还好好的,今天服务就挂了」——去相关目录敲一下 ls -lt,最上面那个文件就是最近被改过的,八成就是它。
pwd
print working directory。就一个作用:告诉你当前在哪个目录。
$ pwd
/var/log
看着没用,实际上是防止事故的。你想删 /tmp/lab 下的东西,结果不知道自己在 / 下面,一条 rm -rf * 就出大事了。
这也牵出一个核心概念:
- 绝对路径:从根目录
/开始写全,比如/var/log/messages。在哪儿敲都对。 - 相对路径:从当前位置算起,比如
log/messages。换个地方就错了。
写脚本、写定时任务,一律用绝对路径。这是 crontab 那个「脚本手动跑没问题、定时跑就失败」经典坑的根源。
cd
change directory。四个特殊符号要记住:
$ cd /var/log # 去指定目录
$ cd ~ # 回家目录(等于 cd 不带参数)
$ cd .. # 回上一级
$ cd - # 回上一次待的目录
~ 是当前用户的家目录。你用 devops 登录,~ 就是 /home/devops;用 root,就是 /root。
cd - 很实用:你在 /etc/nginx 改配置,跑去 /var/log 看日志,敲 cd - 立刻弹回 /etc/nginx。两个目录来回切的时候特别顺手。
|
今天那条 ls -l /etc | head,重点不是 head,是中间那根竖线。
管道的意思是:把左边命令的输出,直接喂给右边命令当输入。
/etc 下有一百多个文件,直接 ls -l /etc 会哗啦啦刷屏。你只想看开头几行,就用 head 截断:
$ ls -l /etc | head # 只看前 10 行
$ ls -l /etc | head -20 # 看前 20 行
$ ls -l /etc | tail -5 # 只看最后 5 行
$ ls -l /etc | wc -l # 数一共多少行(多少个文件)
$ ls -l /etc | grep nginx # 只显示名字里带 nginx 的
管道可以一直串下去,这是 Linux 的精髓——每个命令只干一件小事,靠管道组合出复杂功能:
$ du -sh /var/log/* | sort -rh | head -5
└ 列出大小 └ 按大小倒序 └ 取前 5 个
这条你现在不用完全懂,但要建立这个意识:遇到「输出太多看不过来」,就想到管道。
顺带说说 ; 和 &&
$ cd /var/log ; cd ~ # 分号:不管前一条成功没,都执行后一条
$ cd /var/log && ls # 双与:前一条成功了,才执行后一条
写脚本时用 && 更安全。比如 cd /data && rm -rf *,万一 cd 失败了(目录不存在),后面的 rm 就不会执行。
换成 ; 的话,就会在当前目录删个精光。
ls -lh
human-readable,人类可读。
ls -l → 158 1048576 3221225472 ← 字节数,得自己数位数
ls -lh → 158 1.0M 3.0G ← 一眼就知道
这个 -h 在很多命令里通用:df -h、du -sh、free -h 都是同一个意思。养成肌肉记忆:凡是看大小,一律加 -h。
今天拿到两个面试点
答 /var/log。系统日志看 messages,登录记录看 secure。
从头讲到尾:类型 → 三组权限 → 属主属组 → 大小 → 修改时间。
然后补一句:「RHEL 系权限后面那个点是 SELinux 上下文标记。」——这句话一说出来,对方就知道你是在红帽系上真干过,而不是背的教程。
今天的练习
- 在虚拟机里把上面「今天要敲的」五条全敲一遍
- 敲
ls -l /etc/passwd,对着上面的拆解表,把每一段都认出来 - 敲
ls -lt /etc,看看你这台新装的机器最近改过哪些文件 - 用管道组合一次:
du -sh /var/log/* | sort -rh | head -5 - 合上这页,凭记忆说出
/etc、/var/log、/home、/usr各放什么
Day 02 讲文件的增删改查,重点是绝对路径和相对路径的区别——今天 pwd 埋的伏笔,明天会用上。