raming

Linux 常用命令

代码9 分钟

一份我自己天天翻的清单:按"要办的事"分组,一条命令一行作用,外加几组真正会敲的组合。

命令这件事,背是背不住的,也不需要背。要背的其实是"这件事在 Linux 里归谁管"——文件、权限、进程、网络、磁盘,五类想清楚了,剩下的都是查。下面这份是我自己放在手边的那一份,按要办的事分组,一条一行作用;最后那几组是我真的会敲出来的形状,比单条命令更值得记。

文件和目录

  • pwd —— 我现在在哪个目录(脚本里定位自己常用)
  • ls -al —— 全部条目,含隐藏文件,带权限和大小
  • ls -alh —— 同上,大小换成人类可读的 K / M / G
  • ls -lt —— 按修改时间倒序,找"刚动过的那个"最快
  • cd - —— 回到上一个目录,比记路径省事
  • mkdir -p a/b/c —— 连中间层一起建,已存在也不报错
  • cp -a 源 目标 —— 递归且尽量保留权限、时间、软链接,备份该用 -a 而不是 -r
  • mv —— 改名和移动是同一条命令
  • rm -rf 目录 —— 递归强删,不可撤销,敲之前先把路径 echo 一遍
  • touch 文件 —— 建空文件,或者把修改时间推到当下
  • ln -s 目标 链接名 —— 软链接;不带 -s 是硬链接,跨分区会失败
  • tree -L 2 —— 两层目录树,看陌生项目的形状

看内容、找东西

  • cat 文件 —— 整个打出来;短文件用,长文件会刷屏
  • less 文件 —— 分页看,/词 搜索、q 退出、G 跳末尾
  • head -n 20 / tail -n 20 —— 头二十行 / 尾二十行
  • tail -f 日志 —— 追着看新写入;tail -F 更狠,日志被切割了也继续跟
  • grep -rn "词" 目录 —— 递归搜,带文件名和行号,日常用得最多的一条
  • grep -i / -w / -c —— 忽略大小写 / 整词匹配 / 只数条数
  • find . -name "*.log" -mtime -7 —— 按名字和时间找文件
  • locate 词 —— 查索引数据库,快,但要先 updatedb
  • which 命令 —— 这个命令实际会执行哪个文件
  • wc -l —— 数行数(wc -c 数字节,wc -w 数词)
  • sort -u / uniq -c —— 去重、数重复;uniq 要先 sort 才准
  • xargs -n1 —— 把前面的输出喂给后面的命令,| xargs rm 这类
  • awk '{print $1,$3}' —— 按列取值,处理日志和表格文本
  • sed -i 's/旧/新/g' 文件 —— 原地批量替换,-i.bak 会先留一份备份

权限和归属

  • ls -l 第一列读法 —— rwx 依次是 属主 / 属组 / 其他人
  • chmod +x 脚本 —— 加执行位,"Permission denied" 十有八九是这个
  • chmod 644 文件 / 755 目录 —— 数字写法:r=4 w=2 x=1
  • chown 用户:组 文件 —— 改归属,通常要 sudo
  • chown -R —— 递归改,改之前先 ls -lR 看清楚范围
  • sudo -i —— 拿一个 root 的登录 shell,比每条命令前加 sudo 更适合连续操作
  • id —— 我到底是谁、在哪些组里
  • umask —— 新建文件的默认权限掩码,解释"为什么新建的脚本没有 x 位"

进程、服务和日志

  • ps aux | grep 名字 —— 找那个进程还在不在
  • top / htop —— 实时看谁在吃 CPU 和内存,htop 要另装但值得
  • kill PID —— 发 TERM,给它机会收尾;kill -9 是硬来,最后再考虑
  • pkill -f "特征串" —— 按命令行特征杀,不用先抄 PID
  • jobs / fg / bg —— 挂到后台的任务再捞回来
  • Ctrl-Z 挂起、Ctrl-C 终止 —— 这两个键比大部分命令更常用
  • systemctl status 服务 —— 服务活着吗、最后一次报错是什么
  • systemctl restart / enable --now —— 重启;开机自启并立刻起
  • journalctl -u 服务 -f —— 追某个服务的日志,--since "10 min ago" 很好用
  • dmesg -T | tail —— 内核怎么说,插拔设备和 OOM 都记在这儿

