ARTICLE DETAIL

资讯详情

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

Linux命令场景化记忆:从文件系统到网络排查的实战手册

Linux命令场景化记忆:从文件系统到网络排查的实战手册 网上搜Linux常用命令大全一搜一大把复制粘贴下来能背三天三夜。但很多人背完就忘忘了再背等真上了服务器面对一个CPU飙高、日志疯狂刷屏的现场脑子里还是只剩一个top。我做了十几年Linux运维和开发环境管理最大的体会是命令不是靠背的是靠场景逼出来的。你知道某个命令能干什么不重要重要的是遇到问题时知道该调出哪条命令、看懂它的输出、顺着线索往下排查。这篇内容适合刚接触Linux的开发者和运维新人也适合从Windows切过来的同学以及正在准备Linux相关岗位面试的人。我按实际工作里最常用的几个场景来组织文件操作、系统状态、日志文本处理、网络排查、磁盘与用户管理。每一条命令我都会讲清楚什么时候用、为什么用、以及我在生产环境里踩过的坑。1. 先想明白Linux命令到底该怎么记才不算白记1.1 大多数命令大全失效的原因没有场景绑定我见过不少同事的收藏夹里躺着各种命令大全但真遇到问题还是手忙脚乱。原因很简单零散的命令没有和你脑子里的问题库挂钩。命令不是知识是工具。工具的价值在于这时候该拿它而不是它存在于收藏夹里。我自己的学习方式是反向来的先想清楚日常操作里反反复复出现哪几类问题——看目录、找文件、查进程、看端口、搜日志、改配置、装软件。然后再把命令挂到这些问题下面。每遇到一次真实故障就把对应的命令链记一遍比背十遍都管用。1.2 把Linux理解成一切皆文件命令就通了一半Linux设计哲学里最核心的一句话是一切皆文件。听起来抽象实际上非常实用硬盘、U盘、NAS存储挂载之后就是一个目录用ls、cd就能操作运行中的进程信息在/proc目录下每个进程一个数字命名的文件夹系统配置不在注册表里而是一个个文本文件如/etc/ssh/sshd_config甚至连CPU、内存的状态都可以通过读/proc/stat、/proc/meminfo拿到只要你接受了想了解系统状态就去翻文件这个思路很多命令的本质就通了cat是读文件grep是在文件里过滤行awk是把文件按列拆开处理sed是按规则改写文件。命令之间不是孤立的它们本质上是同一套文件思想的组合拳。1.3 三条主线文件系统、进程与网络本文后面所有命令我都会归到这三条主线之下主线解决的核心问题代表命令文件系统什么东西在哪、多大、什么权限、怎么读写ls、find、du、df、mount、chmod进程与服务什么东西在跑、占多少资源、怎么管ps、top、systemctl、kill网络谁连着谁、端口通不通、数据长什么样ip、ss、ping、curl、tcpdump这三条线不是平行的排查问题时经常要串起来。比如端口不通先看端口有没有监听网络线再看监听进程是不是挂了进程线最后看防火墙和路由网络线文件线。脑子里有这条链路命令才有用武之地。1.4 记不住的时候学会查比背重要我到现在也记不全所有命令的参数但这不影响干活因为我熟练掌握了查命令的方法man ls # 官方手册最权威 ls --help # 快速查看用法GNU工具都支持 apropos copy files # 不知道命令名时按功能关键词搜还有一个习惯很值得养成看到不认识的命令先which一下看它来自哪个包再man看说明。生产环境里很多命令不存在的问题其实只是对应的软件包没装装完就有了。提示Windows转过来的朋友可以先建立一组对照记忆dir对应lstype对应catfindstr对应greptasklist对应pstaskkill对应kill。对照着学上手速度会快很多。2. 文件与目录操作最基础也最容易爆雷2.1 ls和cd高手也会看走眼的细节ls是大家接触的第一个命令但很多人对它的理解停留在列出文件名。实际排查问题时我最常用的是ls -l、ls -lh和ls -ltls -l # 详细列表看权限、属主、大小、修改时间 ls -lh # h是human把字节数换成K/M/G肉眼友好 ls -lt # 按修改时间倒序排最新改动的文件在最上面 ls -la # a显示隐藏文件排查配置时经常要带上ls -l输出的第一列是权限共10个字符比如-rwxr-xr-x。第一个字符表示类型-是普通文件d是目录l是软链接。后面9个字符每3个一组分别是属主、属组、其他人的读r、写w、执行x权限。我看过太多新人把chmod 777当成万能药结果网站被上传了木马才反应过来——这个问题后面权限小节专门说。还有个小细节cd -可以回到上一次所在的目录。在长路径之间来回切换排查时这个比重新打一遍路径快多了。2.2 查找文件find的灵魂是组合条件定位文件是运维的家常便饭。find用得好不好直接决定排查效率。我常用的几个组合find /data -type f -name *.log # 按名字找日志文件 find /data -type f -size 500M # 找超过500M的大文件 find /data -type f -mtime 7 # 找7天前修改过的文件 find /data -type f -name *.log -mtime 3 -delete # 清理3天前的日志-type f是文件、-type d是目录-name支持通配符-mtime按修改天数过滤-size按大小过滤。生产环境清磁盘时我经常一条命令把罪魁祸首揪出来find / -xdev -type f -size 1G -exec ls -lh {} \; 2/dev/null-xdev表示不跨文件系统避免跑到其他挂载点浪费时间-exec对每个结果执行后续命令。注意{}和\;的写法少了任何一个都会报错。find和xargs配合也极其常用find /data -type f -name *.tmp | xargs rm -f这里有个坑如果文件名包含空格直接| xargs会把名字拆开导致误删。稳妥做法是find ... -print0 | xargs -0 rm -f用空字符分隔我踩过一次之后就再也不敢偷懒了。2.3 复制、移动、删除rm的教训是用血换来的cp、mv、rm这组命令看着简单但生产环境出大事往往就出在rm上。先说三种常见事故在脚本里写rm -rf $DIR/结果变量没传进去变成了rm -rf /想删/data/bak/*.log结果cd到了别的目录通配符匹配到完全不同的文件find / -name *.log -delete把系统日志文件删了导致服务异常我的习惯是删东西之前先ls确认路径能少删就不多删能用mv移动到临时目录就别直接rm给rm设置别名加-i参数让系统每次删除前都问一遍确认alias rmrm -i这个别名写进~/.bashrc对新手期非常友好。复制和移动相对安全但也有技巧cp -a保留权限、属主、时间戳备份配置时一定要用它而不要用裸cpmv在同一文件系统内是瞬时的跨文件系统则等于复制删除大文件移动时要留意磁盘空间。2.4 软链接和硬链接别再傻傻分不清软链接symbolic link相当于Windows的快捷方式用ln -s创建指向的是路径。硬链接用ln创建指向的是同一份文件数据inode删除任何一个文件名数据都还在。管理服务器时软链接用得更多。最常见的场景是版本切换ln -sfn /usr/local/jdk-17 /usr/local/jdk这样应用配置里永远写/usr/local/jdk升级JDK时只需要改软链接指向不用改一堆配置文件。-f表示覆盖已有链接-n表示把链接当作普通文件处理而不是进入目录这两个参数不加齐第二次执行时会踩坑。判断一个文件是不是软链接看ls -l第一列第一个字符是不是l后面会显示-指向目标。排查文件明明存在却读不到之类的问题时先看看是不是软链接指丢了。2.5 权限与属主chmod 777用多了会出事把权限拆开看r4、w2、x1所有者和组和其他人的权限就是三个数字相加。chmod 754的含义是属主可读可写可执行7属组可读可执行5其他人只读4。这个二进制思路记牢比查表靠谱。生产环境的基本原则是最小权限。日志目录给755配置文件给644脚本给750就够了。chmod 777意味着任何人都能改你的文件网站目录一旦被写入木马后果很严重。修改属主属组用chownchown -R www:www /var/www/html-R表示递归目录下一并修改。新创建文件的默认权限由umask决定默认一般是022所以新文件通常是644。查看当前umask直接敲umask临时修改用umask 027。需要长期生效就写进/etc/profile或~/.bashrc。3. 系统状态与进程管理别把服务器当黑盒3.1 ps、top、free排查问题的黄金三件套服务器卡了、内存爆了、CPU满了最先敲的一定是这三个命令。ps负责快照式查看进程我最常用的两种写法ps -ef # 标准格式看PID、父进程PPID、完整命令行 ps aux # BSD格式额外带CPU和内存占用百分比ps -ef | grep java是排查Java进程的经典姿势。但注意grep java会把grep自身的进程也匹配出来所以我一般写成grep [j]ava用字符组技巧避开自身。top则是动态刷新进入界面后按P按CPU排序、按M按内存排序、按k输入PID可以杀进程、按q退出。我在定位CPU飙高时一般先top按P看一眼是哪个进程再记下PID按c看完整命令行确认是业务进程还是异常进程。free -h看内存要特别留意buff/cache那一行。很多人看到used很高就慌其实Linux把空闲内存拿去做缓存了真正该看的是available这一列。缓存可以被回收不是真的内存不足。3.2 磁盘与负载df和du要说清楚磁盘满了是最常见的生产事故。df -h看文件系统整体使用率du -sh *看当前目录下每个子目录占多大。排查思路一般是这样df -h # 先确认哪个分区满了 du -sh /var/log/* # 逐个目录看哪里占得多 du --max-depth1 -h /data | sort -rh # 按大小排序一目了然du和df结果对不上是常见问题。df显示磁盘满了但du统计不到大文件多半是有文件被进程删除但仍被占用。用lsof | grep deleted找出还在占用已删除文件的进程重启对应服务后磁盘空间就释放了。这个坑我排过好几次每次都靠这招解决。负载方面uptime输出里的三个数字分别是1分钟、5分钟、15分钟的平均负载。负载高不等于CPU忙也可能是大量进程在等磁盘I/O或锁。配合iostat看磁盘等待时间配合vmstat看CPU的wa列才能判断瓶颈到底在哪。3.3 systemd现代Linux服务和日志的统一入口现在主流发行版的服务管理都交给systemd了。基础三板斧systemctl start nginx # 启动 systemctl enable nginx # 开机自启 systemctl status nginx # 查看状态前几行信息量很大改完配置文件后记得systemctl daemon-reload否则改动不生效。查看服务日志用journalctljournalctl -u nginx -f # 跟踪nignx服务日志 journalctl -u nginx --since 10 minutes ago # 看最近10分钟以前排查服务崩溃要翻/var/log/messages或应用自己的日志目录现在大部分服务通过journald统一收拢了journalctl一条命令搞定排查效率提高不少。不过要注意journald日志如果一直不清理也会占满磁盘必要时配置SystemMaxUse限制日志体积。3.4 冷门但实用修改进程名到底怎么改热搜里有个词叫修改进程名称这确实是运维会遇到的真实需求。最常见的场景是监控系统按进程名告警但Java进程默认名字都是java一跑好几个根本分不清谁是谁或者脚本进程在ps里显示的是解释器名字看不出业务含义。针对不同场景方法不一样# 场景一启动脚本时直接指定适用bash、python等解释型脚本 exec -a my_custom_name python3 myserver.pyexec -a会覆盖argv[0]ps里看到的进程名就变成了my_custom_name。注意要和exec连用否则子进程会继承原来的名称。# 场景二Python程序内部自己改名 pip install setproctitle python3 -c import setproctitle; setproctitle.setproctitle(my_worker)# 场景三Java进程通过启动参数指定 java -Dsun.java.commandmy-service -jar app.jarJava自带支持设置后jps或ps能看到进程别名对排查多个Java服务特别有用。需要说明的是修改进程名是给监控和排查看的标签改变不了进程的实际行为。生产环境里我一般配合systemd的Description和监控项的配置一起用这样告警里的名字才有业务含义。3.5 定时任务crontab写了不生效的常见原因定时任务也是日常刚需。crontab -e编辑当前用户的crontabcrontab -l查看。语法是五个时间字段加命令*/5 * * * * /opt/scripts/check.sh # 每5分钟执行一次 0 2 * * * /opt/scripts/backup.sh # 每天凌晨2点执行我踩过三个坑一是脚本有执行权限但crontab里没写绝对路径导致找不到命令二是环境变量和交互式shell不一样脚本里用到JAVA_HOME之类需要在脚本里自己export三是脚本输出没人看日志全丢了。建议统一写成0 2 * * * /bin/bash /opt/scripts/backup.sh /var/log/backup.log 21把标准输出和错误都重定向到日志文件出问题有迹可循。4. 文本处理三剑客日志排查和脚本处理的底气4.1 grep最常用但大多数人用得糙grep是日志排查的第一主力但很多人只会grep keyword file.log。实际工作中这几个参数一次用齐grep -E ERROR|Exception app.log # 扩展正则匹配多个关键词 grep -v ^# /etc/nginx/nginx.conf # 排除注释行看有效配置 grep -c ERROR app.log # 统计行数 grep -n timeout app.log # 显示行号定位参考 grep -A 5 -B 5 OutOfMemory app.log # 显示匹配前5行和后5行上下文递归搜索整个目录用-r再配合--include限定文件类型grep -r redis /data/config --include*.conf排查生产问题时我经常tail -f app.log | grep --line-buffered ERROR实时过滤出错误日志前台挂着看。--line-buffered保证每读到一行就输出不加这个参数管道缓冲会把输出憋成一块块根本起不到实时观察的效果。4.2 sed按照规则改文件的能手sed的全称是流编辑器擅长按行处理。工作中最实用的几种sed -n 5,10p app.log # 打印第5到10行 sed -i s/old_api/new_api/g app.conf # 把文件里所有old_api替换成new_api sed -i.bak s/old_api/new_api/g app.conf # 替换前先备份-i直接改文件不用重定向到临时文件再mv回来。我建议生产环境替换配置时一定加备份后缀sed -i.bak会生成app.conf.bak万一替换错了还能一键还原。按时间范围提取日志也是sed的看家本领sed -n /2024-01-01 10:00/,/2024-01-01 10:30/p app.log正则匹配到第一个时间点开始打印到第二个时间点停止。排查某段时间接口突然超时这种问题这条命令能精确截出那30分钟的完整日志比grep一个个关键词筛高效太多。4.3 awk按列拆数据统计神器awk默认把每一行按空白拆成列$1是第一列、$2是第二列、$NF是最后一列。日志分析最经典的应用是统计访问量awk {print $1} access.log | sort | uniq -c | sort -rn | head -20这条命令链的意思是把每行第一列通常是IP打印出来排序统计每个IP出现次数再按次数倒序展示前20个。它可以瞬间告诉你谁在疯狂请求你的服务器。类似地统计不同HTTP状态码的数量awk {print $9} access.log | sort | uniq -cawk还支持条件判断和内置变量比如筛选耗时超过2秒的请求awk $NF 2 {print $0} app.log注意这里$NF是最后一列前提是日志格式里最后一列是耗时。日志格式五花八门用之前先tail -3 app.log确认列的顺序和分隔符必要时用-F指定分隔符比如awk -F: {print $1}。4.4 日志排查实战一条完整的问题定位链路举一个我最近处理的例子。某服务反馈接口变慢我的排查流程是这样的# 第一步确认当前日志有没有大量报错 tail -50 app.log # 第二步看最近5分钟错误日志量 tail -5000 app.log | grep -c ERROR # 第三步按关键字抓取具体报错上下文 grep -A 10 Exception app.log | tail -80 # 第四步统计哪个调用方IP请求最多 awk {print $1} access.log | sort | uniq -c | sort -rn | head -5 # 第五步找出响应时间最长的请求 awk $NF 5 {print $1, $7, $NF} access.log | sort -k3 -rn | head -10这一套下来基本能定位到某个IP在刷接口导致慢查询堆积日志里出现连接池超时异常。整个过程不超过十分钟靠的就是grep、awk、sort、uniq这组命令的串联。在面试中考官问如何从日志里找出访问量最高的IP答案就是上面那条awk管道命令链这是高频考点。4.5 顺手提一句vim改配置离不开它日志看得再明白最终还是要改配置。服务器上没有图形界面vim是绕不开的。不需要学多深记住这几个高频操作就够了i进入编辑模式Esc退出:wq保存退出:q!不保存退出:set nu显示行号/keyword搜索关键字后按n跳下一个dd删除当前行yy复制、p粘贴。如果vim用不惯可以用sed -i脚本来改但要非常小心正则写对。我一般小改动用sed复杂调整还是老实开vim。5. 网络排查与内网共享上网配置从连接到转发5.1 查看网络信息新命令ip和ss别再天天ifconfig老一代命令ifconfig和netstat在很多最小化安装的Linux上已经没有了现在官方推荐的是ip和ssip addr # 查看所有网卡和IP ip route # 查看路由表 ip link set eth0 up # 启用网卡 ss -tnlp # 查看所有TCP监听端口及对应进程 ss -tnp # 查看所有TCP连接及对应进程ss -tnlp是排查端口问题的第一命令。比如服务起不来提示端口被占用用ss -tnlp | grep 8080看是谁占着8080比netstat输出更快、信息更全。-t是TCP、-n不反解域名、-l只看监听、-p显示进程这几个参数组合使用率极高。5.2 连通性排查的标准姿势分层定位网络不通时不要瞎试按层次往下走ping 192.168.1.1 # 第一层链路通不通ICMP telnet 192.168.1.100 3306 # 第二层目标端口通不通TCP curl -I http://192.168.1.100 # 第三层应用层通不通HTTPping通说明链路活了但端口不一定通telnet能连上说明TCP端口开着但应用可能还在报错。DNS问题用dig或nslookup查dig example.com cat /etc/resolv.conf # 看系统DNS配置还有一个技巧curl -I看HTTP响应头能从Server、Date、Location等信息里快速判断是哪个Web服务的响应、有没有被代理转发。抓包工具tcpdump是终极手段tcpdump -i eth0 port 80 -nn -c 100-i指定网卡-nn不解析主机名和端口名-c抓100个包就停。怀疑应用层有问题但看不出端倪时抓包能一锤定音。5.3 内网共享上网的合法配置一台Linux做NAT路由器热搜里有linux 共享上网 办法其实这个需求很常见办公室或家里有一台Linux主机外网连着它内网其他设备想通过它上网或者虚拟机需要让宿主机的网络共享出来。原理就是让Linux开启内核转发再用iptables做NAT网络地址转换相当于把它变成一台软件路由器。这是标准的网络管理技术核心步骤如下# 第一步开启内核IP转发 echo 1 /proc/sys/net/ipv4/ip_forward # 持久化写入配置文件 echo net.ipv4.ip_forward 1 /etc/sysctl.conf sysctl -p接下来设置iptables的NAT规则。假设eth0是连接外网的网卡eth1是连接内网的网卡iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPTMASQUERADE是IP伪装适用于外网口IP不固定的场景比如宽带拨号。如果外网IP固定可以用SNAT指定真实IP性能略好iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.10内网设备把网关指向这台Linux的内网IP比如192.168.10.1DNS填公共DNS或内网DNS即可。配置过程中有几个容易忽略的点一是确认系统防火墙没有拦截forward链很多发行版默认iptables策略是DROP即使加了规则也可能不生效二是内网设备需要设置正确的网关和DNS光有NAT没有网关地址是白搭三是如果重启后规则丢失需要把iptables规则保存到/etc/iptables/rules.v4或用iptables-save导出后自启动加载。我在虚拟机共享网络、临时Wi-Fi热点共享等场景都用过这套方案稳定性和正规路由器没有本质差别。5.4 文件传输与远程连接scp、rsync是日常腿脚排查完网络日常的文件传输也常用命令走。scp简单直接scp /data/app.tar.gz user192.168.1.100:/data/ scp -r /data/config user192.168.1.100:/data/rsync则更适合增量同步和大目录rsync -avz --delete /data/app/ user192.168.1.100:/data/app/-a归档模式保留权限和时间戳-v显示过程-z传输时压缩--delete让目标目录和源目录完全一致。定时备份数据、同步多台服务器配置rsync几乎是标准答案。注意首次同步大目录时耗时较长建议先用--dry-run试跑一遍看会传输哪些文件避免误操作把目标目录清空。6. 磁盘挂载、用户管理与软件安装从能用到好用6.1 挂载NAS和远程存储mount与fstab的配合热搜里有linux挂载nas存储这确实是日常高频操作。无论是群晖、FreeNAS还是云上的NFS服务挂载思路是一样的mount -t nfs 192.168.1.100:/volume1/share /mnt/nas df -h # 确认挂载成功-t nfs指定文件系统类型把远程NAS的共享目录挂到本地/mnt/nas。挂载后本地读写这个目录就是在读写远程存储对应用完全透明。要想重启后自动挂载写进/etc/fstab192.168.1.100:/volume1/share /mnt/nas nfs _netdev,noatime 0 0_netdev这个选项很重要它告诉系统这是网络设备等网络就绪后再挂载不加的话开机时网络还没起来挂载会失败。noatime减少写操作提升性能。卸载时如果提示target is busy说明有进程在使用挂载点。用lsof | grep /mnt/nas找出占用进程确认无碍后强制卸载umount -lf /mnt/nas-l是懒惰卸载-f是强制适合NFS挂载卡死的情况。另外要注意权限映射NAS上的文件属主是远程系统的UID本地可能显示为nobody或数字必要时用mount -o uid1000,gid1000做映射。6.2 用户与组管理别用root裸奔新建用户、授权、删用户是Linux服务器管理的基本功useradd -m -s /bin/bash zhangsan # 建用户-m建家目录-s指定shell passwd zhangsan # 设置密码 usermod -aG sudo zhangsan # Debian系加入sudo组 usermod -aG wheel zhangsan # CentOS系加入wheel组 userdel -r zhangsan # 删除用户-r同时删家目录为什么要强调-m很多发行版默认不建家目录用户登录后连个落脚点都没有。我见过不少系统里用户没家目录导致各种工具报错。日常操作的原则是能用普通用户就别用root。需要提权时用sudo不要直接切换到root干所有活。su和sudo的区别很简单su切到另一个用户身份sudo是当前用户临时以root权限执行单条命令。生产环境里统一用sudo并对普通用户做白名单授权比所有人共享root密码安全得多。6.3 软件包管理apt和yum的对照Debian系Ubuntu、Debian和RedHat系CentOS、Rocky、Fedora的包管理命令行很不一样但概念完全对应操作Debian系RedHat系更新软件源apt updateyum makecache安装软件apt install nginxyum install nginx卸载软件apt remove nginxyum remove nginx搜索软件apt search nginxyum search nginx更新已装软件apt upgradeyum update装软件遇到缺依赖时优先用包管理器它会自动解决依赖。需要从源码编译安装时标准三步是./configure --prefix/usr/local/app make -j4 make install-j4是并行编译四核机器明显快不少。编译报错缺依赖时先看报错里的头文件或库名用apt search或yum search找对应的-dev或-devel包装上再说。这个缺什么包就装什么-devel包的思路能解决80%的编译失败问题。国产化Linux环境如麒麟、统信UOS大多兼容Debian系或RedHat系的命令体系本文涉及的这些常用命令和管理思路在这些发行版上基本通用。6.4 效率工具history、alias、快捷键是隐藏福利最后分享几个提升日常操作效率的小习惯。history看历史命令这个大家都用。但很多人的问题是历史太长翻不回来。配合反向搜索用Ctrl r # 反向搜索历史命令输入关键字就能找到敲history | grep keyword也是一种方式但实时交互的CtrlR明显更快。alias能帮你省掉重复输入。比如alias llls -l --colorauto alias ggrep -E临时别名只在当前会话有效想永久生效写进~/.bashrc然后source ~/.bashrc。还有一组快捷键用惯了真的回不去Ctrl a跳到行首Ctrl e跳到行尾Ctrl w删除前一个单词Ctrl u删除整行。在服务器上输命令输错了不用狂按退格键效率完全不一样。排查环境时也用得到which、whereis、type这三个查命令来源的工具which查PATH里可执行文件的路径whereis连源码和手册位置都查type能告诉你是外部命令还是shell内建命令。比如type cd会显示cd是shell内建type ssh会显示它在/usr/bin/ssh。搞清楚命令的来源理解为什么有些命令在脚本里找不到这种问题时会更透彻。最后再分享一点个人体会。Linux命令这件事没必要强求一次记住所有参数但一定要把排查问题的思路练成一个习惯文件系统、进程、网络三条主线搭好骨架常用命令填充到场景里再用日志分析把文本处理三剑客串起来。我每接手一台新服务器第一件事就是把df -h、free -h、ss -tnlp、uptime各敲一遍花不了一分钟但对机器状态心里就有底了。这种场景驱动、动手优先的方式比捧着命令手册从头背到尾管用得多。
返回列表