ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux命令行入门:从环境搭建到Shell脚本的完整实战路径

Linux命令行入门:从环境搭建到Shell脚本的完整实战路径 Linux命令行这个入门方向看起来到处都是教程但真正能落到实处的并不多。很多资料上来就让你背命令背完还是不知道在服务器上怎么排查问题、怎么部署服务。这篇文章我打算换一种写法按实际使用顺序讲先搭好环境再处理文件和用户然后看进程、网络和服务最后把重复劳动用 Shell 脚本固化下来。适合刚开始学 Linux 的人也适合准备做运维、或者写代码时需要自己部署服务的人。最值得先记住的一点是命令行不是靠背会的而是靠一步步“最小可运行步骤”跑熟的。1. 在开始敲命令之前先把 Linux 的思维装进脑子1.1 先搞清楚选哪个发行版用哪种方式连接很多新手会卡在第一步Linux 系统版本太多了到底装哪个。如果只是学习我建议先从 Ubuntu Server 或 CentOS Stream 这一类使用面广的发行版开始。原因不是它们“最好”而是教程多、踩坑案例多、包管理方式常用。Debian 系的 apt、RHEL 系的 yum/dnf这两个体系覆盖了绝大多数服务器场景。你学会其中一个换到另一个主要就是包管理命令的差异。安装方式有两种选择。第一种是本地虚拟机用 VirtualBox 或 VMware 装一个最小化系统。最小化安装没有图形界面强迫你从命令行开始其实学得更快。第二种是云服务器很多云厂商都有免费试用或按量付费的实例选一个 1 核 2G 的配置就够用了。云服务器的好处在于你后续学网络命令、远程连接、部署服务时体验更接近真实生产环境。连接方式上Windows 用户我推荐直接用 PowerShell 自带的 ssh 命令或者 Windows Terminal 加 OpenSSH 客户端不需要再装额外软件。macOS 用户直接用自带的 Terminal 就行。不建议一上来就折腾复杂的终端美化先把命令跑通再考虑效率工具。1.2 登录后的第一轮检查登录到服务器或者虚拟机之后不要急着敲一大堆命令。先告诉自己这一轮只做环境确认不做任何修改。按顺序检查下面几项# 查看系统发行版信息 cat /etc/os-release # 查看内核版本 uname -r # 查看当前用户 whoami # 查看当前所在目录 pwd # 查看主机名 hostname这个过程很重要。很多教程默认你已经知道自己的系统是什么版本、是什么架构然后直接让你安装软件。结果你照着敲报错说找不到软件包。先确认系统类型后面的安装命令才不会乱。再补一个常见习惯检查系统架构。uname -mx86_64 是常见的服务器架构如果输出 aarch64 说明是 ARM 架构安装包要选对版本。这个点在后面装 Docker、装某些二进制工具时非常容易踩坑。1.3 命令行学习的正确节奏我见过不少新人学命令行喜欢一次把几十个命令背下来结果到了实操还是不知道从哪里入手。更合适的方式是先跑通一个完整小任务再扩展命令量。比如第一个任务可以定成这样登录系统创建一个文件夹新建一个文件编辑文件内容查看文件内容打包解压。这个流程覆盖了 cd、mkdir、touch、vim/nano、cat、tar 等最常用命令。跑通这个流程之后你才需要一个命令大全当参考资料。学习节奏上还有一个建议每学一个新命令先跑man或者命令 --help但只关注自己需要的部分不用全看。比如ls的 help 输出很长你实际常用的可能就-l、-a、-lh、-lt这几个参数。注意如果man打开后不知道怎么退出按q键。这个细节能避免你卡在帮助页面里不敢动。2. 文件与目录操作Linux 里的一切操作都从这里开始2.1 先理解目录结构再记命令Linux 的命令很多都不是单独存在的它们和目录结构强相关。你如果不知道/etc是什么、/var是什么很多命令只是表面跑通。抛开复杂的细节先用理解的方式记几个目录/etc系统配置文件的集中地。改了这里面的配置通常需要重启服务或重新加载。/var可变数据日志、缓存、临时文件一般在这里。/home普通用户的家目录。/rootroot 用户的家目录。/tmp临时目录重启后内容可能会清空。/opt很多第三方软件会安装到这里。很多新手会问“为什么要记这些”因为当你看到find /etc -name *.conf这种命令时如果不清楚/etc是什么就不明白为什么要去那里找。2.2 高频命令从查看、搜索到删除先列一组我平时使用频率最高的文件操作命令每个都只给最实用参数。# 列出目录内容-l 显示详细信息-a 显示隐藏文件-h 人性化大小 ls -lah # 切换目录 cd /etc # 查看当前目录 pwd # 创建目录-p 支持多级创建 mkdir -p /data/logs # 创建空文件 touch test.txt # 查看文件内容 cat test.txt # 分页查看大文件 less /var/log/syslog # 查看文件头部 head -n 20 test.txt # 查看文件尾部-f 实时跟踪 tail -n 20 test.txt tail -f /var/log/syslog再往下是搜索和查找这几个命令在服务器上非常常用。# 按文件名查找 find /data -name *.log # 按文件名查找并忽略大小写 find /data -iname *.log # 在文件内容里搜索关键词 grep -r error /data/logs/ # 统计搜索结果数量 grep -c error /data/logs/app.log说到删除这是一个需要特别谨慎的话题。Linux 里删除文件命令是rm但它和 Windows 回收站完全不同一旦删除基本无法恢复。# 删除单个文件 rm test.txt # 删除目录-r 递归-f 强制 rm -rf /data/old/ # 推荐的安全操作删除前先列出来 ls -la /data/old/我这里特别提醒一下rm -rf的使用边界。尽量不要带着f参数在 root 用户下乱敲。新手最容易出现的问题就是把路径写错或者路径变量为空结果把不该删的目录删了。更稳妥的做法是先用ls确认目录内容再用相对路径绝对路径双重检查。2.3 权限系统rwx、chmod、chown、sudoLinux 的权限模型其实不复杂就是三类角色、三种权限。三类角色是文件所有者u、用户组g、其他人o。三种权限是读r4、写w2、执行x1。数字权限就是把它们加起来。# 查看文件权限 ls -l # 将 owner 设置为可读写执行组和其他人设为可读执行 chmod 755 script.sh # 递归修改目录权限 chmod -R 750 /data/project/ # 修改文件所有者 chown user1:group1 file.txt这里有一个很常见的误区为什么我的脚本无法执行明明代码没问题。很多时候不是代码问题而是没有执行权限。ls -l看一下如果权限位是-rw-r--r--说明没有x权限需要执行chmod x script.sh。还有一个边界要注意sudo不是让你随便用 root 跑命令的。虽然很多教程让大家sudo一把梭但实际运维里用 root 执行错误命令的代价非常高。学习阶段可以sudo但在真实服务器上要克制。3. 用户、进程和服务管理从入门到能处理日常问题3.1 新建用户、删除用户和用户组运维工作里新建用户是高频操作。比如给新同事创建登录账号给某个应用单独建一个运行用户。新建用户不是简单执行一条命令就结束还要考虑家目录、Shell、密码策略。# 新建用户并创建家目录、指定 bash useradd -m -s /bin/bash zhangsan # 设置密码 passwd zhangsan # 查看用户信息 id zhangsan # 新建用户组 groupadd devteam # 将用户添加到组 usermod -aG devteam zhangsan # 删除用户并删除家目录 userdel -r zhangsan这里的-aG参数建议记住。-a表示 append 追加-G表示附加组。如果不加-a可能会把用户从其他附加组中移除这个坑虽然不常遇到但遇到了会让你排查很久。还有一个细节新建用户后最好先让用户执行一下sudo -i或者测试一下登录确保家目录权限正常。很多登录问题都出在/home/用户名目录的属主不对。3.2 进程查看、后台运行与结束进程日常排查服务器卡顿、程序异常离不开进程操作。# 查看所有进程 ps aux # 按关键词过滤进程 ps aux | grep nginx # 动态监控进程和资源 top # 按 CPU 排序 top -o %CPU这里我建议把ps aux作为一个基础模板记住。它的输出里第一列是用户第二列是 PID第三、四列是 CPU 和内存占用最后一列是命令。排查问题时先看 PID再看命令再决定要不要结束进程。结束进程的命令是kill但它不是只执行就完事。# 正常结束进程 kill 1234 # 强制结束 kill -9 1234 # 按进程名结束 pkill nginxkill -9虽然常被当成“万能结束大法”但我不建议第一反应就用它。因为它直接让进程没有机会清理资源、保存状态。有些服务被kill -9之后数据不一致或者端口没有释放反而更难处理。先用普通kill过几秒再看进程是否还在如果还在再用-9。后台运行也是新人很容易疑惑的地方。在命令后面加可以让它在后台运行但关闭终端后可能还会退出。更常用的方式是nohupnohup java -jar app.jar app.log 21 这个命令看起来长但拆开很清晰nohup让进程忽略挂断信号 app.log把标准输出写入日志21把错误输出也合并到同一份日志最后的表示后台运行。实际排查程序启动时看到 app.log 21这个写法的频率很高建议直接记住。3.3 systemd 服务管理让任务开机自启当你需要把一个程序变成系统服务比如让 Nginx、Java 应用开机自启就要接触 systemd。以 Spring Boot 应用为例一个简单的服务文件可以这样写[Unit] DescriptionMy Java Application Afternetwork.target [Service] Userzhangsan WorkingDirectory/data/app ExecStart/usr/bin/java -jar /data/app/app.jar Restarton-failure [Install] WantedBymulti-user.target写入/etc/systemd/system/myapp.service之后执行# 重新加载 systemd 配置 systemctl daemon-reload # 启动服务 systemctl start myapp # 设置开机自启 systemctl enable myapp # 查看服务状态 systemctl status myapp # 查看服务日志 journalctl -u myapp -n 50新手最容易忽略的是写完服务文件后忘记daemon-reload。如果不执行这一步systemd 不知道你有新服务文件启动时会提示找不到服务。这个不是大问题但确实能让很多人卡住。Restarton-failure这个配置值得解释一下。它表示进程异常退出时自动重启。常规测试时可以不加部署到真实环境时建议加上。但要注意如果程序因为配置错误一直启动失败自动重启会不断刷日志这也是需要权衡的。4. 网络命令与远程连接最容易踩坑也最常用的场景4.1 先学会看网络状态网络排查是运维和开发都绕不开的场景。我先列一组基础命令# 查看 IP 地址 ip addr # 查看路由 ip route # 测试网络连通性 ping -c 4 baidu.com # 查看端口监听状态 ss -lntp # 查看当前建立的连接 ss -antp # 测试远程端口是否开放 nc -vz 192.168.1.10 22很多老教程还在用ifconfig但新系统里基本要自己安装。我更推荐直接用ip系列命令。输出更清晰而且默认就在大多数发行版里。ss -lntp是查看端口监听最常用的命令。拆开看-l表示监听状态-n不做域名解析-t只看 TCP-p显示进程信息。如果你发现服务启动了但端口没有监听说明服务很可能启动失败或者配置里监听的 IP 不对。ping能通不代表服务正常。很多新手在上游排查时只记得 ping但 ping 走的是 ICMP 协议和我们访问 Web 服务、SSH 服务走的是不同协议和端口。正确的顺序是先 ping 看基础连通性再用nc或curl测端口最后再看应用层。4.2 scp 与 rsync文件传输什么时候用哪个文件传输是 Linux 使用频率很高的一块。最常用的是scp它基于 SSH 协议只要目标机器能 SSH就能传文件。# 从本地上传到服务器 scp /data/file.txt zhangsan192.168.1.10:/data/ # 从服务器下载到本地 scp zhangsan192.168.1.10:/data/file.txt /data/ # 传目录-r 递归 scp -r /data/project/ zhangsan192.168.1.10:/data/scp适合小文件、一次性传输。如果要传大量文件或者需要增量同步我更推荐rsync。# 本地目录同步 rsync -av /data/project/ /backup/project/ # 推送到远程主机 rsync -av /data/project/ zhangsan192.168.1.10:/data/project/ # 删除目标端多余文件 rsync -av --delete /data/project/ /backup/project/rsync的-a是归档模式保留权限、时间戳等信息-v是显示过程。--delete这个参数要小心它会让目标目录和源目录完全一致把目标端多余的文件删掉。如果搞反了源和目标的路径会影响数据安全。我一般会先不带--delete跑一遍确认没问题再加参数。4.3 SSH 连接失败怎么排查SSH 连不上是所有人都遇到过的问题。我按排查顺序拆一下。第一步先确认主机能不能 ping 通ping -c 4 192.168.1.10第二步确认 SSH 端口是否开放nc -vz 192.168.1.10 22第三步确认 SSH 服务是否在目标机器上运行systemctl status sshd第四步确认防火墙规则sudo firewall-cmd --list-all到这里大部分连接问题都能定位。常见的坑有三个一是云服务器安全组规则没放行 22 端口。这个在本地看不到要在云厂商控制台里检查。二是目标机 SSH 配置改了端口但你仍然连 22 端口。查看/etc/ssh/sshd_config里的Port字段。三是用户或密钥问题。如果你用 root 登录提示 Permission denied先确认PermitRootLogin是否设置为 yes。如果是生产环境不建议直接开 root 登录改用普通用户加 sudo 更稳妥。5. 从手敲命令到写脚本入门者怎么自然过渡到 Shell5.1 为什么脚本比自己敲命令更可靠我见过的很多长期停留在“手敲命令”阶段的同学最大问题不是不会命令而是没有形成“自动化”的意识。举个例子备份日志这种操作如果每天手动执行你不仅要记住命令还要避免路径写错、时间写错、漏掉步骤。而把它写成脚本之后只需要执行一次脚本或者交给定时任务结果就稳定了。脚本的价值不只是自动化它还是你在命令行阶段所有知识的“固定成果”。你能写出来的每个脚本都代表你理解命令、判断逻辑和执行顺序。5.2 变量、循环、条件判断的最小模板Shell 脚本入门不需要多复杂的语法。你先记住三个基础结构变量、循环、条件判断。先看一个最小备份脚本#!/bin/bash # 备份指定目录到 /backup按日期命名 backup_dir/data/project target_dir/backup date_str$(date %Y%m%d) mkdir -p $target_dir tar -czf $target_dir/project_$date_str.tar.gz $backup_dir echo 备份完成: $target_dir/project_$date_str.tar.gz这个脚本用到了三个关键点变量赋值backup_dir/data/project注意等号两边不能有空格。命令替换date_str$(date %Y%m%d)把命令输出存入变量。双引号变量使用$target_dir可以防止路径中有空格时被拆成多个参数。再看一个带循环和判断的例子#!/bin/bash # 检查多个目录是否存在不存在就创建 for dir in /data/logs /data/backup /data/tmp; do if [ ! -d $dir ]; then echo 目录不存在创建: $dir mkdir -p $dir else echo 目录已存在: $dir fi done这里的[ ! -d $dir ]是条件测试-d判断是否为目录!表示取反。if 判断的每个关键字后面都有空格少一个空格脚本就会报错这是 Shell 语法相对严格的地方。5.3 脚本调试bash -x 和 set -e写脚本一定会遇到报错。我这里建议两个调试工具。第一个是bash -xbash -x backup.sh执行时会把每一步展开并打印你能看到变量被替换成了什么值、每个命令执行了什么。定位变量和逻辑问题特别好用。第二个是在脚本开头加set -e#!/bin/bash set -e # 后面的命令 echo 脚本开始set -e的意思是只要中间有命令执行失败脚本立即退出。这在很多场景下能避免“前面命令失败后面还在继续跑”的问题。但它也有副作用如果你明确知道某个命令会返回非零值但可以继续就要用if语句包住或者加|| true。我一般写重要脚本时都会用set -e加set -o pipefail让管道中间的错误也能被捕获。6. 入门后的三个常见坑和一套通用排查思路6.1 路径和权限80% 的报错都发生在这里我排查问题这几年发现新手报错里最集中的两类第一是路径第二是权限。路径类报错常见的表现是No such file or directorycommand not foundCannot open: No such file很多情况下不是文件不存在而是当前工作目录和你想的不一样。比如你用相对路径./script.sh执行但脚本实际放在/data/bin/下面当前目录又在/home/user自然找不到。处理办法是先用pwd确认位置再用ls确认文件确实存在。command not found有一个隐蔽原因是脚本里的命令用了完整路径但你的环境变量 PATH 里没有包含它。或者你当前用户根本没有安装这个命令。最常见的例子是某些发行版默认没有ifconfig、nc需要自己装。权限类的报错表现是Permission deniedOperation not permittedsudo: command not found排查顺序不要乱先用ls -l看文件权限再用id看当前用户和组最后看文件属主是否是当前用户。很多问题不是你没有权限而是文件属主不对。比如chown之后忘了重新登录缓存里有旧权限信息。6.2 磁盘空间、内存、换行符这些隐蔽坑很多“莫名其妙的报错”最后都指向资源问题。磁盘写满时程序可能不报“磁盘满”而是报“Cannot write file”或者干脆假死。养成习惯遇到异常先查磁盘和内存# 查看磁盘使用情况 df -h # 查看某个目录占用 du -sh /data/* # 查看内存 free -h还有一个特别容易被 Windows 用户踩的坑换行符。你在 Windows 上编辑的脚本文件上传到 Linux 执行时可能会报bad interpreter或者$\r: command not found。原因是 Windows 的换行符是 CRLFLinux 期望的是 LF。处理方式很简单sed -i s/\r$// script.sh或者安装dos2unix转换。这个问题几乎所有刚从 Windows 转过来的新手都会遇到一次提前知道能省不少时间。6.3 通用排查顺序现象、输入、环境、参数、工具最后给一套我自己常用的排查链路不一定覆盖所有情况但能解决大多数日常问题。第一步先把现象描述清楚。是启动报错还是运行卡住还是输出不对报错信息里最关键的是前几行不要只看最后一行。第二步检查输入。文件路径对不对、文件格式对不对、输入内容是不是空、用户输入的参数是不是被转义了。第三步检查环境。依赖装了吗、权限够吗、磁盘和内存还剩多少、端口是不是被占用。第四步检查参数。命令或脚本的参数是否符合预期特别是路径末尾有没有斜杠、变量是否为空、并发数是不是设置得太高。第五步再回到工具本身。查日志、查文档、查版本兼容性。很多问题不是你的操作错而是工具版本和系统版本不匹配。这套顺序看起来朴素但效率很高。因为大多数复杂问题前面几步就已经能定位八九成了。Linux 命令行入门真正要积累的不只是命令清单而是遇到问题时的判断顺序和排查习惯。把最小案例跑通把权限和路径理顺把脚本调试跑熟再去扩展其他命令整体的学习进度反而更快。
返回列表