Linux 常用命令
部署服务、排查线上问题、写 CI 脚本时,免不了要在 Linux 终端里操作。这篇按用途整理最常用的命令和参数,每个命令只列高频用法,详细选项可以用 man <命令> 或 <命令> --help 查看。示例以 Bash 为准,大部分在 macOS 的终端中也能使用(部分参数有差异)。
Linux 遵循文件系统层次结构标准(FHS),所有内容都挂在根目录 / 下:
| 目录 | 用途 |
|---|---|
/bin、/sbin |
基础命令(ls、cp)和系统管理命令(shutdown);很多发行版中它们已链接到 /usr/bin、/usr/sbin |
/boot |
内核和引导程序 |
/dev |
设备文件,如磁盘 /dev/sda、空设备 /dev/null |
/etc |
系统和软件的配置文件,如 /etc/passwd(用户信息)、/etc/shadow(密码哈希)、/etc/nginx/ |
/home |
普通用户的家目录,如 /home/alice |
/root |
root 用户的家目录 |
/lib、/lib64 |
系统程序使用的共享库 |
/media、/mnt |
可移动设备的自动挂载点;手动挂载的临时挂载点 |
/opt |
第三方软件的安装位置 |
/proc、/sys |
内核提供的虚拟文件系统,反映进程和硬件信息,如 /proc/cpuinfo |
/run |
运行时数据,如 PID 文件,重启后清空 |
/srv |
对外提供服务的数据 |
/tmp |
临时文件,所有用户可写,可能在重启时被清空 |
/usr |
用户程序和只读数据,/usr/bin、/usr/lib、/usr/local(本机手动安装的软件) |
/var |
经常变化的数据,如日志 /var/log、缓存、数据库文件 |
/lost+found |
文件系统检查(fsck)时找回的文件碎片 |
/snap 是 Ubuntu 上 snap 包的安装目录,不属于标准目录;/data 之类则是使用者自行创建的。
pwd # 当前所在目录cd /var/log # 切换目录;cd ~ 回家目录,cd - 回上一个目录ls -lah # 列出文件:详细信息、包含隐藏文件、人类可读的大小mkdir -p a/b/c # 递归创建目录touch file.txt # 创建空文件或更新修改时间cp -r src/ dest/ # 复制目录mv old.txt new.txt # 移动或重命名rm file.txt # 删除文件rm -r dir/ # 删除目录ln -s /opt/app/bin/app /usr/local/bin/app # 创建软链接查看与搜索文本
Section titled “查看与搜索文本”cat file.txt # 输出整个文件less file.log # 分页查看:空格翻页,/关键词 搜索,n 下一个,q 退出head -n 20 file.txt # 前 20 行tail -n 50 app.log # 后 50 行tail -f app.log # 持续输出新增内容,看实时日志常用wc -l file.txt # 统计行数grep:按内容搜索
Section titled “grep:按内容搜索”grep "error" app.log # 包含 error 的行grep -i "error" app.log # 忽略大小写grep -n "error" app.log # 显示行号grep -v "debug" app.log # 反选:不包含 debug 的行grep -r "TODO" src/ # 递归搜索目录grep -E "error|warn" app.log # 扩展正则grep -C 3 "Exception" app.log # 同时显示前后 3 行上下文在代码仓库中搜索,ripgrep(命令 rg)速度更快,并且默认忽略 .gitignore 中的文件,可以单独安装使用。
find:按文件名和属性搜索
Section titled “find:按文件名和属性搜索”find . -name "*.log" # 按名称find . -type d -name node_modules # 只找目录find /var/log -mtime -1 # 最近 1 天内修改过的find . -size +100M # 大于 100MB 的文件find . -name "*.tmp" -delete # 找到后删除find . -name "*.js" -exec wc -l {} + # 对结果执行命令其他文本处理
Section titled “其他文本处理”sort file.txt | uniq -c | sort -rn # 统计重复行并按次数排序cut -d ',' -f 1 data.csv # 按逗号分隔取第 1 列awk '{print $1}' access.log # 取每行第 1 个字段sed -n '10,20p' file.txt # 打印第 10 到 20 行sed -i 's/old/new/g' file.txt # 原地替换(macOS 上要写 sed -i '' ...)dos2unix deploy.sh # 把 Windows 换行(CRLF)转为 Unix 换行(LF),需单独安装ls -l 输出的第一列表示文件类型和权限:
-rwxr-xr-- 1 alice dev 1024 Jan 1 10:00 deploy.sh| 位置 | 含义 |
|---|---|
| 第 1 位 | 文件类型:- 普通文件,d 目录,l 软链接 |
| 第 2–4 位 | 所有者(user)权限 |
| 第 5–7 位 | 所属组(group)权限 |
| 第 8–10 位 | 其他人(others)权限 |
r、w、x 分别表示读、写、执行,对应数字 4、2、1,三者相加就是一组权限的数字表示。上例为 754。
对目录来说,含义略有不同:r 表示能列出目录内容,w 表示能在目录中创建、删除、重命名文件,x 表示能进入目录(cd)和访问其中的文件。
chmod 755 deploy.sh # rwxr-xr-xchmod +x deploy.sh # 给所有人加执行权限chmod u+x,g-w file # 所有者加执行,组去掉写chmod -R 644 dir/ # 递归修改(注意会把目录的 x 也去掉,通常不是想要的结果)chown alice:dev file # 修改所有者和组chown -R www-data:www-data /var/www/site常见权限:脚本 755,普通文件 644,私钥文件 600(ssh 要求私钥只能被所有者读写)。
sudo 以 root 身份执行命令。不要为了省事给目录 777 权限,那意味着任何用户都能修改其中的文件。
ps aux # 查看所有进程ps aux | grep node # 找到 node 相关进程pgrep -fl node # 更直接地按名称找进程top # 实时查看 CPU、内存占用,按 q 退出;htop 更友好(需安装)kill 12345 # 发送 SIGTERM,请求进程正常退出kill -9 12345 # 发送 SIGKILL,强制结束,进程无法做清理pkill -f "node server.js" # 按命令行匹配结束进程优先使用 kill(SIGTERM),给程序处理退出逻辑的机会,进程无响应时才用 kill -9。
node server.js & # 放到后台,终端关闭时可能被结束nohup node server.js > app.log 2>&1 & # 忽略挂断信号,退出终端后继续运行jobs # 查看当前终端的后台任务fg %1 # 把任务调回前台nohup 只适合临时使用。长期运行的服务应交给 systemd 或 PM2 这类进程管理工具,它们能在崩溃后自动重启、开机自启,见 Linux 软件安装与管理。
curl https://example.com # 发送 GET 请求curl -I https://example.com # 只看响应头curl -X POST -H "Content-Type: application/json" \ -d '{"name":"test"}' https://api.example.com/userscurl -o file.zip https://example.com/a.zip # 下载保存为文件curl -L https://example.com # 跟随重定向curl -v https://example.com # 打印详细过程,排查 TLS、头部问题
ping -c 4 example.com # 测试连通性,发送 4 个包ss -tlnp # 查看监听中的 TCP 端口及对应进程ss -tnp # 查看已建立的 TCP 连接lsof -i :3000 # 查看谁占用了 3000 端口dig example.com # 查询 DNS 解析ss 是 netstat 的现代替代,很多新系统默认不再安装 netstat。旧笔记中的 netstat -tanlp 用于查看 TCP 连接和监听端口及其所属进程(并非“查看正在运行的进程”),对应的新写法就是 ss -tanp。查看端口对应的进程信息通常需要 root 权限。
df -h # 各分区的容量和使用率du -sh * # 当前目录下每一项占用的空间du -sh node_modules # 某个目录的总大小du -h --max-depth=1 /var | sort -h # 一级子目录按大小排序(macOS 用 -d 1)free -h # 内存使用情况磁盘满时,常见的罪魁祸首是 /var/log 下的日志、Docker 镜像和容器(docker system df 查看)、构建缓存。
tar 用于打包,结合 gzip 等压缩:
tar -czvf dist.tar.gz dist/ # 打包并用 gzip 压缩tar -xzvf dist.tar.gz # 解压到当前目录tar -xzvf dist.tar.gz -C /opt/app # 解压到指定目录tar -tzvf dist.tar.gz # 只查看内容不解压参数含义:c 创建、x 解包、t 列出、z 使用 gzip、v 显示过程、f 指定文件名(f 后面紧跟文件名)。新版 GNU tar 解压时可以自动识别压缩格式,-xf 即可。
zip 格式:
zip -r site.zip dist/unzip site.zip -d target/管道与重定向
Section titled “管道与重定向”每个进程默认有三个标准流,用文件描述符表示:
| 编号 | 名称 | 默认指向 |
|---|---|---|
| 0 | 标准输入 stdin | 键盘 |
| 1 | 标准输出 stdout | 终端 |
| 2 | 标准错误 stderr | 终端 |
cmd > out.txt # 标准输出写入文件(覆盖)cmd >> out.txt # 追加cmd 2> err.txt # 标准错误写入文件cmd > all.log 2>&1 # 标准输出和标准错误都写入 all.logcmd &> all.log # Bash 中的简写,效果同上cmd > /dev/null 2>&1 # 丢弃所有输出cmd < input.txt # 从文件读取标准输入cmd1 | cmd2 # 管道:cmd1 的标准输出作为 cmd2 的标准输入cmd | tee out.txt # 同时输出到终端和文件2>&1 的意思是“把 2 号描述符重定向到 1 号当前指向的地方”,所以顺序很重要:> file 2>&1 两者都进文件;2>&1 > file 则标准错误仍输出到终端。
/dev/null 是一个空设备,写入它的数据都会被丢弃。
组合示例:
# 统计访问日志中请求最多的 10 个 IPawk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10echo $PATH # 查看变量env # 列出所有环境变量export NODE_ENV=production # 设置并导出给子进程NODE_ENV=test npm test # 只对这一条命令生效unset NODE_ENV # 删除变量which node # 查看命令的实际路径export 只在当前 shell 会话中有效。要永久生效,写入 shell 的配置文件:Bash 是 ~/.bashrc(登录 shell 读 ~/.bash_profile 或 ~/.profile),Zsh 是 ~/.zshrc。修改后执行 source ~/.bashrc 立即生效。
PATH 决定了 shell 去哪些目录查找命令,追加目录时保留原值:
export PATH="$HOME/.local/bin:$PATH"ssh 与 scp
Section titled “ssh 与 scp”ssh user@192.0.2.10 # 登录远程服务器ssh -p 2222 user@host # 指定端口ssh user@host "df -h" # 远程执行一条命令
ssh-keygen -t ed25519 -C "me@example.com" # 生成密钥对ssh-copy-id user@host # 把公钥添加到服务器的 ~/.ssh/authorized_keys配置了公钥后即可免密登录。在 ~/.ssh/config 中为常用服务器起别名:
Host web HostName 192.0.2.10 User deploy Port 22 IdentityFile ~/.ssh/id_ed25519之后 ssh web 即可登录。
文件传输:
scp dist.tar.gz web:/opt/app/ # 上传scp web:/var/log/app.log ./ # 下载scp -r dist/ web:/opt/app/ # 上传目录rsync -avz --delete dist/ web:/var/www/site/ # 增量同步,部署静态资源常用rsync 只传输变化的部分,大目录反复同步时比 scp 快很多。注意 dist/ 带斜杠表示同步目录里的内容,不带斜杠表示同步目录本身。
安全建议:服务器上关闭密码登录、禁止 root 直接登录,只允许密钥认证;私钥文件权限设为 600。
- 记住几个关键目录:配置在
/etc,日志在/var/log,自装软件在/usr/local或/opt,临时文件在/tmp。 - 查日志用
tail -f、less、grep,找文件用find,统计用管道组合sort、uniq、awk。 - 权限位
rwx对应 4、2、1,常用755、644、600,避免777。 - 结束进程优先
kill(SIGTERM),长期服务交给 systemd 或 PM2,而不是nohup。 - 查端口用
ss -tlnp或lsof -i,2>&1的顺序决定重定向结果。 - 远程操作用密钥登录的 ssh,传文件用
scp或rsync。