很多人学Linux都有个误区,觉得基础就是背命令。但真正干过运维或者开发的人都知道,命令只是表面,关键是你怎么理解系统运转的那套逻辑。比如用户权限为什么这么设计、进程和端口怎么管理、软件装上去之后到底在系统里动了什么。把这些想明白了,后面的学习就是一马平川。今天这篇就是接着《Linux基础一》往下走的实战串讲,聊聊那些每个学Linux的人都绕不开的核心能力——用户权限、文件系统、服务管理、网络配置、软件安装、Shell文本处理,每块内容都会结合面试里常问的点和实际操作中容易踩的坑来讲。
1. 用户与权限管理:多用户系统的立身之本
1.1 新建用户这件事,远没你想的那么简单
热词里有“linux新建用户”,这确实是新手第一个绕不过去的操作。但很多人只知道useradd加一个用户名就完事了,实际上这里面的门道可多。
先看一条我在生产环境里常用的完整建用户命令:
bash复制useradd -m -s /bin/bash -d /home/zhangsan zhangsan
passwd zhangsan
-m表示顺便创建家目录,-s /bin/bash指定登录Shell,-d指定家目录位置。很多发行版直接敲useradd zhangsan并不会创建家目录,这时候你连登录都登不进去,SSH连接直接报错。
新建完之后,你还要考虑这个问题:这个用户是干嘛用的?
- 如果是给某个应用跑服务用的,那就别给登录Shell,改成
/sbin/nologin,防止有人通过这个账号登进系统; - 如果是给同事开一个日常账号,建议顺便把他加进
sudo组,方便临时提权; - 如果只是临时开个账号用两天,用完记得
userdel -r zhangsan,-r参数会连家目录一起删干净。
我还见过一种情况,新用户建好了,结果用su切换过去发现用户名前面变成-bash开头,而且命令提示符特别简陋。这是典型的环境变量没加载,多半是/etc/profile或~/.bashrc权限不正确或者文件被改坏了。
1.2 权限不只是rwx,还有特殊权限和ACL
linux面试题里几乎必考权限题,尤其是chmod 777到底意味着什么、为什么生产环境禁止用。
基础不赘述了,但我会额外强调三个特殊权限:
bash复制chmod u+s /usr/bin/passwd # SUID,普通用户也能以root身份改密码
chmod g+s /project_dir # SGID,目录内新建文件自动继承属组
chmod +t /tmp # Sticky Bit,/tmp里的文件只有属主能删
这三个权限不是“会用命令”层面的问题,而是理解系统安全模型的入口。你只要想明白为什么/tmp里每个人都能写,但只有文件属主才能删除,就明白了独立目录下多用户协作的基本逻辑。
ACL这块,实操中用的频率比你想象的高。比如某个目录要允许两个不同的用户同时读写,但又不希望他们进同一个组:
bash复制setfacl -m u:zhangsan:rwx /data/share
setfacl -m u:lisi:rwx /data/share
这比重新建一个组再把人拉进去要灵活得多。查权限用getfacl,注意ls -l看到的是基础权限,如果权限位后面多了一个+字符,就说明这个文件带了ACL策略。
1.3 组策略和sudo授权
用户和组的关系,我就用一句话说明白:组是权限的容器,用户通过组获得对资源的统一访问能力。实际使用中,给应用分配专用账号并放入专用组,是生产环境的通用做法。
sudo授权这块,最稳妥的做法不是直接改/etc/sudoers,而是去/etc/sudoers.d/目录下拉一个独立配置文件:
bash复制echo 'zhangsan ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/zhangsan
chmod 440 /etc/sudoers.d/zhangsan
这里注意两个细节:第一,文件权限必须是440,否则sudo会拒绝加载;第二,NOPASSWD:ALL意味着免密,生产环境要给特定人员开这种权限时一定想清楚后果,更方便的折中是去掉NOPASSWD,让账号每次提权输一次密码,安全性和便利性都有。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件系统与磁盘管理:理解Linux一切皆文件
2.1 目录结构背后的设计逻辑
/etc放配置,/var/log放日志,/tmp放临时文件,/proc是内存里的虚拟目录,/dev是硬件映射。这套目录规范(FHS)的最大价值在于:任何一台Linux服务器,你闭着眼睛都能猜到大文件大概在哪个目录下。
以排查磁盘占用为例,按这个顺序查下去,基本上不会漏:
bash复制df -h # 先看整体占用率
du -sh /home/* | sort -rh # 再看是哪个用户目录占得多
du -sh /var/log/* | sort -rh # 日志目录是重灾区
find / -type f -size +500M 2>/dev/null # 最后定位大文件
很多新手一上来就du -sh /*,然后看它卡在那里半天不动,这是因为du会遍历大量文件,加上服务器在跑业务,压力自然大。如果只是想快速定位大文件,find加-size往往更直接。
2.2 删除文件夹到底用rm还是find
热词里的“linux删除文件夹命令”其实指向一个常见的实操陷阱。删除文件不多说,rm -rf家喻户晓,但生产环境的“删除”通常有两种诉求:
- 直接清理:
rm -rf /data/logs/old/; - 按时间清理历史文件:
find /data/logs -type f -mtime +7 -exec rm {} \;
第二种在生产环境更常用。举个例子,Nginx的access日志一天就能写几个GB,磁盘动不动就满,你总不可能天天手动删。写成一条find配合crontab定时任务,自动把7天前的日志清掉,这个才叫运维。
但在执行rm前,建议先跑一遍不带-exec的查找,确认命中的文件列表没有误伤。有些老前辈会改成-exec mv {} /tmp/backup/,先挪后删,给操作留缓冲区。这套思路在直接操作生产环境时能救命。
另外再多说一句,rm -rf后面跟变量的时候千万注意,比如:
bash复制rm -rf $DIR_PATH/
如果DIR_PATH为空,这条命令就变成了rm -rf /。正确写法是加一层判断:
bash复制[ -n "$DIR_PATH" ] && rm -rf "${DIR_PATH}/"
2.3 磁盘挂载与格式化
搞嵌入式Linux和服务器运维,挂载新磁盘是高频场景。新拿到的云盘,通常流程是:
bash复制fdisk -l # 查看磁盘设备名
fdisk /dev/vdb # 分区
mkfs.xfs /dev/vdb1 # 格式化,用xfs或ext4都可以
mkdir -p /data && mount /dev/vdb1 /data # 挂载
echo '/dev/vdb1 /data xfs defaults 0 0' >> /etc/fstab # 开机自动挂载
网上很多人告诉你mount完就够了,忘了写/etc/fstab,结果服务器一重启,数据找不回来了。这种情况我见过太多回了。要注意的一点是,fstab写错会导致系统起不来,改完后建议先执行mount -a验证一下配置没有语法问题。
3. 服务管理与进程监控:从systemd到端口排查
3.1 systemd是当代Linux的骨架
CentOS 7之后,service和chkconfig基本被systemctl全面替代。现在凡是能搜到“linux安装nginx”“linux安装docker”的操作,安装完几乎都会落到下面这套固定动作上:
bash复制systemctl start nginx # 启动
systemctl enable nginx # 开机自启
systemctl status nginx # 查状态
systemctl daemon-reload # 改完配置后重载
这里有一个细节容易绊倒新手:改完配置文件以后,分清楚是systemctl restart还是systemctl reload。像Nginx这种支持平滑重载的,改完配置用reload不会断连接;有些服务不支持reload,只能用restart,操作前要有预期,不然会意外中断线上请求。
还有一个高频坑,就是服务启动失败后,systemctl status里能看到一堆红色报错,但很多时候真正的关键信息藏在日志里。排查命令要会用:
bash复制journalctl -u nginx --since "10 minutes ago" -p err
-u指定服务名,-p err只看错误级别,这在系统日志里捞关键信息非常高效。比起打开/var/log/messages全量翻,效率高好几倍。
3.2 用端口反推进程,用进程反查服务
这也是linux面试题里的常客。比如热词里提到“linux的9090端口什么再用”,实操里对应的处理方式是:
bash复制ss -lntp | grep 9090
ss是netstat的现代替代品,输出更快、信息更全。-l看监听,-n显示数字端口,-t限TCP,-p显示对应进程PID。
如果发现9090端口是被一个不认识的可疑进程占用,可以继续往下查:
bash复制ps -ef | grep 9090
ls -l /proc/PID/exe # 看这个进程启动的可执行文件在哪
查完之后,该杀的杀、该停的停。这里提示一点:不到万不得已别直接kill -9,越紧急越要先看一眼是不是业务依赖的核心进程,最好先终止再观察有没有子进程残留。kill(默认发TERM信号)实在不行再升级到-9。
3.3 进程间通信,面试常考,实战更要懂
“linux进程间通信”在热搜词里出现,估计是想了解面试或者进阶内核。Linux进程间通信八股文一般答管道、消息队列、共享内存、信号量、Socket。但业界实际用得多的就两类:
- 管道:
ps aux | grep nginx,这是最简单的IPC,适合父子或兄弟进程间传递数据; - Socket:跨主机通信、微服务调用全是这个路子。
共享内存配合信号量才是高性能中间件的核心玩法,比如Redis和Kafka的底层都大量采用这类手段。如果只是想先把基础打牢,把管道和Socket弄熟练再说,后面再看共享内存不迟。
这里有一个大家一定要避开的坑:“基础二”阶段最忌讳死磕内核细节,比如TCP协议栈数据流这种级别的知识,那是专门做网络优化的工程师的事,初学者硬啃会严重打击学习积极性。我的建议是先把用户态的工具链用熟,时机成熟再看内核不迟。
4. 网络配置与远程文件传输:从IP到SCP
4.1 临时改IP与永久改IP
服务器IP配置错了导致连不上,是新手期的常见事故。首先看清楚当前系统网络配置方式,不同发行版完全不同:
- CentOS/RHEL系的
/etc/sysconfig/network-scripts/ifcfg-eth0; - Ubuntu系的
/etc/netplan/*.yaml; - 或者走NetworkManager的
nmcli命令行工具。
临时改IP可以直接用命令生效,但重启后丢失:
bash复制ip addr add 192.168.1.100/24 dev eth0
永久改就要写配置文件。我自己的习惯是,如果不是特殊环境,一律用nmcli,它是目前兼容性最好、最不容易写错的方式:
bash复制nmcli con mod eth0 ipv4.addresses 192.168.1.100/24
nmcli con mod eth0 ipv4.gateway 192.168.1.1
nmcli con mod eth0 ipv4.dns "223.5.5.5 8.8.8.8"
nmcli con mod eth0 ipv4.method manual
nmcli con up eth0
这里单独提醒:ip addr add和ifconfig eth0 192.168.1.100 netmask 255.255.255.0是同一类东西,只在内存里生效。改配置前先确认自己有没有控制台权限,否则一旦网络断掉,远程连不上,人又在千里之外,那就只能去机房了。
4.2 scp和rsync,远程传输就靠这两个
热词里的“linux scp命令”是运维基本功。推文件到远端服务器:
bash复制scp /data/backup.tar.gz root@192.168.1.10:/data/
从远端拉文件:
bash复制scp root@192.168.1.10:/data/app.log ./
SCP简单直接,但全量覆盖,每次都要传完整文件。如果文件比较大、或者只是本地和远端之间偶尔同步目录,效率就会很低。更优的交替选择是rsync:
bash复制rsync -avz --progress /data/ root@192.168.1.10:/data/
-a归档保留权限,-v显示进度,-z传输时压缩,--progress看实时进度。rsync最厉害的地方在于增量同步——第一次全量,之后只传变化的部分,这在日常同步代码、同步备份数据时省太多事了。
4.3 Windows与Linux共享文件
热词里有“windows与linux共享文件”,这个场景主要面向混合办公环境。方案很多,我按推荐度排序:
- SSH文件传输(sftp):用WinSCP或MobaXterm直接连,最安全,无需额外装服务;
- Samba:跨平台共享目录,Windows文件夹里直接敲
\\\\192.168.1.10\\share访问; - NFS:Linux之间用,性能好,但Windows端支持差一些;
- 云同步盘:适合少量配置文件,不适合大量数据。
如果是日常开发调试,我建议优先用sftp;如果需要固定做文件共享,再上Samba。搭建Samba就三件事:安装samba、配/etc/samba/smb.conf共享目录、设置samba用户密码。
5. 软件安装与包管理:yum/apt/docker三路并行
5.1 从源码编译到二进制安装,每个场景都有最优解
Linux软件安装方式很多,但目标只有一个:用最省心的方式拿到一个能稳定运行的软件。以nginx为例,三条路线各自适用不同场景:
| 安装方式 | 适用场景 | 特点 |
|---|---|---|
| 包管理器安装(yum/apt) | 大多数普通服务 | 依赖自动处理,卸载干净,版本可能偏旧 |
| 二进制包安装 | 官方提供独立二进制 | 版本新,隔离性好,适合中间件 |
| 源码编译安装 | 定制编译参数 | 最灵活,但编译耗时长,依赖难搞 |
以CentOS系为例,yum install nginx一条命令搞定,装完直接systemctl start nginx。但如果你需要给Nginx加一个官方源里没有的第三方模块,那只能走源码编译。
很多新手一上来就选源码编译,结果卡在./configure的依赖问题上,花了两个小时还没编译成功。我的建议是:不是有硬性定制需求,优先用包管理器。
5.2 Docker安装与使用,超快速上手
热搜词里有“linux安装docker”,这也基本上是现代Linux环境绕不开的一环。在干净的Ubuntu或CentOS上装Docker,官方推荐的方式是用仓库安装:
bash复制# Ubuntu 示例
curl -fsSL https://get.docker.com | bash
systemctl enable --now docker
装完之后先跑一遍:
bash复制docker run hello-world
这个命令会从远程仓库拉取一个测试镜像并运行。如果网络环境特殊导致拉不到官方镜像,就需要配置国内镜像加速器,这对应热词里的“ollama国内镜像linux”以及“linux镜像”这类搜索方向——只要你会改Docker的daemon.json,就掌握了换镜像源这项通用技能:
bash复制mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
systemctl restart docker
如果你本来就在国内网络环境,这个配置可以让你拉镜像的速度提升几十倍。镜像加速器地址各自有效期不固定,建议以当下可用的为准,搜一下最新可用地址就行。
用Docker跑个Nginx实测一下:
bash复制docker run -d --name nginx-web -p 8080:80 -v /data/html:/usr/share/nginx/html nginx
-d后台运行,--name起名字,-p做端口映射,-v挂载目录。这一条命令把容器、端口、数据卷全串起来了,跑通一次,Docker的核心用法你就掌握了一大半。
5.3 Linux系统安装Python的隐藏坑
“linux系统安装python”是另一大高频需求。CentOS 7自带的Python版本老得可怜(2.7),很多新脚本跑不了。很多人一上来就yum install python3,装完才发现版本还是不够新。
更干净的做法是用源码编译指定版本:
bash复制yum -y install gcc openssl-devel bzip2-devel libffi-devel
cd /usr/local/src
wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz
tar -xf Python-3.10.11.tgz && cd Python-3.10.11
./configure --prefix=/usr/local/python3.10
make -j$(nproc) && make install
ln -s /usr/local/python3.10/bin/python3.10 /usr/local/bin/python3
编译前装依赖那步一定别省,尤其是libffi-devel,少了它后面用pip装很多模块会莫名报错。装完以后用python3 -V验证一下版本。另外提醒一下:系统自带的python命令尽量别去动,你不知道系统里有多少脚本依赖旧版本,把默认Python改了,轻则yum用不了,重则系统起不来。
6. 文本处理与Shell技巧:从find到管道组合拳
6.1 find的N种用法,不只是找文件
“linux find”“linux find用法”在热搜词里被反复提及,因为它确实覆盖了大量日常需求。我挑几个高频场景列一下:
bash复制# 按文件名找
find / -name "nginx.conf"
# 按类型找
find /data -type f -name "*.log"
# 按大小找
find / -type f -size +1G
# 按修改时间找(结合前面的日志清理)
find /data/logs -type f -mtime +7 -name "*.log"
# 找到后直接处理
find /data -type f -name "*.tmp" -exec rm -f {} \;
注意find和grep的区别:find是照着文件的属性条件找文件,grep是进到文件内容里找匹配行。这两个命令用混了会出现“明明文件在,但就是搜不到”的尴尬局面。
6.2 文本处理三剑客,日常处理日志和配置就靠它们
grep、awk、sed是Linux从业人员吃饭的家伙。grep负责过滤,sed负责替换,awk负责结构化字段提取。
实战场景:Nginx里统计访问量最高的10个IP:
bash复制awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
这条命令的组合逻辑是:awk取第一列IP,sort排序让相同IP排在一起,uniq -c统计次数,再sort -rn按次数倒序,最后head取前十。看完这条,你应该能感受到Shell的哲学——每个工具做好一件事,管道把它们串起来。
再比如批量修改配置文件里的某个字段:
bash复制sed -i 's/old_port/8080/g' /etc/app/config.ini
-i直接改文件,s/旧/新/g全量替换。改之前我习惯先跑一遍不带-i的命令,把替换结果打印出来看一眼,确认无误再真正写入。
6.3 Shell脚本能写多好,取决于你对默认行为的理解
写Shell脚本有几个“坑”是新手高发区。我用一个典型的备份脚本作为示例:
bash复制#!/bin/bash
set -e
BACKUP_DIR="/data/backup"
SOURCE_DIR="/data/www"
DATE=$(date +%Y%m%d%H%M%S)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/www_${DATE}.tar.gz" "$SOURCE_DIR"
echo "backup done: $BACKUP_DIR/www_${DATE}.tar.gz"
set -e的作用是:任意一条命令失败就直接退出,防止脚本“虽然报了错但还继续往下跑”的连环问题。变量加上双引号,防止路径带空格时出幺蛾子。脚本开头放set -e、变量统一用大写、路径写成变量——这三点做到了,你的脚本基本就能达到可维护的入门门槛。
如果你发现脚本跑完没有任何输出,多半是命令执行成功但没加打印信息;如果你发现脚本中途退出但没任何提示,检查是不是set -e在某条预期会失败的命令上触发了终止,这种情况可以在命令后加|| true跳过。
7. 常见问题排查:Linux日志与面试避坑实录
7.1 日志文件写得乱,怎么快速找到根因
Linux日志的默认组织方式在/var/log/下,核心是这几类:
/var/log/messages:系统级通用日志;/var/log/secure:安全认证日志,SSH登录失败记录在这里;/var/log/cron:定时任务执行日志;/var/log/dmesg:内核日志。
排查问题时不要直接打开整个文件,而是用tail -f跟最新输出,或者grep当天关键词。比如有人反馈SSH登录不上,第一件事就是查认证日志:
bash复制grep "Failed password" /var/log/secure | tail -20
如果发现大量来自陌生IP的尝试,说明机器在被暴力破解扫描,建议修改SSH端口、禁用root密码登录、配置密钥认证。
排查服务起不来的问题,优先看journalctl输出而不是自己猜。systemctl status只是告诉你服务状态,真正的报错细节全部在journal里。
7.2 运维面试容易翻车的问题,提前避开
“linux面试题测试”这个热词说明这个方向很多人关心。我这里挑几个面试里极易翻车的点重点提一下:
-
kill -9和kill的区别。面试官问这个不是为了考八股,而是看你了不了解进程接收到信号后的行为——默认kill发的是TERM信号,进程有机会做清理收尾;kill -9发的是KILL信号,内核直接强制终止,连清理的机会都没有。 -
软链接和硬链接的区别。软链接是独立的文件,里面存着目标路径,目标删除后链接就失效;硬链接是同一个inode的多个目录项,删一个,文件内容还在。
-
绝对路径和相对路径的区别。考的是你对当前工作目录(PWD)和文件系统的理解,而非路径写法本身。
-
进程、线程、协程的联系。Linux早期把线程当作轻量级进程实现,所以说“线程是进程的子集”这种答案虽然通俗,但严格来说在调度层面其实更接近“任务”。面试不用咬文嚼字,但逻辑要清晰。
-
Linux开机流程。从BIOS到引导程序,再到内核,最后到systemd初始化,这套链路要能一条线讲下来。
7.3 几个实操中反复踩过的坑
踩坑经验才是真正值钱的部分,我挑几个高频的分享出来:
第一个坑:rm命令误删项目文件。解决方案是平时多建备份,或者更简单粗暴的做法是立刻停止写入、卸载分区、用extundelete尝试恢复。数据恢复的成败取决于运气和操作速度,与其指望恢复,不如从第一天就养成“删前先备份”的习惯。
第二个坑:端口被占用。每次启动服务发现端口冲突,先检查是不是上一个没退干净的进程还在:
bash复制ss -lntp | grep 8080
第三个坑:权限不足导致的诡异问题。有的服务启动后没有写入日志的权限,表现是服务正常但日志文件一直不生成。排查思路是看进程是以什么用户跑的,再看目标目录的属主和属组是否匹配。
第四个坑:CRLF换行问题。从Windows写好的脚本传到Linux上,经常出现“/bin/bash^M”这样的报错。原因就是Windows的文件用\r\n换行,而Linux只认\n。解决方式:
bash复制sed -i 's/\r$//' script.sh
第五个坑:shell脚本里的sudo在定时任务里不生效。crontab环境非常干净,PATH路径和交互式终端完全不一样,脚本里写sudo要么把用户加进sudoers免密,要么把命令改成绝对路径。
实操心得:学习Linux的正确姿势
踩过这么多坑之后,我个人对Linux学习的建议是:不要死磕命令大全,而是用心理解系统设计的底层逻辑。
以“linux常用命令大全”这种热词为例,网上各种帖子列几百条命令看着很唬人,但我实际用到的核心命令不超过50条,高频使用的更是只有20条左右。真正让你从“知道”变成“会干”的,是把命令组合起来解决具体问题的能力。
这里分享一个小技巧:每次遇到解决不了的问题,就把排查过程记录下来,不需要多正式,命令加输出结果加原因分析,几十条以后你会在不知不觉中形成自己的方法论。
这篇内容覆盖了用户权限、文件系统、服务管理、网络配置、软件安装、文本处理和问题排查这些Linux的根基。把上面这些操作亲手跑一遍,你已经比很多只会背命令的人走得远了。
