从 Windows 到 Linux:写给运维开发的 Shell 迁移指南

适用读者:常年 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 退出,/ 搜索)

三条安全须知:

  1. rm 没有回收站。 rm -rf 路径写错就是事故,回车前看一眼;生产机器上宁可先 mv 到 /tmp。
  2. 通配符 * 照用,但先 ls *.log 确认列表,再 rm *.log。
  3. 目录操作默认会拦一道让你确认,但加 -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. 第 1 周:WSL2 或虚拟机里练第二、三节,导航 / 文件 / 日志三件套形成肌肉记忆。
  2. 第 2 周:管道 + grep / awk,拿真实日志练第十一节的统计。
  3. 第 3 周:systemctl + journalctl,把一台服务的部署、启停、排障全流程走通。
  4. 第 4 周:SSH 免密 + rsync 部署 + cron 定时,完成「不用图形界面管一台机器」的闭环。

两个加速器:man 全文太长,装个 tldr(tldr tar 直接给常用例子);编辑器从 nano 起步,vim 先掌握四步——i 进编辑、Esc 退出编辑、:wq 保存退出、:q! 不保存强退——初期够用。

结尾

从 Windows 迁过来,最反直觉的不是命令不同,而是:Windows 把每个功能做成一个「大」工具(服务管理器、事件查看器、任务管理器),Linux 把它们拆成几十个「小」工具用管道拼装。前者的知识长在界面上,后者的知识长在组合上。适应了组合思维你会发现,这套 1970 年代的工具箱,放在今天的服务器上反而更顺手。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容