多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Windows与Linux命令行对照:高频指令与实战排查技巧

Windows与Linux命令行对照:高频指令与实战排查技巧 老读者应该都知道我很少写“命令大全”这类东西因为网上抄来抄去的表格太多了看完了能记住的没几个。但控制台指令又确实是个高频需求尤其是Windows和Linux两头都得用的人经常在两边切来切去时卡壳在Windows的cmd里敲ls系统说“不是内部或外部命令”在Linux的bash里顺手敲dir出来一堆看不太明白的输出。说实话这不是记性差是缺一套把两边对应起来的思路。这篇文章就为解决这个问题。它不是什么百科大全是我自己维护的一份“同一件事两套敲法”的对照手册外加几个几乎天天都会碰到的实战场景全流程。不管你是刚接触命令行的新人还是已经在Windows和Linux之间来回切换的开发者、运维拿它当工具页收藏就够了。1. 为什么两套命令行必须一起学1.1 它们解决的是同一类问题只是表达方言不同很多人第一次接触Windows命令行都会有个错觉cmd很弱。确实cmd那套语法老得像出土文物copy、del、type一眼看过去全是80年代的味道。但它解决的问题和Linux bash其实高度重合——列目录、复制文件、看网络状态、找进程。真正让新人崩溃的是两边语法完全不对标Windows命令不区分大小写参数用/开头Linux命令区分大小写参数用-开头Windows的管道和Linux的管道长得像但处理逻辑不一样——cmd管道里跑的是纯文本PowerShell管道里传的是对象bash管道里也是一串文本流。这些细节不搞清楚你只能停留在两边都背命令表、背了就忘的循环里。我的建议是别把这两套东西当两门语言学把它们当同一门语言的两种方言。先分清楚什么是“我要做的事”再去查这个事在对应系统里该怎么表达。目录列表就是个很好的例子Windows里你打dirLinux里你打ls名字完全不同但背后都是“把当前目录里的内容吐出来”。一旦建立这种“需求→动作”的心智模型你就不需要背几百条命令只需要背几十个高频动作的映射关系。1.2 对照记忆把两套命令打包成一套知识既然核心是同一个需求学习就应该以需求为目录。我不会建议你从头到尾背一遍help或man的输出那是查字典的逻辑效率非常低。我自己常用的方法是画一张对照表左边是需求中间是Windows的敲法右边是Linux的敲法。比如复制文件这件事Windows CMD用copyPowerShell用Copy-ItemLinux用cp你把它们放一行闭眼过一遍比分开啃两本手册记得牢得多。因为人脑天生擅长找规律不擅长背孤立的列表。实践中还有个偷懒技巧PowerShell里内置了大量Linux命令别名比如敲ls它能懂敲cat也能跑。所以你在Windows上尽量用PowerShell而不是老旧的cmd会让双系统切换的摩擦小很多。另外WSL现在也很成熟直接在Windows上开一个真正的Linux内核环境Linux原生命令完全能跑。心里越是想着“对等”手上的命令越不会乱。1.3 现代环境让边界越来越模糊现在光讨论cmd和bash已经不够了。Windows上可以装WSL、装Git Bash、用PowerShell直接呼应Linux习惯Linux桌面也越来越友好但终端依然是管理员、运维、开发者的主场。而且现实中你经常面临自己电脑是Windows服务器是Linux或者公司测试机是Linux办公机又是Windows。熟练在两套终端间切换不是摆设是生存技能。这些年我处理过的故障一半发生在Windows服务器上一半发生在Linux服务器上很多问题就是换个平台敲两条命令就能定位的小事。2. 高频指令对照手册同样的事情两套敲法下面这些表不是从手册里复制的全量命令是这些年工作中真正高频用过的那一批。每个表后我都加了几条使用时的坑这些属于文档里通常不写、但“不踩不知道”的细节。2.1 文件与目录操作对照先看最基本的映射关系需求Windows (CMD/PowerShell)Linux (Bash)列目录内容dir / Get-ChildItemls切换目录cdcd复制文件copy / Copy-Itemcp移动或重命名move / Move-Itemmv删除文件del / Remove-Itemrm查看文本内容type / Get-Contentcat清屏cls / Clear-Hostclear (CtrlL)查看当前路径cd / Get-Locationpwd查找文件where /R 文件名find三个魔鬼细节值得单独提醒。第一是路径分隔符。Windows用反斜杠\Linux用正斜杠/。在cmd里反斜杠是路径在bash里反斜杠是转义符。你在Linux里写C:\Users这种路径会被当成未知转义老老实实用/mnt/c/Users。这是Windows用户切到Linux之后最常踩的坑。第二是通配符。Windows和Linux的*、?概念相似但Linux的*匹配范围更野配合rm操作不当容易误删。我在Linux上做删除操作的准则是先ls确认一遍再rm。第三是PowerShell的强项它不只是命令更像脚本语言。比如批量把当前目录下所有txt改成bakGet-ChildItem *.txt | Rename-Item -NewName {$_.Name -replace \.txt$,.bak}在bash里对应这样for f in *.txt; do mv $f ${f%.txt}.bak; done两边思路不一样但目的完全一致。熟练之后你会发现Linux靠管道和小工具组合Windows尤其PowerShell靠对象属性处理最终都能解决问题。2.2 进程、端口与服务管理“端口被占用”是绕不开的经典现场搜索里“Windows 关闭端口号”“Linux 关闭占用端口”这类词频率极高不是没原因的。先给出一套完整定位流程。Windows下打开cmd先看谁占了你那个端口netstat -ano | findstr :8080输出最后一列是PID。接着看这个PID到底是谁tasklist | findstr 1234如果不是系统关键进程直接结束它taskkill /F /PID 1234Linux下对应流程ss -ltnp | grep :8080 ps -ef | grep 1234 kill -9 1234这里有个工具迁移的坑老文档让你用netstat但现在很多主流发行版默认不装net-tools只剩ss。看到command not found: netstat别慌改用ss它属于iproute2套件基本都会带。服务管理也是同一套思路。Windows用scLinux用systemctlsc query 服务名 sc config 服务名 start auto sc start 服务名systemctl status 服务名 systemctl enable --now 服务名 systemctl restart 服务名区别在于Windows服务默认随系统启动Linux服务必须enable才会开机自启。很多刚迁到Linux的人配好服务后忘了enable重启机器服务没了还以为是被攻击了。2.3 网络诊断指令对照网络命令的对照表如下目的Windows (CMD/PowerShell)Linux (Bash)测试连通性ping -n 4 域名ping -c 4 域名查看IPipconfig / allip addr / ifconfig查看路由route printip route / route -n查询DNSnslookupdig / nslookup测试端口连通Test-NetConnectionnc -vz网络诊断里最大的一个坑是参数不通用。Windows的ping默认发4个包就停Linux的ping如果没有-c参数会一直发到天荒地老所以Linux习惯是ping -c 4 www.example.com。反过来你把Linux的-c 4放到Windows上也会被无情拒绝。要是把两边命令也搞混比如拿Windows的tracert参数去跑traceroute大概率会报错。Windows 10/11上PowerShell的Test-NetConnection很好用。想测一个服务器的某个端口是否通比如测192.168.1.100的3306端口Test-NetConnection 192.168.1.100 -Port 3306Linux对应的是nc -vz 192.168.1.100 3306。没有nc的机器可以用bash自带的/dev/tcp技巧timeout 3 bash -c echo /dev/tcp/192.168.1.100/3306 echo open || echo closed这种“同一目标、不同手段”的例子见过越多你对两边的理解就越深。2.4 系统信息与日志读取系统信息方面Windows有个systeminfo能把系统版本、补丁、硬件全打印出来Linux则是一堆小命令组合uname -a看内核lscpu看CPUfree -h看内存df -h看磁盘。侧重点不同但都是排查的第一步。日志这块Windows的老牌方式是事件查看器命令行则是wevtutil。比如查安全日志里最近的登录失败事件ID 4625wevtutil qe Security /q:*[System[(EventID4625)]] /c:20 /rd:true /f:text如果不习惯wevtutil这么拗口的语法PowerShell的写法更舒服Get-WinEvent -FilterHashtable {LogNameSecurity; Id4625} -MaxEvents 20Linux下日志通常放在/var/log和journald里。查SSH爆破是不少人的第一课sudo journalctl -u ssh --since today grep Failed password /var/log/auth.log | tail -n 20还有个高频搜索词是“Windows休眠文件和虚拟内存文件在哪里”。答案是C盘根目录下的隐藏系统文件hiberfil.sys和pagefile.sys。命令行下用dir C:\ /a:h就能看到。想释放休眠文件占用的几个G空间管理员身份执行powercfg /h off即可。这是典型的“一条命令解决一个隐藏问题”的例子。3. 四个高频场景从头到尾敲一遍3.1 场景一端口被占用如何安全揪出并终结这大概是所有服务器运维里出现率第一的需求。举个真实例子把一个服务部署在Windows测试机上端口配的是8080启动直接报“端口被占用”。正确的处理顺序是。先在cmd查看netstat -ano | findstr :8080注意findstr里写:8080别只写8080加冒号能避免匹配到其它相似端口。输出里你会看到TCP 0.0.0.0:8080那行最后一位的PID比如1256。再用tasklist | findstr 1256确认进程名。如果显示是java.exe而你的服务本身也是Java系那就得决定杀旧还是换端口。直接杀taskkill /F /T /PID 1256日常很多人只用/F强制杀但如果这个进程下面挂着子进程单杀父进程可能留孤儿。加上/T之后会连进程树一起结束更干净。Linux这边流程几乎一样但工具顺位不同。优先ss -ltnp | grep :8080没有ss再lsof -i:8080。结果里能看到PID和进程名然后ps -ef | grep pid确认kill -9 pid处理。Linux有个Windows原生没有的小优势lsof -i:8080能直接显示进程名通常不需要二次确认。Windows想达到同样效果要装Sysinternals的handle.exe麻烦不少。3.2 场景二让Linux任务脱离终端存活搜索里有一条词我很有共鸣——“Linux 让后台运行指令不因界面退出而退出”。这是每个Linux新手都会问一次的事用SSH连上服务器跑了个脚本关闭本地终端任务也被带走了为什么因为终端会话退出时shell会给所有进程发送SIGHUP信号进程的默认反应是直接终止。解决方案就是“不让它收到这个信号”。最朴素的方法nohup ./long_task.sh run.log 21 nohup忽略挂断信号表示放后台 run.log 21把标准输出和错误都写进日志。关掉终端任务也不会死。稍微进阶一点的方案是setsidsetsid ./long_task.sh 它直接让进程脱离当前会话比nohup更干净。但如果想中途进去看看进度、甚至交互操作就必须用screen或tmux了这是给任务开一个可以随时抓回来的虚拟终端。我的使用习惯是一次性跑完的后台脚本用nohup需要交互调试的长任务用tmux。Windows下类似的需求没这么强烈因为Windows服务本身就能常驻。但如果你只是临时跑个程序又希望它别随着关闭cmd窗口而消失PowerShell里用Start-Process或者直接注册成服务即可。没有SIGHUP的烦恼反过来是权限和管理方式的烦恼。3.3 场景三Windows下启动Elasticsearch提示Non-Elevated Terminal最近搜索里高频出现一个报错error: start the windows daemon from a non-elevated terminal; shared clients。我第一次遇到也懵“非管理员终端”难道不就要用管理员跑服务其实是Elasticsearch的一个安全设计。它担心你在管理员权限终端里启动守护进程后会让其它普通客户端也蹭到高权限环境于是干脆禁止从提升权限的终端启动。解法很直白不要右键“以管理员身份运行”PowerShell用普通的、未提升权限的终端切到ES目录执行bin\elasticsearch.bat即可。很多人看到报错后反复试管理员模式越试越气其实non-elevated这个单词已经说得很明白了。这个报错的另一面也值得讲有些Windows命令确实必须管理员权限比如以服务方式启动某些程序、修改系统网络设置。判断标准很简单提示Access is denied就尝试管理员提示must not be elevated就换普通终端。别把“管理员终端”当成万能解法它不是。3.4 场景四从命令行翻系统和安全日志Windows日志用图形界面的“事件查看器”点来点去效率很低命令行快得多。查最近安全日志里的登录失败事件也就是暴力破解最常留的痕迹用wevtutilwevtutil qe Security /q:*[System[(EventID4625)]] /c:20 /rd:true /f:text/rd:true表示按倒序最新事件在前。Linux没有“事件ID”这套概念日志一般扔在/var/log和journald里。追踪SSH爆破sudo journalctl -u ssh --since today grep Failed password /var/log/auth.log | tail -n 20还有一个通用技巧不管是哪个平台想实时盯着日志滚动Windows PowerShell用Get-Content -WaitLinux用tail -f。这两个命令是我排查线上问题时用得最多的没有之一。4. 常见问题与避坑实录4.1 脚本闪退、中文乱码、执行策略Windows用户写个.bat文件双击运行窗口一闪而过。这通常是脚本执行完了或报错了但cmd窗口在退出前就被关了。在文件末尾加一行pause就能让它在退出前停住等你按键这是新人第一课。PowerShell的坑是执行策略。默认情况下脚本可能被安全策略阻止提示“无法加载配置文件因为在此系统上禁止运行脚本”。临时放行当前用户Set-ExecutionPolicy RemoteSigned -Scope CurrentUser中文乱码也是高频问题根源是Windows系统默认代码页和Linux的UTF-8不一致。cmd里先执行chcp 65001切到UTF-8代码页。写跨平台脚本时尽量保存为无BOM的UTF-8避免首行出现不可见字符导致解析失败。这个细节能省很多排查时间。4.2 权限不足哪些命令必须管理员前面提过non-elevated这里把权限这件事说完整。Windows里网络配置、服务注册、磁盘管理基本都要管理员Linux里改系统目录、管理服务、装软件都要sudo。两边报错风格完全不同Windows说“请求的操作需要提升”Linux直接来一句“Permission denied”。我的经验是不要一碰到权限就急着切root或管理员。先确认确实需要否则以过低或过高权限执行都会引入新问题。Linux日常操作不要总用rootWindows也不要长期挂着管理员终端——这个习惯会掩盖掉很多本应让你察觉的权限敏感点。4.3 命令不存在、发行版差异、别名陷阱Linux不同发行版的命令差异有时候比Windows大。Ubuntu/Debian用apt装软件CentOS/RHEL用yum或dnf。查网上的命令照抄前先确认操作系统。另一个高频问题是某台机器上ifconfig能跑换台机器就说command not found因为新系统默认没装net-tools。解决方式是直接用ip addr。Windows也有版本差异。Windows 7默认PowerShell 2.0很多高版本cmdlet根本不支持老系统上只能退回wevtutil或WMIC。还有一个特别隐蔽的坑PowerShell里curl其实是Invoke-WebRequest的别名不是Linux那个curl。直接敲curl -I example.com会发现参数全错。要用真正的curl必须在PowerShell里写curl.exe。这种“命令存在但行为不对”的坑比“命令不存在”更让人头大。4.4 高频故障速查表症状Windows排查Linux排查端口被占用netstat -ano | findstr :8080ss -ltnp | grep :8080磁盘快满了wmic logicaldisk get size,freespace,deviciddf -hCPU异常飚高PowerShell: Get-Process | Sort CPUps aux --sort-%cpu | head找不到命令where 命令which 命令 / command -v 命令文件被占用无法删除PowerShell: OpenFiles / Sysinternals handle.exelsof 文件服务起不来sc query 服务名 事件日志systemctl status 服务名 journalctl这张表不用硬背贴在手边就行。真正有用的是建立起排查的肌肉记忆先确认现象再缩小范围最后再动手不要上来就一顿乱杀进程。最后说点这些年折腾控制台的体会。命令行不是靠背就能学会的学科更像一种手感。最有效的学习路径就是带着问题去敲今天端口被占了就去查netstat明天日志刷屏了就去学grep和tail。每解决一个真实问题那几条命令就会从“别人的笔记”变成“你的工具”。我自己的小习惯是把最常用的命令写成别名比如Linux里把ss -ltnp缩成ports把ps aux --sort-%cpu | head缩成topcpu在Windows的PowerShell里用function封装同样的逻辑。这样不管坐在哪台机器前敲的都是同一套肌肉记忆。命令本身永远不是目的解决问题才是。希望这份对照手册能帮你少走一点弯路。
返回列表