CentOS虚拟机里终端突然开始“鬼畜”——屏幕上反复跳出2-~,敲什么键都没反应,中文全变成方块乱码。这种问题猛一看像是系统坏了,但千万别急着重装,绝大多数情况是按键冲突、终端复用快捷键和字符集配置这三件事里至少有一件在捣鬼。而且这三个问题往往还会叠加出现,让你越调越乱。我最早遇到的时候也以为要重新装系统,后来排查了一圈才发现就是个locale变量加一个Ctrl+A的事。这篇就把这类问题的完整排查思路写透,从症状拆解到最终修复,一条线捋清楚。
因为这类问题出现的场景通常不是单一的纯命令行环境,而是“VMware虚拟机 + SSH终端工具 + 系统里的某些乱码程序”混合在一起,所以文章会用大量实操截图式的文字描述带你走一遍完整排查流程。不管你是刚入门的Linux新手,还是偶尔帮同事救火的运维,这套思路都能直接照抄。
1. 问题场景拆解:反复跳“2-~”和“乱码”不是同一件事
1.1 症状一:“反复跳2-~”更像按键被终端复用接管
先看第一个症状:“终端反复跳2-~,无法输入”。这个现象非常典型,几乎可以锁定方向——你的键盘输入没有送到Shell手里,而是被另一个程序截胡了。常见的截胡者就是终端复用工具,比如screen和tmux。如果你之前手滑敲了screen命令或者开了tmux会话,之后又无意中按了前缀快捷键,终端就会进入“等待命令”的状态,此时屏幕上出现2-~这种怪异字符,敲任何内容都不会正常进命令行。
说得直白一点,screen默认的转义键是Ctrl+A,按下去之后终端会进入命令模式,接着你敲的2、-、~这些按键都会被当作给screen的指令,而不是输入给Shell的字符。如果你是在一个多层嵌套的SSH会话里,问题就会更魔幻——你以为自己在退出screen,结果按键全跑到内层会话里去了。
那怎么确认到底是screen还是tmux在捣乱?有个很笨但很有效的办法:先按Ctrl+C、Ctrl+D、q、exit挨个试,如果字符依然在跳,再按Ctrl+A然后按d,试图分离会话。如果敲完Ctrl+A d之后屏幕上出现了[detached]的字样,那就真相大白了——确实有个screen会话拖住了输入流。
还有一种情况是你不小心按了Ctrl+S,这个快捷键会冻结终端输出,屏幕上也会出现类似卡死、乱跳的表现。终端被Ctrl+S冻结之后,任何输入都不显示,但又不是完全死机,非常容易误判。遇到这种情况,按一下Ctrl+Q解冻就行。
1.2 症状二:“乱码”的主因是locale字符集没配对
再说第二个症状:乱码。终端里出现方块、问号或者����这类字符,九成原因是locale字符集设置不对。Linux的终端本身不“认识”中文,它只是把字节流交给终端模拟器去渲染,如果系统的LANG、LC_ALL这些环境变量指定的字符集和终端实际使用的字符集不一致,中文文本就会变成乱码。
举个例子:系统LANG=zh_CN.UTF-8,但你的SSH客户端用的是GBK编码,那中文输出到客户端时就成了乱码。反过来也一样,系统是en_US.UTF-8,你用中文版终端模拟器去连,中文文件内容也可能显示异常。CentOS默认安装通常不带中文字符集,如果你安装系统时选了英文,后面又用中文终端去操作,就很容易出现“命令能敲、中文全乱”的尴尬局面。
在虚拟机场景里还要多考虑一层:VMware的虚拟显卡和BIOS里的字符集支持能力有限,某些版本在图形界面登录时用的是fbcon或vt控制台,这些控制台默认不加载中文字体,导致你在虚拟机本机的终端上看到中文就是满屏方块。这种情况就算把locale改成中文也一样乱,因为问题出在虚拟控制台的字体渲染上,不是字符集设置上。
