← 回目录
01 Week 01 · 先能动手

这台机器的东西都放在哪

先搞清楚目录结构和 ls。这是地基——后面所有排错,说到底都是「去某个目录,看某个文件」。

今天五条命令,看着简单,但 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--. 1 root root 158 Aug 12 09:23 hostname
-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换个地方就错了。
现在记住,第 25 天会用到

写脚本、写定时任务,一律用绝对路径。这是 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 的精髓——每个命令只干一件小事,靠管道组合出复杂功能:

串三个命令:找出最大的 5 个日志
$ du -sh /var/log/* | sort -rh | head -5
  └ 列出大小      └ 按大小倒序  └ 取前 5 个

这条你现在不用完全懂,但要建立这个意识:遇到「输出太多看不过来」,就想到管道。

顺带说说 ;&&

分号 vs 双与
$ cd /var/log ; cd ~     # 分号:不管前一条成功没,都执行后一条
$ cd /var/log && ls      # 双与:前一条成功了,才执行后一条
真实发生过的事故

写脚本时用 && 更安全。比如 cd /data && rm -rf *,万一 cd 失败了(目录不存在),后面的 rm 就不会执行。

换成 ; 的话,就会在当前目录删个精光。

ls -lh

那个 h 是什么

human-readable,人类可读。

加不加 h 的区别
ls -l   →  158   1048576   3221225472    ← 字节数,得自己数位数
ls -lh  →  158   1.0M      3.0G          ← 一眼就知道

这个 -h 在很多命令里通用:df -hdu -shfree -h 都是同一个意思。养成肌肉记忆:凡是看大小,一律加 -h

今天拿到两个面试点

能说出口才算学会
「日志一般在哪看?」

/var/log。系统日志看 messages,登录记录看 secure

「解释一下 ls -l 的输出」

从头讲到尾:类型 → 三组权限 → 属主属组 → 大小 → 修改时间。

然后补一句:「RHEL 系权限后面那个点是 SELinux 上下文标记。」——这句话一说出来,对方就知道你是在红帽系上真干过,而不是背的教程。

今天的练习

敲完再走 · 约 10 分钟
  • 在虚拟机里把上面「今天要敲的」五条全敲一遍
  • ls -l /etc/passwd,对着上面的拆解表,把每一段都认出来
  • ls -lt /etc,看看你这台新装的机器最近改过哪些文件
  • 用管道组合一次:du -sh /var/log/* | sort -rh | head -5
  • 合上这页,凭记忆说出 /etc/var/log/home/usr 各放什么
明天预告

Day 02 讲文件的增删改查,重点是绝对路径和相对路径的区别——今天 pwd 埋的伏笔,明天会用上。