
很多刚接触Linux的朋友都会问我同一个问题Linux到底该怎么入门网上教程多得看不完但往往是看了就忘、忘了又看最后还是停留在会敲几个命令的阶段。这篇我不打算罗列什么十大必会命令而是把Linux最核心的基础操作串成一条完整的线从目录结构讲起逐步覆盖用户权限、系统体检、软件安装、Shell脚本自动化最后再聊聊网络和启动异常的排查思路。标题虽然是linux相关基础操作分享但我会尽量把每个命令背后的原理、实际使用场景和常见的坑都讲透适合刚入行的运维新手、准备转做服务端的开发以及正在准备Linux基础面试的朋友。1. 先搞懂Linux的房子结构——目录体系与文件操作1.1 从Windows思维切换到Linux思维很多人第一次登录Linux服务器脑子里还是Windows的C盘、D盘思维习惯性地找我的文档结果发现Linux根本没有盘符这个概念。整个系统就是一棵树所有东西都挂在根目录/下面。我第一次接触Linux时花了很长时间才适应这个逻辑。Windows是把硬盘分成几个分区每个分区有自己的根Linux恰好反过来不管你有几块硬盘、几个分区最终都会被挂载到/这棵树下的某个目录里。比如你加了一块数据盘可能要手动挂载到/data挂载之后/data就是这个树的某个分支节点。用生活化的比喻来说Linux的目录结构更像一栋房子每个房间都有固定用途/home住户的房间普通用户的家目录基本都在这下面比如/home/zhangsan/etc房子的配电箱和总开关存放系统所有配置文件的总开关就在这里/var杂物间日志、缓存、邮件这些经常变化的动态数据都在这里/tmp临时的垃圾桶系统随时清空别把重要文件放里面/usr客厅和储物柜系统自带的软件和库文件大多在这里/bin、/sbin工具间常用的命令程序都放这儿这个结构设计是有讲究的。系统配置统一放/etc日志放/var/log用户数据放/home这样备份、恢复、排查问题时思路就很清晰——出了问题知道去哪翻不用满世界找。1.2 最常用的文件操作命令文件操作是Linux里最基础也最高频的操作我挑几个真正每天都在用的命令结合具体场景说。pwd用来查看当前位置这个没啥好说的ls查看当前目录下的文件cd切换目录。这三兄弟是日常操作的起点。复制用cp移动或重命名用mv删除用rm新建目录用mkdir创建空文件用touch。这些命令看起来简单但实际使用中有几个细节必须注意rm删除的文件不会进回收站删了就没了。没有十足的把握不要在生产环境执行rm -rf。cp -r才能复制目录不加-r会报错。mv在同一个文件系统内几乎是秒完成的因为只是改了个路径名并没有真正搬数据。我举个例子新手常问的怎么批量把文件名统一改掉。比如当前目录下有一堆日志文件app_20240101.log、app_20240102.log想把app_改成backend_一条命令搞定rename s/app_/backend_/ *.log不过不是每个发行版都自带rename而且它的语法在不同系统上略有差异。更通用、更好理解的做法是用循环加mvfor f in app_*.log; do mv $f ${f/app_/backend_}; done这里${f/app_/backend_}是Shell里的字符串替换语法把变量f中的app_替换成backend_。1.3 查找文件的三板斧服务器上文件一多找文件就成了一件头疼的事。我的经验是记住三个命令就够了find、locate、grep。find是最灵活的按名字、按大小、按修改时间都能找。比如我想找出/home目录下所有大于500M的文件find /home -type f -size 500M -exec ls -lh {} \;-type f限定只找普通文件-size 500M表示大于500MB-exec ls -lh {} \;表示对找到的每个文件执行ls命令这样能直观看到文件大小。locate适合快速按名字找文件它依赖一个文件数据库速度极快但数据库是定时更新的刚创建的文件可能搜不到。grep则是按内容搜索配合-r可以递归搜索整个目录里的文本。比如我想在某个项目目录下找到所有配置了数据库地址的文件grep -r 192.168.1.100 /opt/project/config/这三个命令各有侧重组合起来基本能解决90%的文件查找需求。2. 权限不是玄学——用户、组与文件权限的底层逻辑2.1 root与普通用户的分工Linux系统里root用户是万能钥匙可以做任何事。但正因为它权限太大日常操作中我不建议直接用 root 登录操作一旦手滑输错命令代价可能非常大。正确的姿势是日常用普通用户干活需要管理员权限时用sudo临时提权。比如更新软件sudo apt update这里sudo会临时把当前用户提升为管理员身份执行后面的命令但需要输入该用户的密码。相比su切到root用户再执行命令sudo的好处是只临时提权不会改变整个会话的身份而且系统日志里会记录谁执行了什么提权操作。万一出事了审计起来非常方便。2.2 新建用户竟然有这么多细节创建用户这个操作很多人以为就是一条useradd zhangsan完事其实远没那么简单。useradd -m -s /bin/bash -G wheel zhangsan这里的参数含义很关键-m自动创建用户家目录/home/zhangsan-s /bin/bash指定该用户的登录Shell-G wheel把用户加入wheel组这个组在CentOS/Rocky上通常被允许使用sudo然后给用户设置初始密码passwd zhangsan如果不加-m新用户是没有家目录的SSH登录进去连个落脚本的地方都没有会很别扭。如果忘了-G wheel你会发现这用户啥权限都没有想装个软件都装不了。顺手说一句排查用户信息时的常用操作id zhangsan可以看用户ID、所属组userdel -r zhangsan删除用户的同时删除家目录-r一定别忘了否则会留下一堆垃圾文件。2.3 rwx权限位到底在说什么用ls -l查看文件最前面那一串drwxr-xr-x很多人看不懂。我来拆解一下位置含义第1位文件类型d表示目录-表示普通文件l表示软链接第2-4位属主owner的权限r读、w写、x执行第5-7位属组group的权限第8-10位其他用户others的权限所以drwxr-xr-x的意思是这是一个目录属主能读能写能进入属组和其他用户只能读和进入但不能修改里面的内容。修改权限用chmod有两种写法。一种是字母法chmod ux file.sh表示给属主加执行权限。更多时候直接用数字法r4, w2, x1chmod 755 file.sh属主7rwx属组5r-x其他5r-x这是最常见的一种chmod 644 file.txt属主6rw-属组4r--其他4r--普通文本文件的默认权限修改文件属主用chown比如把目录/data/web的所有者改成www用户chown -R www:www /data/web-R表示递归处理子目录和文件。这个命令在部署Web服务、配置Nginx时特别常用权限不对时很容易出现502 Bad Gateway或403 Forbidden这种报错排查半天最后发现只是权限没给对。3. 系统体检三件套进程、内存、磁盘怎么看3.1 ps与top从静态到动态一台服务器运行得好不好第一眼要看的就是进程。静态查看进程我用ps aux它会列出所有进程的PID、CPU占用、内存占用、启动命令等信息。比如我只想找Nginx的进程ps aux | grep nginx但ps看的是某一瞬间的状况想实时观察系统的动态变化就得用top。top打开后是个实时刷新的界面按P按CPU排序按M按内存排序按q退出。如果系统变卡了先top看一眼通常能立刻发现是哪个进程在捣乱。我个人更喜欢用htop因为它的界面更友好支持鼠标操作还能直接按F键杀掉进程。虽然要安装但强烈建议装上sudo apt install htop3.2 内存和磁盘free、df、du内存查看用free -h-h表示以人类可读的格式显示。很多人有个误解看到free命令显示的可用内存很少就慌了以为内存快满了。其实Linux有一个缓存回收机制空闲内存会被系统用来做文件缓存buffer/cache当有程序需要内存时这些缓存会主动释放出来。所以判断内存是否紧张要关注的是available这一列而不是free列。磁盘空间看df -h可以看到各个分区挂载点的使用率。如果发现某个分区快满了要找出哪些文件占地方用dudu -sh /var/* | sort -rh | head -10这条命令会把/var下面各个子目录的大小列出来按从大到小排序取前10名。哪个目录在默默吃掉磁盘空间一眼就能发现。du和df的区别也需要理解df是从文件系统的层面看分区还剩多少空间du是从目录的层面统计这堆文件一共多大。有时候du统计出来很大但df显示分区还很空可能是因为文件被删除了但进程还占着文件句柄没释放。遇到这种情况得重启占用的进程才能释放空间。3.3 systemctl与日志排查现在的Linux发行版基本都用systemd管理服务对应的工具就是systemctl。最常用的几个systemctl status nginx # 查看服务状态 systemctl start nginx # 启动服务 systemctl enable nginx # 设置开机自启 systemctl restart nginx # 重启服务服务起不来是日常运维里最常遇到的问题。我的排查思路是这样的先systemctl status看有没有报错信息如果信息不完整再用journalctl查服务单元对应的日志journalctl -u nginx --since 1 hour ago -n 50-u指定服务名--since限定时间范围-n 50只看最近50行。往往真正有用的错误信息就藏在最后几行里比在搜索引擎里干着急有用得多。4. 装软件不是双击安装包——包管理与环境配置实战4.1 apt和yum怎么选Linux装软件和Windows不同一般不是去官网下载安装包而是通过包管理器从软件仓库里安装自动解决依赖关系。Debian/Ubuntu系用的是apt日常三连是sudo apt update # 更新软件源索引 sudo apt upgrade # 升级所有可升级的软件 sudo apt install nginx # 安装软件CentOS/Rocky/Fedora系用的是yum或dnf用法大同小异sudo yum install -y nginx这里的-y表示过程中所有交互式询问都默认选Yes写脚本批量安装时特别常用。软件源是包管理器的心脏。默认软件源有时候速度慢或者缺软件国内环境下常见做法是换成清华、阿里等镜像源加速一般叫换源。Ubuntu的软件源配置文件在/etc/apt/sources.listCentOS/Rocky则在/etc/yum.repos.d/下的.repo文件里。换源操作各发行版略有差异最好参考对应镜像站提供的官方说明来做不要盲目复制粘贴网上的帖子。4.2 一个离线安装Python的真实场景有时候生产服务器不能访问外网只能在内网环境安装软件这就是离线安装。热词里提到linux python离线下载这确实是很多人会遇到的场景。我的做法是找一台能联网的同系统机器下载Python源码包或轮子文件然后拷贝到内网服务器上安装。比如离线装Python 3.11先下载源码包Python-3.11.8.tgz传到目标机器上编译安装tar xzf Python-3.11.8.tgz cd Python-3.11.8 ./configure --prefix/usr/local/python311 make -j4 sudo make install注意两点一是./configure时尽量指定--prefix免得安装散落到系统各个目录不好管理二是编译依赖比如gcc、zlib、openssl-devel必须先装好否则编译到一半会报错。内网没有gcc是最头疼的所以离线操作的第一步永远是先确认基础编译工具链齐不齐。Python装好后把它的路径加到PATH环境变量里export PATH/usr/local/python311/bin:$PATH但export只对当前终端会话生效下次登录又没了。想要永久生效得把这行写进用户配置文件~/.bashrc里然后执行source ~/.bashrc让配置立即生效。4.3 安装Docker和MySQL一次真实的体检既然聊到装机就顺便说说两个最常见的应用Docker和MySQL。Docker在Ubuntu上的安装很简单官方给了一键脚本但不建议直接curl | sh这种形式风险太大。正确做法是先装依赖再添加官方仓库然后安装sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg后面还要配置仓库源、再apt install docker-ce docker-ce-cli containerd.io。这一步对新手来说稍微繁复但胜在安全可控。装完以后如果拉取镜像速度很慢可以给Docker配置镜像加速器配置文件在/etc/docker/daemon.json。MySQL的安装在不同发行版上差别比较大。Ubuntu上执行sudo apt install mysql-server装完后运行一个安全初始化脚本sudo mysql_secure_installation这个脚本会引导你设置root密码、删除匿名用户、禁用远程root登录生产环境一定要跑一遍不要跳过。Rocky/CentOS上默认的MySQL包可能是MariaDB如果确实要装MySQL一般是用官方提供的Yum仓库安装细节较多。我的建议是如果只是测试环境用系统自带的MariaDB就完全够用生产环境再认真规划MySQL的安装方式和版本选择。4.4 Anaconda环境变量配置热词里还有linux设置anaconda环境变量这也是一个绕不开的话题。很多做数据分析的人会在Linux上装Anaconda装完发现终端里敲conda提示找不到命令这就是典型的PATH没配好。Anaconda默认安装到家目录下的anaconda3文件夹安装完成后它会提示你是否执行conda init。如果之前没做这一步或者换了终端就需要手动把环境变量写进~/.bashrcexport PATH$HOME/anaconda3/bin:$PATH然后source ~/.bashrc conda --version这里我想多说一句关于PATH的理解。PATH就是系统找命令时搜索的目录列表用冒号分隔按顺序逐个查找。你把anaconda3/bin放在最前面就是告诉系统找命令时先来我这里看看。这也是为什么换了顺序某些命令就会被不同的版本接管。5. 把重复劳动写成一条命令——Shell脚本与自动化5.1 脚本其实没那么高深很多新手一听到写脚本就头大其实Shell脚本就是把平时在终端里敲的命令按顺序放到一个文件里再加点变量和判断而已。比如我要每天清理/tmp下超过7天的临时文件手动敲太累就写个脚本clean_tmp.sh#!/bin/bash find /tmp -type f -mtime 7 -delete echo $(date %Y-%m-%d %H:%M:%S) 清理完成 /var/log/clean_tmp.log第一行#!/bin/bash叫Shebang告诉系统这个脚本用哪个解释器执行。脚本写完后要赋予执行权限才能运行chmod x clean_tmp.sh ./clean_tmp.sh脚本里还可以加变量和条件判断比如判断磁盘使用率超过80%时发提醒#!/bin/bash usage$(df / | awk NR2 {print $5} | sed s/%//) if [ $usage -gt 80 ]; then echo 磁盘使用率已超过80% /var/log/disk_alert.log fi这里特别要说一下在 if 判断语句里变量名最好加上双引号包住比如$usage防止变量为空时语法报错。另外变量赋值时两边不能有空格写usage 5会直接报错这是新手最容易踩的坑。5.2 定时任务cron脚本写好了还得让它自动运行。Linux的定时任务叫cron用crontab -e编辑当前用户的定时任务0 2 * * * /home/zhangsan/clean_tmp.sh这个时间格式有5个字段分别表示分、时、日、月、周。0 2 * * *就是每天凌晨2点整执行*表示任意值。常见的写法还有*/5 * * * *每5分钟执行一次0 3 * * 1每周一凌晨3点执行0 0 1 * *每月1号凌晨0点执行写定时任务有个重要原则脚本里的命令最好都用绝对路径因为cron执行时环境变量跟登录终端不一样有时候脚本在终端里能跑到了cron里就找不到命令。比如脚本里用了docker但cron执行时PATH里没有docker相关的路径就会报错。解决办法要么在脚本开头显式定义PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin要么命令都用绝对路径。5.3 实战密码过期提醒脚本热词里有linux密码过期提醒通知这个需求确实很常见。运维中经常有安全策略要求用户定期改密码但用户总是忘结果某天突然发现自己SSH登不上去了。先看一个用户的密码过期信息chage -l zhangsan输出里有上次改密码日期、密码过期时间、密码失效时间等信息。修改密码过期策略用chage比如设置密码90天后过期chage -M 90 zhangsan但光设置还不行用户会在过期前几天毫无察觉。我的做法是写个脚本扫描所有用户找出密码即将在7天内过期的用户然后发邮件通知。脚本核心逻辑是这样的#!/bin/bash expiring_users$(awk -F: /\/bin\/bash|\/bin\/sh/{print $1} /etc/passwd) for user in $expiring_users; do days$(chage -l $user | awk -F: /password expires/{print $2}) if [ $days never ]; then continue fi remaining$(( ($(date -d $days %s) - $(date %s)) / 86400 )) if [ $remaining -le 7 ]; then echo $user 的密码将在 $remaining 天后过期请尽快修改密码 | mail -s 密码过期提醒 $userexample.com fi done这个脚本里最核心的是把过期日期转成天数差用date -d把日期转成时间戳再相除。脚本要预先测试好再放到crontab里每天执行一次。不同系统的chage -l输出字段名有中文/英文差异所以写脚本时最好先跑一遍确认字段名别直接复制网上的。6. 网络与启动异常连接不上和开不了机怎么办6.1 网络排查基本功服务器连不上了很多人的第一反应是打电话给机房。先别急在控制台或者本地终端上按这个顺序排查往往能发现真相第一步ping测试网络连通性看目标地址是否可达ping -c 4 8.8.8.8-c 4表示只发4个包。能通说明链路没问题不通就得检查网卡状态和路由。第二步测试端口连通性用telnet或者更通用的ncnc -zv 192.168.1.100 22如果端口不通可能是服务没起来也可能是防火墙拦截。查看防火墙状态sudo systemctl status firewalld # CentOS/Rocky sudo ufw status # Ubuntu第三步查看本机监听的端口和服务状态ss -lntpss是查看socket状态的利器-l只看监听端口-n不做域名解析-t只看TCP-p显示对应进程。如果发现某个服务的端口根本没监听问题多半出在服务本身。第四步测试DNS解析是否正常dig example.com nslookup example.com连不上服务器有时候只是DNS配置写错了改一下/etc/resolv.conf里的nameserver就行。6.2 网卡配置文件到底在哪热词里提到rocky linux网卡文件这个我也踩过坑。不同发行版的网络配置方式差异很大不搞清楚的话改完配置重启系统就断网了。在Rocky/CentOS/RHEL 7及以上版本里传统网卡配置文件在/etc/sysconfig/network-scripts/目录下文件名一般是ifcfg-ens33这样的格式。文件内容大概是这样TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS1223.5.5.5把BOOTPROTOdhcp改成static再加上IPADDR、NETMASK、GATEWAY等信息然后重启网络服务sudo systemctl restart network不过新一代系统更推荐用nmcli来管理网络。比如给网卡设置静态IPnmcli con mod ens33 ipv4.addresses 192.168.1.100/24 nmcli con mod ens33 ipv4.gateway 192.168.1.1 nmcli con mod ens33 ipv4.dns 223.5.5.5 119.29.29.29 nmcli con mod ens33 ipv4.method manual nmcli con up ens33Ubuntu系的网络配置又不一样新版用的是netplan配置文件在/etc/netplan/目录下格式是YAML。所以我经常提醒自己拿到一台新服务器第一件事就是搞清楚它是什么发行版、什么版本再决定用哪套网络配置工具不要拿CentOS的经验硬套Ubuntu。6.3 开机卡在emergency mode怎么办还有一种典型故障服务器开机后进不了系统界面提示进入了应急模式emergency mode。新手看到这个界面往往手足无措其实原因通常比较简单——多半是/etc/fstab里的挂载配置写错了。比如你加了一块数据盘在/etc/fstab里加了一行开机自动挂载结果UUID写错了或者那块盘临时拿掉了系统开机时就找不到挂载点于是只能进应急模式等你处理。处理步骤是这样的先让根文件系统变成可读写状态因为在应急模式下根分区通常是只读的mount -o remount,rw /然后查看日志确认具体是哪个挂载点报错journalctl -xb | grep -i error再看/etc/fstab文件cat /etc/fstab找到出问题的行用#注释掉或者修正UUID/设备路径然后执行reboot重启。这里有个小技巧在/etc/fstab里写挂载项时不要用设备名比如/dev/sdb1因为在多盘环境下设备名可能变化要用UUID或者LVM逻辑卷这种稳定的标识。用blkid可以查到设备的UUIDsudo blkid写fstab时也建议给中间一列加上dump和pass两个参数最末位的pass填0或2不要填1或者随意填否则开机检查文件系统时也可能出问题。最后再说说我的学习心得。Linux基础操作学起来并不难关键是不要死记命令而是理解每个操作背后的设计逻辑目录为什么这样分、权限为什么这样设、包管理为什么这样设计。我在实际工作中见过太多人背熟了100条命令遇到问题还是不会排查原因就是只记住了怎么做没理解为什么。所以这篇分享我特意把很多坑和排查思路都写了出来哪怕你现在还记不住所有命令只要理解了排查的顺序和思路遇到问题到时候查文档也能很快定位解决。这也是我觉得Linux最有魅力的地方——它给你足够强大的工具也给你足够清晰的线索剩下的就是动手实践了。