打算正经学Linux或者刚入行运维的朋友,大概率会搜到这类标题:Linux的基本管理及命令(上)。这类内容看起来到处都是,但真上手后发现,命令背了一堆,遇到实际问题还是抓瞎。我这些年折腾Linux服务器、写脚本、排查故障,最深的感觉是——基础管理命令不是背出来的,是在真实场景里反复磨出来的。这篇就把Linux入门阶段真正该掌握的管理思路和常用命令串一遍,重点讲清楚每个命令什么时候用、为什么这么用、有哪些坑,让你看完能直接对着终端实操,而不是又收藏一份“命令大全”。
如果你是个纯新手,刚装好CentOS、Ubuntu或者Debian,面对黑乎乎的终端不知道从哪下手,这篇适合你;如果你已经会用一些命令,但对权限、查找、文本处理这些核心场景缺一个系统性理解,同样值得花几分钟过一遍。标题既然是“(上)”,那这篇先把文件系统、基础操作、文本处理和权限这些地基打牢,网络、进程、服务管理那些后面再单独聊。
1. Linux基础管理的整体设计思路
1.1 先理解Linux“一切皆文件”的底层逻辑
很多人学Linux命令觉得难,是因为把每个命令当独立的知识点去背,而不是去理解它的设计逻辑。Linux最核心的一个理念就是“一切皆文件”。磁盘是文件、网卡是文件、打印机是文件,甚至正在运行的进程,也对应着/proc目录下的文件。这个理念一旦理解了,很多命令的用法就变得顺理成章——既然是文件,那么对文件的操作(查看、修改、删除、复制)就能统一用一套工具完成。
举个小例子,查系统内存时你可能会用free -h,但本质上它读取的就是/proc/meminfo这个“文件”的内容。查看CPU信息用lscpu,同样也能通过cat /proc/cpuinfo看到原始数据。理解了这层关系,你在排查问题时就会多一个思路——某个命令输出不够详细,就直接去看它背后对应的系统文件,信息往往更原始、更准确。
这个理念还延伸出一个重要习惯:Linux下做事讲究“组合小工具完成大任务”,而不是指望一个巨型软件包干完所有事。每个命令只做好一件事,通过管道符|把这些小工具串起来,就组成了强大的工作流。比如查哪个进程占用了大量磁盘IO,iotop可能没装,但你可以ps配合sort、head自己拼出来。这就是“Linux哲学”,理解了它,你对命令的记忆会从“背”变成“用”。
1.2 目录结构入门:知道东西放在哪,比记住命令更重要
Linux的目录结构刚开始看会觉得乱,但它的设计其实很清晰。/是根目录,所有路径从这里开始;/home存放普通用户的家目录,对应Windows里的“我的文档”;/etc放系统配置文件,相当于Windows的注册表,但以纯文本方式存在;/var存放日志和缓存,排查故障时最常去;/usr存放系统自带的软件和库文件;/tmp存放临时文件,系统重启后自动清理。
我建议新手先别急着背ls的所有参数,先把目录结构逛熟。用cd /切到根目录,然后挨个ls看看每个目录里有什么,再结合ls -l看权限和所有者,慢慢就会建立“文件该去哪找”的直觉。排查问题时最有用的路径意识是:配置出问题去/etc找,日志查异常去/var/log找,脚本想开机自启去/etc/systemd/system或/etc/init.d看。这个习惯一旦养成,你面对一个陌生Linux机器时就不会心慌,因为你知道“每个东西大概率在什么位置”。
还有个容易忽略但很实用的点:区分绝对路径和相对路径。绝对路径从/写起,任何目录下都有效;相对路径是相对当前目录的位置,用.表示当前目录、..表示上一级目录。很多人写脚本时路径写错,就是混淆了这两者。我的习惯是在带状态的脚本里一律用绝对路径,避免切换目录后脚本行为发生变化。
1.3 命令行交互的思维转换:从“点击”到“输入”
用惯Windows的朋友刚接触Linux终端,最大的障碍是交互方式变了——没有按钮可点,一切靠输入命令,而且系统不会给太多反馈。这里有个关键心态要转变:命令行不是不友好,而是把选择权完全交给你。你输入什么就执行什么,没有任何弹窗确认,所以rm删文件时才那么危险。
我在带新人时反复强调一个原则:不确定命令作用时,先查man手册,再在前面加echo模拟,最后才真正执行。比如rm -rf /tmp/test这个命令,你可以先按住“危险动作”心态,用ls -l /tmp/test确认目录内容,再执行删除。命令行世界里,慢就是快,多敲两行确认,往往能省下后面几小时的故障排查时间。
2. 文件与目录操作:最基础也是最高频的命令集合
2.1 定位与浏览:pwd、ls、cd、file
登录到一台Linux服务器,第一件事就是搞清楚“我在哪”“这里有什么”。当前路径用pwd(print working directory)查看,列出当前目录内容用ls。很多人用ls只是ls一下,其实最常用的组合是ls -lh,-l显示详细信息(权限、大小、修改时间、属主属组),-h把文件大小以人类可读的方式显示(KB、MB、GB)。判断一个路径是文件还是目录,可以用file命令,它的判断维度比后缀名可靠得多——它通过读取文件头部信息识别真实类型,这一点在排查“这到底是个什么鬼文件”时非常实用。
不得不提的还有cd。新手容易忽略cd -这个用法,它可以在最近两次所在的目录之间来回跳转。比如你在/etc/nginx看配置,又跑到/var/log/nginx看日志,想再切回配置目录,输入cd -一下就回去了。还有cd ~直接回家目录,cd /回根目录,这些基础操作虽然简单,但熟练使用能明显提升操作效率。
关于ls还有个小技巧:查看隐藏文件用ls -a。Linux下以.开头的文件默认不显示,很多配置文件和.bashrc、.gitconfig都是隐藏文件。发现自己配置了却不生效时,十有八九是没加-a没看到文件,或者文件名开头写错了点。
2.2 文件创建、复制、移动与删除的“生存级”操作
这组命令是日常打交道最多的,也是翻车概率最高的。创建空文件用touch,它原本的作用是更新时间戳,但后来变成了“快速建文件”的惯用工具;创建目录用mkdir -p,加-p可以一次性创建多级目录,不用逐层建。复制用cp -r复制目录时-r必须加,否则报错;移动或重命名用mv,同一个目录下的mv本质是重命名,跨目录才是移动。
删除必须单独拎出来讲,rm -rf这个组合被戏称为“删库跑路”命令,但实际生产环境中很多人栽跟头不是因为敲了这个,而是因为敲的时候路径敲错了。比如在脚本里写rm -rf /opt/data /,中间多了个空格,系统会先把/opt/data删了,再把根的整个文件系统删了,连确认的机会都没有。我之前遇过一个小伙子,执行完脚本后整个服务器所有命令都command not found,因为/usr/bin、/bin全被删了,最后只能重装系统。这里分享几个保命习惯:
- 删除前先
ls确认路径正确; - 重要数据提前做备份,哪怕只是
cp -r到别的目录; - 用
rm -i交互式删除,确认后再执行; - 在脚本里删除路径用变量拼接时,先
echo打印出来检查一遍。
2.3 权限体系详解:看懂那串rwxr-xr-x
Linux的权限设计是它安全性的一大部分,但同时也是新手最懵的点之一。执行ls -l后,最前面那串字符长这样:-rwxr-xr-x,一共10个位。第1位是文件类型(-普通文件、d目录、l软链接),后面9位分成3组,分别代表“所有者(u)”“所属组(g)”“其他人(o)”的权限。每组3个字符,r读、w写、x执行,没有权限就是-。
修改权限用chmod,常见的写法有两种。字母法是chmod u+x file(给所有者加执行权限)、chmod g-w file(去掉组写权限)、chmod o=r file(其他人设为只读)。数字法更常用,r=4、w=2、x=1,所以我常写的chmod 755表示所有者rwx(4+2+1=7),组和其他人r-x(4+1=5)。推荐大家想一下,chmod 644是文件默认权限(所有者读写,其他人只读),chmod 755适合目录和脚本,chmod 600适合私钥这类敏感文件。需要记住,目录的x权限代表“能否进入该目录”,所以目录通常必须有x,否则即使你能列目录也不能进入。
有个经典问题:为什么我chmod 777了还是不能操作?答案是权限不够只是表象,还可能是“所有者不匹配”。查看目录所有者用ls -ld /path或stat /path,修改所有者和组用chown user:group file。很多新手在服务器上部署网站时,文件所有者是root,而PHP或Nginx进程跑在www用户下,直接chmod 777了事,这是典型的“用权限换功能”的坏习惯。正确做法是chown -R www:www /var/www/html,把目录交给正确的用户。
3. 查找、统计与文本处理:让一堆文件瞬间变“可检索数据库”
3.1 文件查找的两个层次:find 和 locate
服务器用久了,难免会遇到“记不清那个配置文件放哪了”的尴尬。两个命令可以解决:find和locate。find是实时查找,语法为find 路径 -name "文件名",支持通配符,比如find /etc -name "*.conf"可以列出所有.conf结尾的配置文件。还可以按类型找,find / -type d -name "nginx"找目录;按大小找,find / -size +100M找出超过100MB的文件——清理磁盘空间时这个用法特别实用。
locate则让查找更快,因为它基于一个预生成的数据库。但新版系统里默认不装,且数据库不是实时更新,刚创建的文件它找不到,需要先updatedb更新。我的建议是,日常查找用find更可靠,locate适合在知道大致文件名、想要秒出结果时用。如果你发现自己频繁执行同一个find,可以考虑给它加个别名,写进~/.bashrc,比如alias ffind='find / -name',省得每次敲一长串。
find还有一个进阶功能必须提:按时间找文件。find /var/log -mtime -3表示找3天内修改过的文件,排查“昨晚到底哪个日志文件被动了”时很有用。-mtime +30表示超过30天未修改的,结合-exec可以批量清理过期备份,这在运维场景里是刚需。
3.2 grep、awk、sed:三把文本处理的“瑞士军刀”
如果说只允许我推荐三个命令给Linux新手,那一定是grep、awk、sed,它们能覆盖80%的日志排查和报文处理场景。
grep是搜索内容的首选。最常用的场景是过滤日志:tail -f /var/log/messages | grep error,实时跟踪日志并只看包含“error”的行。grep -i忽略大小写,grep -v反选(看“不包含”某关键词的行),grep -r递归搜索目录下所有文件(比如grep -r "root" /etc)。它支持正则表达式,进阶后能匹配复杂模式,比如grep -E "^[0-9]{3}"匹配以3个数字开头的行。我排查问题时经常是三层过滤:先grep关键词定位到大致时间范围,再grep -v排除干扰项,最后看一眼上下文(grep -A 5 -B 5显示匹配前后5行)。
awk是处理“列”的利器。默认按空格或制表符切分每行,$1表示第一列、$2表示第二列,$0表示整行。比如awk '{print $1, $4}' access.log能提取日志的访问IP和时间。它的条件判断也很常用:awk '$3 > 500 {print $1}'表示从某个流量统计文件里筛出第三列大于500的记录。awk本身是一个完整的编程语言,有变量、数组、循环,但我建议新手先掌握“按列取值”“条件过滤”“统计求和”这三个能力,日常够用。
sed则是“行编辑”工具,常用于批量替换。sed -i 's/old/new/g' file表示把文件里的old全部替换成new,-i表示直接写入原文件。注意,不加-i只是输出到屏幕,原文件不变,很多新手加了-i后发现文件内容没变,就是因为理解错了。这三个工具往往搭配使用:cat file | grep keyword | awk '{print $2}' | sed 's/xxx/yyy/',一条管道链下来,相当于给一个纯文本文件做了一次SQL查询,高效得让人上瘾。
3.3 查看文件的正确姿势:less、tail、head
“如何查看文件内容”这个问题也值得单独说说,因为方式选错会非常低效。小文件直接cat没问题,但大文件(比如几百MB的日志)用cat会把屏幕刷爆,还搞崩终端。查看大文件的正确姿势是less,它支持分页浏览、上下翻页(空格翻页、b回翻)、搜索(/关键词)、跳转(G到底部、gg到顶部),退出按q。有人说less是活跃的日志神器,因为它打开文件不会一次性载入内存,性能消耗极小。
想看文件的尾部(日志的最新内容),用tail。直接tail -n 50 /var/log/messages看最后50行,tail -f则进入“实时跟踪”模式,按Ctrl+C退出。部署完一个服务后,tail -f日志是验证服务是否正常的最直接手段。反过来,看文件开头用head -n 20。还有一个我天天用的场景:程序崩溃后查看尾部报错,tail -n 100 error.log,比直接打开编辑器快得多。
4. 常用排查思路与实战记录
4.1 命令找不到、权限被拒、端口不通的排查路径
新手最常卡住的问题不外乎三类。第一类是“command not found”。可能的原因有三种:命令没装,比如telnet在最小化安装时没有;路径没有包含在PATH变量里;或你敲错了命令名。排查顺序是:先确认是不是没装(Debian系用apt install,RHEL系用yum install),再用which 命令名查看路径,最后看脚本里有没有写绝对路径。
第二类是权限被拒。遇到Permission denied,先确认当前用户对目标文件的权限是不是有误,再确认是不是SELinux或AppArmor在挡,最后看文件系统是否被只读挂载(mount输出里带ro)。很多人第一步就卡在“我是root怎么还被拒”上,这时优先查SELinux,getenforce看是不是Enforcing,临时关闭用setenforce 0,生产环境不建议关,正确通过策略放行。
第三类是网络端口不通。想确认对端端口是否开放,最直观的做法是telnet 目标IP 端口,如果通了会显示连接成功,端口不通会卡住然后报错。举例来说,telnet 192.168.1.10 3306,如果目标是MySQL端口开着,输出会出现“Connected to 192.168.1.10”,按Ctrl+]再输入quit退出;如果端口不通,要么一直卡着,要么显示Connection refused。但新版系统默认没装telnet客户端,更快捷的替代用nc -vz 目标IP 端口,输出succeeded就说明通了。前提是本机有nc命令,没有的话先安装nmap-ncat或netcat。排查端口时再配合ss -lntp看本机监听了哪些端口,对应进程是谁(-p显示进程),就能快速定位“服务挂没挂”“端口是否被换”。
4.2 历史命令玩法:让操作有迹可循
在终端上敲过的所有命令都会被记录在~/.bash_history文件里,直接history就能看到序号和命令内容。这个功能远不只是“翻旧账”,几个进阶用法很香:
history n显示最近n条记录;!!重复执行上一条命令;!100执行历史中序号为100的那条命令;!grep重新执行最近一条以 “grep” 开头的命令;- 快速搜索历史命令:
Ctrl+R进入反向搜索模式,输入关键词就能找到匹配记录,回车执行。这是我日常使用频率最高的终端快捷键。
看这功能平时方便,但也有安全注意点:其他人如果能读到你的终端,就能看到你敲过的所有明文内容,包括密码。所以不要在命令行里直接明文传密码,比如mysql -p密码这种习惯要改,可以用-p后回车交互输入,或者用环境变量、配置文件管理。定期history -c清空历史记录这个事,我其实不太建议,毕竟排查问题时要翻历史记录,而且清空后反而显得刻意,关键是规范自己的输入习惯。
4.3 别再踩的坑:一些实用避坑清单
下面这些坑我或者身边的人基本都踩过,列出来给大家省点时间。
rm默认是直接删除不回收,没有什么“回收站”。误删后如果文件系统是ext4且还没被覆盖,可以用debugfs或extundelete尝试恢复,但恢复成功率不高,最稳的办法还是提前备份。mv跨文件系统移动和复制不一样,它是“先复制再删除”,对大数据量来说会慢很多,所以移动大目录前先确认源和目标的文件系统是否一致,df -h看看就知道了。- 目录名带空格时,必须给路径加引号或转义,比如
/opt/my data,写成cd /opt/my\ data或cd "/opt/my data",连输多级带空格路径时很容易栽在这里。 cat大文件会刷屏,改用less;合并两个文件内容时cat file1 file2 > file3可以,但不要用cat file >> file自己追加自己,会导致文件无限膨胀。- 管道符
|传递的是标准输出,tee可以一边输出到屏幕一边写入文件,如果既要看结果又要留档,命令 | tee -a log.txt是个好组合。 - 脚本里的
cd只对当前Shell有效。如果你想通过一个脚本切换目录,运行bash myscript.sh是没用的,必须source myscript.sh或. myscript.sh才能影响当前Shell的工作目录。这个问题很典型,很多人写“一键部署”脚本时容易忽略。
5. vim与系统信息查看:绕不开的两个基本功
5.1 vim:终端编辑器的“守门员”
说到Linux管理,vim是绕不开的。它虽然入门曲线陡,但它几乎是所有Linux发行版自带的编辑器,且操作逻辑和命令行一脉相承——不用鼠标,全靠模式切换。初学只需要掌握几个最基础的动作:打开文件用vim file,按i进入插入模式开始编辑,编辑完按Esc回到普通模式,输:wq保存退出,输:q!不保存退出。这个循环就是90%的日常编辑场景。
更高频的操作是“在文件中搜索和替换”。定位到某个关键词,按/关键词回车即可查找,按n跳到下一个匹配,按N回到上一个。批量替换建议在普通模式下输:%s/old/new/g,表示全文件替换,%代表每一行,g代表这一行的所有匹配。第一次做全局替换前可以先不加g,只替换每行第一个匹配,预览下效果;想更稳就直接:%s/old/new/gc,每个匹配都问你是否替换,虽然打得慢点,但不会出错。
vim里还有一个高频操作是“批量操作”。比如把#注释加到多行前面:Ctrl+V进入可视块模式,选中需要的行,按I输入#,再按Esc,选中的行就全部加上了注释。这个操作我在改配置、调脚本时常用。初学者不需要把所有vim快捷键背完,掌握i、Esc、:wq、:q!、/搜索、:%s替换,再加上u撤销,基本能在vim里活下来了。
在服务器上临时改配置时,很多人问“有没有比vim更友好的编辑器”,nano确实更直觉一点,但vim的优势是“默认就有”,尤其是你接手一台最小化安装的机器,里面很可能连nano都没有。所以还是我那句建议,别绕开vim,至少把上面提到的几个动作练熟,走到哪儿都能改文件,这个基本功但凡干运维就绕不过去。
5.2 系统信息查看:先搞清楚机器“什么配置什么状态”
基础管理的另一个核心能力是用命令“问”出系统当前的状态。我自己接到一台新机器时,会先快速扫一遍下面这几条命令:
uname -a查看内核版本;cat /etc/os-release查看发行版和版本号(CentOS 7还是8,Ubuntu 20.04还是22.04,往下才方便选安装源和命令差异);free -h查看内存总量和剩余量;df -h查看磁盘分区使用率;uptime查看系统运行时长和负载;top或htop实时看CPU、内存、进程占用情况;lscpu查看CPU型号、核数。
这套操作连起来,差不多一两分钟内就能判断一台机器是否健康,也基本满足“系统体检”的入门需求。熟练之后,分歧就在细节上:比如df -h显示的/dev/vda1使用率虚高,可能是因为删除了文件但进程还开着句柄,磁盘空间被占用而不释放,这时要用lsof | grep deleted排查是哪个进程占着。这类案例说明,命令本身不难,难的是把输出和现实场景对应起来。
在 “(上)” 这篇的收尾部分,我特别想强调一点:这些基础命令不要单独去背,而是要去用。我见过太多人下载了命令大全,结果是收藏了、却从来没实操。Linux的管理能力跟体育训练很像,肌肉记忆全靠反复用。今天看完这篇,最好的学习方式是打开一台虚拟机或者云服务器,把每一条命令敲一遍,看看输出什么样,故意踩几个坑,再排查出来——这个过程比看十篇教程都管用。
我在实际带人的过程中,都是让新人从ls、cd、grep、awk、vim这几个开始,每天在真实环境里操作,两周以后再回头看,命令基本都记住了。所以工具不在多,在于常用。这篇里提到的每个命令,你在真实场景里用上几次,比强行背下100个命令参数有用得多。下一篇串网络和服务管理时,咱们再接着聊。