断更了几天,把Linux练习系列的第3篇补上。前两篇写的是基础命令和文件操作,这次我把范围拉大了一点,从单纯敲命令延伸到“站在一个运维实习生的视角,把一台刚装好的Linux服务器配置成能干活的状态”。练习内容覆盖了用户与权限管理、文件查找与传输、软件安装与服务部署,还有几个我实际踩过坑的故障排查场景。如果你已经能熟练使用cd、ls、grep这些基础命令,但对“怎么把一个系统从裸机状态配置到可用”还缺一条完整脉络,这篇练习应该对你有帮助。文里的命令我都在Rocky Linux 9上实测过,Debian系稍有差异,我会在对应位置标注。
1. 练习环境准备:为什么我坚持用虚拟机加快照
1.1 用虚拟机练习而不是直接上物理机
这次练习涉及用户权限调整、服务安装、防火墙策略修改,这些操作在生产环境里任何一个失误都可能造成服务不可用。我的建议是练习阶段一律用虚拟机,原因就三个字:可回滚。
我用的是VMware Workstation,装了一台Rocky Linux 9,最小化安装,不装图形界面。之所以选RHEL系而不是Ubuntu,是因为目前企业服务器用RHEL系的比例仍然很高,CentOS停止维护后,Rocky Linux和AlmaLinux是很好的替代品。命令体系、SELinux、firewalld这些组件都和CentOS一脉相承,练完直接能迁移到实际工作中。如果你手头是Ubuntu,练习逻辑一样,只是包管理器用apt替代dnf,防火墙用ufw替代firewalld。
虚拟机网络模式我选的NAT,因为练习阶段不需要被外部网络访问,NAT模式下虚拟机可以正常访问外网,方便下载软件包,同时宿主机的网络环境变化不影响练习。有一点需要注意:如果后面要练习SSH远程登录、或者模拟多台机器通信,建议把网络模式改成桥接,并给虚拟机配置静态IP。NAT模式下虚拟机IP会随宿主机网络变化而变动,排查问题时会多一个干扰变量。
1.2 快照是练习的后悔药
这是整个练习里我认为最重要的一个习惯。每次开始一组新操作前,先给虚拟机打一个快照。比如这次练习,我在开始前拍了快照,等练习到一半,把用户目录权限改乱了,或者把nginx配置搞坏了,直接恢复快照,几秒钟回到干净状态,不需要重新装系统。
具体操作不复杂:VMware菜单栏“虚拟机 -> 快照 -> 拍摄快照”,命名时按“日期-练习主题”的格式,比如“20250104-user-permission”。VirtualBox里对应功能叫“备份”,位置在“控制 -> 生成备份”。
还有一个额外建议:练习时养成用history命令的习惯。每练完一个场景,执行history > ~/practice_log_$(date +%F).txt,把操作记录导出来。一方面方便复盘,另一方面写练习总结时能直接引用当时的命令和输出,这比事后凭记忆写要准确得多。我自己的练习笔记就是这么攒出来的,后面翻看时收获很大。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户权限与安全删除:新手最容易翻车的几个操作
2.1 新建用户别只会useradd
“新建用户”这四个字看起来简单,但实际生产环境里新建一个用户至少有四步:创建用户、设置密码、分配用户组、验证登录权限。很多新手执行完useradd和passwd就觉得完事了,结果用户无法sudo、无法登录,或者登录后连家目录都没有,这些都是细节没做到位。
先看基础版:
bash复制useradd zhangsan
passwd zhangsan
这个操作创建了用户zhangsan并设置密码。但这里有个容易忽略的点:useradd命令在RHEL系默认会创建同名家目录,但在某些精简配置下可能不会。保险起见,创建时加-m参数强制创建家目录:
bash复制useradd -m zhangsan
Debian系更推荐用adduser命令,它是个交互式脚本,会一步步引导你设置密码、填写用户信息,免去记参数的麻烦。RHEL系也有adduser,但它只是useradd的符号链接,并不会交互。
创建用户后,下一步是配置sudo权限。RHEL系里sudo组叫wheel,Debian系里叫sudo。执行:
bash复制usermod -aG wheel zhangsan
注意这里-aG的-a必须带上,它的意思是“追加到组”,不加-a会把用户从其他附属组里移除,容易出问题。我见过有人直接把运维用户从附属组里洗掉,导致很多权限异常。
验证配置是否生效,切换到新用户测试:
bash复制su - zhangsan
sudo whoami
如果输出root,说明sudo授权成功。这一步验证很重要,不要跳过。
2.2 文件权限练习:从755和640开始
用户建好后,紧接着是文件权限练习。我设计了一个场景:创建一个项目目录,让devteam组可以读写,其他人只能读。
bash复制mkdir /data/project
groupadd devteam
usermod -aG devteam zhangsan
chown root:devteam /data/project
chmod 775 /data/project
这里775的含义是:属主rwx、属组rwx、其他人rx。如果想让组内成员能修改文件,目录权限必须是775或770,不能是755,因为755对组只有读和执行权限,没有写权限。
文件层面的权限控制也用同样的思路。创建一个脚本文件,让属主可读写执行,组内成员可读写:
bash复制touch /data/project/deploy.sh
chown root:devteam /data/project/deploy.sh
chmod 770 /data/project/deploy.sh
有一点需要提醒:权限数字前三位的顺序是属主、属组、其他人,对应读4写2执行1。想快速得出权限组合,记住“rwx=7、rw-=6、r-x=5、r--=4”就够了,实在记不住就按4+2+1算一遍,别直接用chmod 777图省事。777意味着任何人可读写执行,在真实场景里基本是安全隐患。
2.3 删除文件夹命令与安全删除习惯
热词里“linux删除文件夹命令”搜索量一直很高,说明这个操作确实是高频需求。删除文件夹有三个选择:rmdir只能删空目录,rm -r递归删除目录及其内容,rm -rf在-r基础上加-f强制删除,不询问确认。
我强烈建议:练习阶段可以试试rm -rf,但养成习惯时一定要建立“先列后删”的肌肉记忆。也就是执行删除前,先执行ls或find看清楚要删的对象:
bash复制ls -la /data/testdir
rm -r /data/testdir
为什么这么强调?因为rm -rf是Linux新手阶段破坏力最大的命令。我在练习时故意做过一次测试:在/tmp下建一个层级很深的目录,模拟误删场景,然后发现删除是不可逆的。没有回收站,没有撤销操作,数据没了就是没了。
更安全的做法是给rm设置别名,让它移动文件到回收目录而不是直接删除。在~/.bashrc里加:
bash复制alias rm='mv -t ~/.local/share/Trash/files'
这样执行rm实际是把文件移动到回收目录,后悔了还能找回来。当然这只适合个人练习环境,生产环境有更严格的备份和审计机制,不依赖别名。
2.4 条件判断里[ -d ]的用途
热词里“linux指令[-d]”指的就是Shell条件测试中的-d选项,它用来判断某个路径是否为目录。这个选项在写脚本时非常常用,比如启动脚本前检查配置目录是否存在:
bash复制if [ -d "/data/project/config" ]; then
echo "目录存在"
else
mkdir -p /data/project/config
fi
类似的还有-f判断文件、-x判断是否可执行、-z判断字符串是否为空。练习时建议把这几个条件测试搭配if语句练一遍,因为后面写任何自动化脚本都会用到。
3. 文件查找、远程传输与跨系统共享
3.1 find命令:多条件组合才是正确用法
单独用find查文件名只是入门,实际工作中基本都是多条件组合。比如“找出/data下7天内修改过的所有日志文件”:
bash复制find /data -name "*.log" -type f -mtime -7
-name按文件名匹配,-type f限定为普通文件,-mtime -7表示修改时间在7天内。三个条件叠加,结果就很精确。
还有一个高频操作:查找大于100MB的文件。排查磁盘空间时特别好用:
bash复制find / -type f -size +100M
这里+100M表示大于100MB,-100M表示小于100MB,不加符号表示精确等于。注意M是大写,大小写错了匹配结果完全不对。
find配合-exec可以做批量操作。比如把/project目录下所有临时文件删除:
bash复制find /data/project -name "*.tmp" -type f -exec rm {} \;
{}是find找到的文件的占位符,\;是-exec命令的结束标记。这个写法比管道加xargs更安全,因为-exec能正确处理文件名中的空格和特殊字符。用管道组合时,文件名带空格会导致xargs把文件名拆成多个参数,命令执行结果不可控。
关于find和locate的选择:locate依赖数据库检索,速度快,但数据库可能不是最新的,新创建的文件搜不到;find直接扫描目录,结果实时准确,速度慢一些。排查问题、写脚本时用find,日常快速找一个记得名字的文件可以用locate。优先级明确。
3.2 scp远程传输:几个参数必须记牢
scp命令对应热词里的“linux scp命令”,是跨机器传文件的经典方式。基础用法:
bash复制# 本地上传到远程
scp /data/project/deploy.sh user@192.168.1.100:/data/backup/
# 远程下载到本地
scp user@192.168.1.100:/data/backup/deploy.sh /tmp/
# 带端口传输
scp -P 2222 /data/project/deploy.sh user@192.168.1.100:/data/backup/
第三个命令的-P大写P,指定远程SSH端口。SSH默认是22端口,改过端口后不加-P会连接失败。传输整个目录用-r:
bash复制scp -r /data/project user@192.168.1.100:/data/
scp适合零散文件、小批量的传输场景。如果是大目录、大量小文件,更推荐用rsync:
bash复制rsync -avz --progress /data/project/ user@192.168.1.100:/data/project/
-a归档模式保留权限和时间戳,-v显示过程,-z传输时压缩,--progress显示进度。rsync支持断点续传和增量同步,传一半中断了重新执行能接着传,这点scp做不到。练习时建议两个都试一遍,体会不同场景下的选择逻辑。
3.3 Windows与Linux共享文件的两种方式
这个场景在混合环境办公时非常常见。Windows和Linux之间共享文件,我从两个方向都做过配置。
方向一:Linux做Samba服务端,Windows访问。装Samba后,编辑/etc/samba/smb.conf,添加共享目录配置:
ini复制[shared]
path = /data/shared
writable = yes
browseable = yes
guest = no
创建Samba用户(Samba有独立的用户体系,需要单独设置密码):
bash复制smbpasswd -a zhangsan
启动服务后,Windows资源管理器地址栏输入\\192.168.1.100\shared,输入账号密码就能访问。这里有个坑:RHEL系默认开SELinux,不调整的话Windows能访问但无法写入,需要执行:
bash复制setsebool -P samba_export_all_rw on
如果不想折腾SELinux,可以先setenforce 0验证确实是SELinux问题,再把策略调好或者把SELinux设成宽容模式。生产环境不建议关SELinux,练习时无所谓。
方向二:Windows开共享,Linux访问。Linux上需要挂载CIFS文件系统:
bash复制mount -t cifs //192.168.1.200/share /mnt/windows_share -o username=administrator
这个方式在Linux作为客户端、Windows作为文件服务器的场景下很实用。注意需要安装cifs-utils包,Debian系和RHEL系包名相同,安装命令分别是apt install cifs-utils和dnf install cifs-utils。
4. 从yum到容器:一条线装完nginx、Python和Docker
4.1 nginx安装与防火墙放行
软件安装练习我建议从nginx开始,因为它安装简单、依赖少、验证效果直观。RHEL系执行:
bash复制dnf install nginx -y
systemctl enable --now nginx
enable --now是enable和start的合并写法,意思是设置开机自启并立即启动。装完后验证是否正常监听:
bash复制ss -tlnp | grep :80
curl http://localhost
ss -tlnp是查看端口监听状态的命令,-t显示TCP、-l显示监听、-n显示端口数字、-p显示进程信息。这一步会看到nginx正在80端口监听,curl访问本机HTTP服务返回nginx欢迎页。
到这里有个关键步骤:如果你在虚拟机里通过浏览器访问nginx页面,往往会失败。原因是RHEL系防火墙默认开启,80端口没有放行。执行:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --reload
这一组命令是练习服务部署必做的操作,很多人装好了nginx但浏览器打不开,原因就在防火墙。排查时先用firewall-cmd --list-all看当前放行策略,比盲目查配置高效得多。
最后一步配置nginx的默认首页位置。RHEL系nginx的默认站点根目录是/usr/share/nginx/html,配置文件在/etc/nginx/conf.d/default.conf。我习惯把练习页面放到/data/www下,然后改配置文件里的root指向,改完执行nginx -t测试配置,再systemctl reload nginx热加载。nginx -t是每次改配置后必须执行的一步,配置有语法错误时reload会失败,但-t能提前发现。
4.2 Python安装:用pyenv代替直接编译
热词“linux系统安装python”指向的是另一个高频需求:系统自带Python版本不够用,需要安装指定版本。
RHEL系自带的Python通常能满足大部分场景,但如果要特定版本(比如3.11、3.12),建议用pyenv来管理,而不是直接源码编译安装到系统目录。原因很简单:多个项目可能需要不同Python版本,pyenv可以自由切换。
bash复制dnf install gcc make patch zlib-devel bzip2-devel readline-devel sqlite-devel openssl-devel tk-devel -y
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
安装完成后的环境变量配置在pyenv提
