适用读者:常年 cmd / PowerShell / RDP / 服务管理器组合拳,现在要面对 Linux 服务器的运维开发。
本文以 Linux(bash/zsh)为准;macOS 终端同源,九成命令通用(仅包管理不同)。
一、先换脑子:三个思维差异
1. 只有一棵目录树,没有盘符。 所有路径从 / 出发。C:\Users\xxx → /home/xxx,移动硬盘也不是 D:,而是挂载在 /media 或 /mnt 下。几个约定俗成的目录先记住:/etc 配置、/var 日志与可变数据、/home 家目录、/tmp 临时文件、/opt 第三方软件。家目录写作 ~,cd 不带参数回家,cd - 回上一个目录。
2. 一切皆文件。 配置是文本,日志是文本,连 /proc 下的进程信息、/dev 下的设备都是文件。这决定了 Linux 运维的基本功是:看文本、搜文本、切文本。
3. 管道里流的是文本。 PowerShell 管道传的是结构化对象,bash 管道传的是纯文本行。所以 Linux 的哲学是每个工具只做一件事(列、搜、切、排),用管道串起来——由此诞生了三剑客 grep / sed / awk,后面细讲。
外加几条肌肉记忆要重置:大小写敏感(App.log 和 app.log 是两个文件);路径分隔符是正斜杠;能不能执行看权限位、不看 .exe 后缀;Tab 补全和 ↑ 历史一样有且更顺手;man 命令 是内置说明书。
二、文件与目录:每天摸的命令
| 任务 | Windows | Linux |
|---|---|---|
| 列目录 |
dir / Get-ChildItem
|
ls -lh |
| 当前路径 | (cd 不带参数) |
pwd |
| 复制 |
copy / Copy-Item
|
cp -r(目录要加递归) |
| 移动 / 重命名 |
move、ren
|
mv(一个命令两件事) |
| 删除 |
del、rd
|
rm(-r 递删目录) |
| 建目录 | md |
mkdir -p(多级一次建) |
| 看文件 |
type、more
|
cat(短文件)、less(长文件,q 退出,/ 搜索) |
三条安全须知:
-
rm没有回收站。rm -rf路径写错就是事故,回车前看一眼;生产机器上宁可先mv到/tmp。 - 通配符
*照用,但先ls *.log确认列表,再rm *.log。 - 目录操作默认会拦一道让你确认,但加
-f就不拦了——-f是「我知道我在干什么」的承诺。
三、查看与搜索:日志是生命线
| 任务 | Windows | Linux |
|---|---|---|
| 实时盯日志 | Get-Content -Wait |
tail -f app.log |
| 按内容找 | findstr /s |
grep -rn "关键字" . |
| 按文件名找 | dir /s /b *.log |
find . -name "*.log" |
| 按时间找 | — | find /var/log -mtime +7 |
高频组合:
tail -f /var/log/nginx/error.log # 实时滚动日志
grep -rn "ERROR" /var/log/myapp/ # 递归搜,-n 带行号
find . -name "*.log" -mtime +7 -delete # 删 7 天前的日志
四、权限:从 UAC 到 rwx
ls -l 的第一列看懂就全通了:
-rwxr-xr-- 1 app ops 4096 Nov 7 11:32 run.sh
三段 rwx 分别对应 属主(app)/ 组(ops)/ 其他人;记忆法 r=4 w=2 x=1。755 = 属主可写、其他人可执行;644 = 常见配置文件。
| 任务 | Windows | Linux |
|---|---|---|
| 提权执行 |
runas / UAC 弹窗 |
sudo 命令 |
| 改权限 |
icacls / attrib
|
chmod 755 file、chmod +x script.sh
|
| 改属主 | icacls /takeown |
chown app:ops file |
核心区别:Linux 下「管理员」不是身份而是单次借来的能力,sudo 一次只借一条命令,比整个窗口提权精细。新手第一坑:跑脚本报 Permission denied → chmod +x 一下就好,和 Windows「双击没反应去查关联」完全是两种排查思路。
五、进程与服务
进程侧(任务管理器 → 命令行):
| 任务 | Windows | Linux |
|---|---|---|
| 列进程 | tasklist |
ps aux(配 grep 用) |
| 找进程 | tasklist | findstr python |
pgrep -f app.py |
| 结束进程 | taskkill /PID 1234 /F |
kill 1234(优雅)/ kill -9(强杀) |
| 实时监控 | 任务管理器 |
top(或更舒服的 htop) |
kill 不带 -9 是「请求退出」(相当于点窗口的 ×),-9 是内核直接强杀——先礼后兵。
服务侧是最值得花十分钟系统学的,因为日常频率极高:
| 任务 | Windows | Linux(systemd) |
|---|---|---|
| 服务列表 | services.msc |
systemctl list-units --type=service |
| 看状态 | sc query nginx |
systemctl status nginx |
| 启 / 停 / 重启 |
net start / sc stop
|
systemctl start/stop/restart nginx |
| 开机自启 | 服务属性 → 启动类型 | systemctl enable nginx |
| 启动并设自启 | 手工两步 | systemctl enable --now nginx |
| 看服务日志 | 事件查看器里筛 | journalctl -u nginx -f |
| 全系统日志 | 事件查看器 | journalctl -xe --since "1 hour ago" |
六、前后台与作业控制:Ctrl+Z 不只是暂停
Windows 上命令要么前台跑完、要么做成服务;Linux shell 里每个命令是一个「作业」,可以挂起、切后台、再切回:
python app.py # 前台跑,Ctrl+C 退出
^Z # 挂起(suspended):进程活着但冻结,不占 CPU
jobs # 看作业列表,[1] 是编号
bg %1 # 转入后台继续跑
fg %1 # 再拉回前台
kill -9 %1 # 按作业号杀
python app.py & # 一启动就放后台
注意挂起的进程是冻结的,对普通信号没反应,要杀它得 kill -9(内核回收不经过进程自己)。
SSH 场景必备:直接断开 SSH,前台进程会收到 SIGHUP 被杀。想「人走任务留」:
nohup python app.py > app.log 2>&1 &
-
nohup:对挂断信号免疫 -
> app.log 2>&1:标准输出和错误都写进日志(2>&1死记即可) -
&:丢后台
更现代的做法是写个 systemd unit 托管,或进 tmux(终端复用,断线重连现场还在),但 nohup 一把梭仍是老运维的条件反射。
七、网络诊断
| 任务 | Windows | Linux |
|---|---|---|
| 网卡 / IP | ipconfig /all |
ip a |
| 路由表 | route print |
ip r |
| 监听端口 | netstat -ano |
ss -tlnp(-p 直接带进程名) |
| 谁占了 8080 | netstat -ano | findstr :8080 |
ss -tlnp | grep 8080 |
| 路由追踪 | tracert |
traceroute / mtr
|
| DNS 解析 | nslookup |
dig +short example.com |
| 端口连通性 | Test-NetConnection host -Port 443 |
nc -zv host 443 |
| HTTP 调试 | Invoke-WebRequest |
curl -I、curl -v
|
curl 是 Linux 运维的瑞士军刀:-I 只看响应头,裸 curl host:port 探活,POST 也发得动。
八、包管理:这块 Windows 落后好几年
winget / choco 终于有了,但在 Linux 上包管理是系统级一等公民:
| 任务 | Debian / Ubuntu | RHEL / CentOS |
|---|---|---|
| 刷新源 | apt update |
dnf check-update |
| 安装 | apt install nginx |
dnf install nginx |
| 卸载 | apt remove nginx |
dnf remove nginx |
| 搜索 | apt search redis |
dnf search redis |
装完即被 systemd 接管:apt install nginx && systemctl enable --now nginx,两行走完 Windows 上「下载→安装→服务管理器→启动」的全程。
九、远程操作:从 RDP 到 SSH
Linux 服务器基本没有「远程桌面」,一切靠 SSH:
ssh user@10.0.0.5 # 登录
ssh -p 2222 user@10.0.0.5 # 非默认端口
ssh-keygen -t ed25519 # 生成密钥对
ssh-copy-id user@10.0.0.5 # 推公钥,之后免密直进
scp app.tar.gz user@10.0.0.5:~/ # 传文件
rsync -avz --delete dist/ user@10.0.0.5:/srv/app/ # 增量同步
rsync 只传差异部分,-avz 保留权限和时间戳——你在 Windows 下用 Robocopy /MIR 的话,思路完全一样,配合 cron 就是简易备份方案。
十、定时任务:schtasks → cron
crontab -e # 编辑当前用户的计划任务
crontab -l # 查看
五个字段:分 时 日 月 周。例如每天 3 点清理 7 天前的日志:
0 3 * * * find /var/log/myapp -name "*.log" -mtime +7 -delete
*/5 表示每 5 分钟。systemd timer 是更现代的替代品,但 cron 语法是跨发行版的通用语言。
十一、三剑客:Linux 思维的精髓
- grep —— 按内容筛行:「哪些行有 ERROR」
- sed —— 按行改文本:批量替换配置
- awk —— 按列取数:「第 1 列是什么」
sed -i 's/DEBUG/INFO/g' config.ini # 原地替换,改配置不用开编辑器
awk '{print $1}' access.log # 取每行第 1 列(默认按空白分列)
连起来,统计访问量最高的前 5 个 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5
PowerShell 用对象管道也能写(Get-Content | Group-Object | Sort-Object),类型更安全;bash 是把十几个 1970 年代的小工具自由拼装,学一次到处用。两套哲学各有胜负,但进了 Linux 世界,先按这套来。
十二、其他高频
压缩打包(tar 保留权限位,部署包都用它):
| 任务 | Windows | Linux |
|---|---|---|
| 打包 | Compress-Archive |
tar czf app.tar.gz dir/ |
| 解包 | Expand-Archive |
tar xzf app.tar.gz(-C /tmp 指定落点) |
磁盘与内存:
| 任务 | Windows | Linux |
|---|---|---|
| 磁盘剩余 | Get-PSDrive |
df -h |
| 目录占多大 | WinDirStat | du -sh /var/* |
| 内存 | 任务管理器 |
free -h(buff/cache 不算被占用) |
环境变量与配置:
export APP_ENV=prod # 当前会话有效
echo $PATH # 冒号分隔(Windows 是分号 + 反斜杠)
vim ~/.bashrc # 用户级配置,写入即永久(≈ 系统属性里的环境变量对话框)
source ~/.bashrc # 让改动立即生效
十三、建议的上手路径
- 第 1 周:WSL2 或虚拟机里练第二、三节,导航 / 文件 / 日志三件套形成肌肉记忆。
- 第 2 周:管道 + grep / awk,拿真实日志练第十一节的统计。
- 第 3 周:systemctl + journalctl,把一台服务的部署、启停、排障全流程走通。
- 第 4 周:SSH 免密 + rsync 部署 + cron 定时,完成「不用图形界面管一台机器」的闭环。
两个加速器:man 全文太长,装个 tldr(tldr tar 直接给常用例子);编辑器从 nano 起步,vim 先掌握四步——i 进编辑、Esc 退出编辑、:wq 保存退出、:q! 不保存强退——初期够用。
结尾
从 Windows 迁过来,最反直觉的不是命令不同,而是:Windows 把每个功能做成一个「大」工具(服务管理器、事件查看器、任务管理器),Linux 把它们拆成几十个「小」工具用管道拼装。前者的知识长在界面上,后者的知识长在组合上。适应了组合思维你会发现,这套 1970 年代的工具箱,放在今天的服务器上反而更顺手。