Linux 常用命令
一份我自己天天翻的清单:按"要办的事"分组,一条命令一行作用,外加几组真正会敲的组合。
命令这件事,背是背不住的,也不需要背。要背的其实是"这件事在 Linux 里归谁管"——文件、权限、进程、网络、磁盘,五类想清楚了,剩下的都是查。下面这份是我自己放在手边的那一份,按要办的事分组,一条一行作用;最后那几组是我真的会敲出来的形状,比单条命令更值得记。
文件和目录
pwd—— 我现在在哪个目录(脚本里定位自己常用)ls -al—— 全部条目,含隐藏文件,带权限和大小ls -alh—— 同上,大小换成人类可读的 K / M / Gls -lt—— 按修改时间倒序,找"刚动过的那个"最快cd -—— 回到上一个目录,比记路径省事mkdir -p a/b/c—— 连中间层一起建,已存在也不报错cp -a 源 目标—— 递归且尽量保留权限、时间、软链接,备份该用-a而不是-rmv—— 改名和移动是同一条命令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 词—— 查索引数据库,快,但要先updatedbwhich 命令—— 这个命令实际会执行哪个文件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=1chown 用户:组 文件—— 改归属,通常要sudochown -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 "特征串"—— 按命令行特征杀,不用先抄 PIDjobs/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 filetar xzf 包.tar.gz—— 解开:extract;-C 目录指定解到哪tar tzf 包.tar.gz—— 不解开,先看看里面是什么gzip 文件/gunzip 文件.gz—— 单文件压缩zip -r 包.zip 目录/unzip 包.zip—— 要和 Windows 交换时用 zip 更省事xz -9 文件—— 压得最小,代价是最慢
时间和系统
date—— 当下时间;date -s改系统时间,一般交给timedatectltimedatectl set-timezone Asia/Shanghai—— 时区不对,日志时间就全不对uptime—— 开了多久、负载多少uname -a—— 内核版本和架构cat /etc/os-release—— 发行版和版本,装东西之前先确认这个hostnamectl—— 机器叫什么free -h—— 内存和 swapenv/echo $PATH—— 环境变量;命令找不到,八成是 PATHhistory | 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.baksed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_configdiff /etc/ssh/sshd_config.bak /etc/ssh/sshd_configsystemctl restart sshd # 别断开当前会话,另开一个窗口先验证能连上几条保命的话
rm -rf和chmod -R之前,先把同一个路径用ls或echo跑一遍。看清楚再回车,这条比任何技巧都值钱。- 变量没加引号是事故源:
rm -rf "$DIR"/cache,万一DIR是空的,没引号就变成删/cache。 - 生产机上先想"怎么退回来",再想"怎么执行":备份一份只要三秒,恢复一次可能要一整晚。
curl | sh这种安装方式,先把脚本curl下来读一遍再跑。- 记不住没关系,
man 命令是权威的,tldr 命令是人话的;我两个都装。
命令是查得到的东西,判断才是记得住的东西。