网络和排查

  • ip a —— 本机地址,ifconfig 那套已经废弃了
  • ss -tlnp —— 哪些端口在听、被哪个进程占着,排查端口冲突第一条
  • ping 主机 —— 通不通、延迟多少(有些机房禁 ICMP,不通不代表挂了)
  • curl -I https://… —— 只要响应头,看状态码和缓存头最快
  • curl -o 文件 -w "%{http_code}\n" … —— 下载并回报状态码,脚本里判断用
  • wget -c 地址 —— 断点续传
  • dig 域名 / dig +short —— 查 DNS,+short 只给答案
  • traceroute 域名 —— 中间在哪一跳断的
  • nc -zv 主机 端口 —— 只测端口通不通,不发数据
  • ssh -p 2222 用户@主机 —— 远程登录;-N -L 本地端口:目标:端口 是转发
  • scp 文件 主机:/路径 —— 跨机拷文件;-r 拷目录
  • rsync -avh --delete 源 目标 —— 增量同步,比 cp 更适合反复执行的备份

磁盘和容量

  • df -h —— 各分区还剩多少,"No space left" 先看这条
  • du -sh * —— 当前目录下每个子项多大,一层层往下找胖子
  • du -ah --max-depth=2 | sort -rh | head —— 直接列出最大的那些
  • lsblk —— 块设备形状,插了盘不认识时看它
  • mount /dev/sdb1 /mnt/x —— 挂上;umount 卸,提示 busy 就去 lsof 找占用
  • sync —— 把缓存刷回盘,拔盘之前心里踏实一点

打包和传输

  • tar czf 包.tar.gz 目录 —— 打包并压缩,记法:create zip file
  • tar xzf 包.tar.gz —— 解开:extract;-C 目录 指定解到哪
  • tar tzf 包.tar.gz —— 不解开,先看看里面是什么
  • gzip 文件 / gunzip 文件.gz —— 单文件压缩
  • zip -r 包.zip 目录 / unzip 包.zip —— 要和 Windows 交换时用 zip 更省事
  • xz -9 文件 —— 压得最小,代价是最慢

时间和系统

  • date —— 当下时间;date -s 改系统时间,一般交给 timedatectl
  • timedatectl set-timezone Asia/Shanghai —— 时区不对,日志时间就全不对
  • uptime —— 开了多久、负载多少
  • uname -a —— 内核版本和架构
  • cat /etc/os-release —— 发行版和版本,装东西之前先确认这个
  • hostnamectl —— 机器叫什么
  • free -h —— 内存和 swap
  • env / echo $PATH —— 环境变量;命令找不到,八成是 PATH
  • history | grep 词 —— 我上次那条命令是怎么敲的;Ctrl-R 是它的交互版

三段真正会敲的组合

看日志,先按时间切一刀再统计谁最多:

bash
journalctl -u nginx --since "1 hour ago" \
| grep -oE 'status=[45][0-9]{2}' \
| sort | uniq -c | sort -rn | head

找占用:磁盘满了,从根往下逐层看谁最大。

bash
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -15

改配置留后路:sed -i 之前先备份,改完再 diff 一眼。

bash
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
diff /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
systemctl restart sshd # 别断开当前会话,另开一个窗口先验证能连上

几条保命的话

  • rm -rf 和 chmod -R 之前,先把同一个路径用 ls 或 echo 跑一遍。看清楚再回车,这条比任何技巧都值钱。
  • 变量没加引号是事故源:rm -rf "$DIR"/cache,万一 DIR 是空的,没引号就变成删 /cache。
  • 生产机上先想"怎么退回来",再想"怎么执行":备份一份只要三秒,恢复一次可能要一整晚。
  • curl | sh 这种安装方式,先把脚本 curl 下来读一遍再跑。
  • 记不住没关系,man 命令 是权威的,tldr 命令 是人话的;我两个都装。
命令是查得到的东西,判断才是记得住的东西。

标签:Linux