一个SRE的碎碎念,写给还在对着黑框框发愣的你
我刚接触Linux那会儿,对着终端不知道该干啥,脑子里全是问号。
后来干了几年SRE,天天跟Linux服务器打交道,才慢慢明白:这些"基础命令"用好了,真的能救命。今天把最常用的那一批,用人话给你讲一遍。
Linux的命令行有一点跟Windows不一样:它不告诉你完整路径。
你在Windows的命令行里看到的是 C:\Users\你的名字\Documents>,路径一目了然。但Linux给你看的是 [root@server documents]#,只告诉你当前文件夹叫什么,不告诉你它在哪。
这就容易迷路。所以第一个技能:学会问自己"我在哪"。
pwd——我现在在哪?
[root@server ~]# pwd
/root
pwd 就是"打印当前路径",一敲就知道自己站在文件系统的哪个位置。养成习惯,做任何重要操作之前先敲一下。
cd——怎么走到我想去的地方?
cd 有好几种走法,对应不同场景:
# 1. 用完整路径直接跳过去(绝对路径)
# 不管你现在在哪,都能准确到达
cd /etc/nginx/
# 2. 从当前位置出发(相对路径)
# 现在在 /root,想去 /root/logs,不用写全
cd logs/
# 3. 回家(家目录)
cd# 或者 cd ~
# 不管你在哪个犄角旮旯,一下子回到家目录
# 4. 回上一级
cd ..
# 5. 返回上一次所在的目录
cd -
# 这个特别好用,在两个目录之间来回切换时,省事
上手练一练:
cd /etc # 跳到etc目录
pwd# 确认:/etc
cd nginx # 进nginx子目录
pwd# 确认:/etc/nginx
cd - # 返回上一个目录(/etc)
pwd# 确认回来了
cd# 回家目录
pwd# 确认:/root
进了一个目录,先看看里面有什么。ls 就是干这个的。
最常用的几种组合:
# 最简单,看当前目录有哪些东西
ls
# 加 -l,看详细信息(权限、大小、修改时间)
ls -l
# 简写:ll(大部分系统都支持这个别名)
ll
# 加 -h,文件大小变成人能看懂的格式(KB/MB/GB)
ll -h
# 加 -a,显示隐藏文件(以.开头的文件)
ll -a
# 组合使用(最常用的组合)
ll -ah
怎么看 ll 输出的内容:
[root@server ~]# ll /etc/nginx/
-rw-r--r--. 1 root root 643 6月 10 nginx.conf
drwxr-xr-x. 2 root root 40 6月 10 conf.d
从左往右:
- 是普通文件,d 是目录)按需排序,快速找到想要的:
# 按修改时间排序,最新的在最上面
# ——排查问题时看"哪个文件最近动过"
ll -t /var/log/
# 按文件大小排序,最大的在最上面
# ——磁盘快满了,找大文件
ll -Sh /var/log/
# 加 -r 反转顺序(配合上面两个用)
ll -tr /var/log/ # 最老的在最上面
ll -Srh /var/log/ # 最小的在最上面
mkdir:建目录
# 建一个目录
mkdir mydir
# 建多层目录(最常用的用法)
# 如果中间层不存在,-p 会自动创建
mkdir -p a/b/c
# 加 -v 看创建过程(适合新手确认有没有建成功)
mkdir -pv a/b/c
# 输出:
# mkdir: 已创建目录 "a"
# mkdir: 已创建目录 "a/b"
# mkdir: 已创建目录 "a/b/c"
记住 -p 的两个好处:
一是能建多层目录;二是目录已存在也不报错。写自动化脚本时这很重要,不然脚本跑第二次就报错了。
touch:建空文件
# 建一个空文件
touch hello.txt
# 一次建多个
touch a.txt b.txt c.txt
# 注意:touch 不能帮你建路径,路径里的目录得提前存在
# 下面这样会报错,因为 mydir 不存在
touch mydir/hello.txt # 错误!
# 正确做法:先建目录,再建文件
mkdir -p mydir
touch mydir/hello.txt
mv 做两件事:移动文件、给文件改名。
改名:
# 把 old.txt 改名为 new.txt
mv old.txt new.txt
移动文件:
# 把当前目录的 config.txt 移动到 /etc/myapp/
mv config.txt /etc/myapp/
# 一次移动多个文件到某个目录
mv a.txt b.txt c.txt /tmp/
移动目录:
# 和移动文件一样,直接写目录名
mv mydir/ /data/
一个实用技巧——带时间戳备份:
# 修改配置前,先备份一份
mv nginx.conf nginx.conf.bak_$(date +%Y%m%d)
# 变成:nginx.conf.bak_20250614
# 回滚的时候知道是哪天的备份
复制文件:
# 把 a.txt 复制到 /tmp/
cp a.txt /tmp/
# 复制过去同时改名
cp a.txt /tmp/b.txt
复制目录(必须加 -r):
# 普通复制,不加 -r 会报错
cp mydir /tmp/ # 报错:略过目录
# 加 -r,递归复制整个目录
cp -r mydir /tmp/
备份时用 -a(重要):
# -a 等于 -r 加上"保留所有属性"
# 权限、所有者、时间戳、软链接全都原样保留
cp -a /etc/nginx/ /backup/nginx_$(date +%Y%m%d)/
普通的 -r 复制后,文件的权限可能会变。如果你备份的是配置文件或者脚本,权限变了可能导致服务启动失败。所以**备份一律用 -a**,不留隐患。
rm 这个命令,我要单独说清楚,因为用错了没有后悔药。
删除文件:
# 删除文件,会提示确认
rm hello.txt
# 系统问你:是否删除?输入 y 确认,n 取消
# 强制删除,不提示(小心用)
rm -f hello.txt
# 删除所有 txt 文件(通配符)
rm -f *.txt
删除目录(必须加 -r):
# 删目录加 -r
rm -r mydir/
# 强制删除整个目录,不提示(危险操作,用之前三思)
rm -rf mydir/
通配符有坑,一定要先确认:
rm -rf /data /logs 如果中间多了个空格,变成 rm -rf /data 和 /logs,会把两个目录都删掉。
一个安全习惯:执行前先用 echo 预演一下,看看会删到哪些文件:
# 先不删,只看看 *.log 匹配了哪些文件
echo rm -f /var/log/*.log
# 确认没问题,再去掉 echo 真正执行
rm -f /var/log/*.log
cat 最直接,把文件内容全打出来。
# 看文件内容
cat /etc/hostname
# 显示行号(排查问题时很有用)
cat -n /etc/nginx/nginx.conf
# 把两个文件合并输出
cat a.txt b.txt
# 把合并结果写到新文件
cat a.txt b.txt > combined.txt
cat 适合看小文件。 文件很大时(比如几千行的日志),cat 会把终端刷满,根本没法看。这时候用 less 或者 head/tail——但那是后话了。
echo 最简单的用法是在终端打印内容:
echo Hello World
# 输出:Hello World
# 输出变量的值
echo$PATH
# 输出环境变量 PATH 的内容
写文件(重定向):
# > 写入(会清空原有内容)
echo"server_name localhost;" > /tmp/test.conf
# >> 追加(保留原有内容,写到末尾)
echo"listen 80;" >> /tmp/test.conf
在输出里执行命令(很好用):
# 用 $(命令) 的语法,在输出里嵌入命令结果
echo"现在时间是:$(date)"
# 输出:现在时间是:2025年06月14日 09:30:00
# 经典用法:输出带时间戳的信息
echo"备份完成 $(date '+%Y-%m-%d %H:%M:%S')" >> backup.log
快速生成序列(不常见但很好用):
echo {a..z} # a b c d ... z
echo {1..100} # 1 2 3 ... 100
echotest{1..5} # test1 test2 test3 test4 test5
date:查看和格式化时间
# 直接看当前时间
date
# 2025年 06月 14日 星期六 09:30:00 CST
# 只要日期
date +%F
# 2025-06-14
# 只要时间
date +%T
# 09:30:00
# 日期+时间(空格要加引号)
date "+%F %T"
# 2025-06-14 09:30:00
# 获取昨天/明天的日期
date -d "-1 day" +%F # 昨天
date -d "+1 day" +%F # 明天
date 在脚本里最常见的用法是给文件名加时间戳:
# 备份文件名带上日期,不会覆盖之前的备份
cp config.yaml config.yaml.$(date +%Y%m%d_%H%M%S)
# 变成:config.yaml.20250614_093000
ntpdate:校准服务器时间
服务器时间如果不准,会引发各种奇怪问题(Token失效、日志时间乱序、定时任务跑偏)。
# 从阿里云时间服务器同步时间
ntpdate ntp1.aliyun.com
# 查看当前时间状态
timedatectl status
timedatectl status 的输出里有几个关键字段:
NTP synchronized: yes ← 时间同步开着
Time zone: Asia/Shanghai ← 时区是否正确
如果时区不对:
timedatectl set-timezone Asia/Shanghai
命令太长?设个别名。
# 设置别名(当前会话有效)
alias ll='ls -lh --color=auto'
alias cls='clear'
# 查看所有别名
alias
# 取消某个别名
unalias cls
让别名永久生效:
# 编辑 ~/.bashrc
vim ~/.bashrc
# 在文件最后加上你的别名,比如:
# alias ll='ls -lh --color=auto'
# 保存后,让配置立即生效
source ~/.bashrc
pwd | |
cd 路径 | |
cd | |
cd .. | |
cd - | |
ll | |
ll -h | |
ll -t | |
ll -Sh | |
mkdir 目录名 | |
mkdir -p a/b/c | |
touch 文件名 | |
cp 源 目标 | |
cp -r 源 目标 | |
cp -a 源 目标 | |
mv 源 目标 | |
rm -f 文件名 | |
rm -rf 目录名 | |
cat 文件名 | |
cat -n 文件名 | |
echo 内容 | |
echo 内容 > 文件 | |
echo 内容 >> 文件 | |
date | |
date "+%F %T" | |
ntpdate ntp1.aliyun.com | |
timedatectl status | |
alias 别名='命令' | |
~/.bashrc 后 source |
命令本身不难,难的是用顺了。
建议你今天就打开一台Linux(云服务器或者虚拟机都行),把这篇文章里的命令挨个敲一遍。不用全记住,手熟了自然就记住了。
记住一个原则:不熟悉的命令,在生产环境上先搞清楚它干什么,再动手。pwd 确认位置,ls 确认内容,然后再操作——这三步习惯养好了,能避免90%的低级失误。
觉得有用就转给需要的人,学Linux的路上少走弯路。