BusyBox集成telnetd实现远程登录:项目应用示例

忙得动不如连得上:用 BusyBox 的 telnetd 实现嵌入式远程登录实战

你有没有过这样的经历?
手里的开发板通电后黑屏无输出,串口线插了半天也只看到一串启动日志戛然而止;现场设备突然宕机,但没人能去拆机接线;新烧录的固件起不来系统,可 JTAG 又不支持动态调试……

这时候,如果设备能“自己说话”,哪怕只是让你敲个命令看看dmesg,问题可能瞬间迎刃而解。

在资源紧张、网络可用的嵌入式环境中,我们不需要花里胡哨的 Web 管理界面或加密 SSH 隧道——我们要的是最快的方式连进去看一眼。而这个“最短路径”往往就是:BusyBox + telnetd

这不是最优的安全方案,但它是最高效的调试手段。今天我们就来聊聊,怎么让一块跑着 Linux 的小板子,在几秒内变成一个可远程登录的命令行终端。


为什么是 BusyBox?因为它“省到极致”

先说个现实:很多嵌入式系统的 Flash 大小只有 8MB 或 16MB,RAM 甚至不到 64MB。在这种环境下,装一套 GNU Coreutils 加 OpenSSH,光依赖库就能占掉一半空间。

BusyBox,作为“嵌入式 Linux 的瑞士军刀”,把上百个常用工具(ls,cp,ps,mount,init……)全都塞进了一个二进制文件里,通常编译出来还不到 1MB。

它是怎么做到的?
简单讲,它用了“一程序多用途”的设计:

  • 所有命令都指向同一个可执行文件/bin/busybox
  • 当你输入ls,其实是执行了busybox ls
  • 内部通过判断$0(即调用名)决定运行哪个功能模块

于是,/bin/ls/bin/cp/bin/grep全都是软链接到/bin/busybox,节省了大量磁盘和内存开销。

更重要的是,它自带了telnetd这个轻量级 Telnet 服务,无需额外安装任何包,只要配置好网络,就能立刻实现远程访问。


telnetd:明文传输但快如闪电的远程入口

别急着喷“Telnet 不安全”。我们知道它的问题——所有数据包括密码都是明文传输。但在内网调试阶段,尤其是在产品原型期,可用性远胜于安全性

相比 Dropbear 或 OpenSSH 动辄几十 KB 的加密开销和复杂的密钥管理,telnetd几乎零负担:

  • 占用内存极少
  • 启动速度极快
  • 不依赖 PAM、NSS、SSL 库等复杂组件
  • 默认集成在 BusyBox 中,开关一个选项即可启用

它的核心工作流程也很直接:
1. 监听 TCP 23 端口(可自定义)
2. 客户端连接后,创建伪终端(pty)
3. 派生 shell 进程(通常是/bin/sh
4. 在客户端和 shell 之间转发字节流

整个过程就像给你的设备接了个“虚拟键盘+显示器”,只不过走的是网线。

📌 提示:生产环境务必禁用!仅限开发调试使用!


关键参数怎么配?这几个选项必须掌握

telnetd虽小,但关键参数不多,记牢这几个就够用了:

参数作用说明
-l USER自动以指定用户登录,跳过用户名输入(适合单用户系统)
-p PORT修改监听端口(比如-p 2323避免被扫描发现)
-i禁止认证,直接启动 shell(极度危险,仅用于救砖)
-F前台运行,方便查看日志输出(调试时强烈推荐)

🌰 常见用法示例:

# 以 root 用户身份启动,前台运行便于观察 telnetd -l root -F & # 使用非标准端口,降低暴露风险 telnetd -l root -p 2323 & # 救急模式:无密码直连(慎用!) telnetd -i -F &

这些命令可以写进启动脚本,系统一联网就自动开启服务。


怎么让它开机自启?三步搞定

要在设备上电后自动提供远程登录能力,我们需要完成三个关键步骤:

第一步:确保根文件系统由 BusyBox 构建

这是前提。检查你的/bin/sh是否指向 BusyBox:

$ file /bin/sh /bin/sh: symbolic link to busybox

同时确认/sbin/init也是 BusyBox 的 init 实现。

第二步:编写网络初始化脚本

创建/etc/init.d/S50network

#!/bin/sh # S50network - 初始化网络并启动telnet服务 echo "Starting network setup..." # 设置静态 IP(根据实际网络调整) ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up # 添加默认网关(可选) route add default gw 192.168.1.1 # 启动 telnet 服务 echo "Launching telnetd..." telnetd -l root -p 23 & echo "Network and remote access ready."

赋予执行权限:

chmod +x /etc/init.d/S50network

第三步:注册到系统初始化流程

如果你使用的是传统 SysV 风格 init,编辑/etc/inittab,加入:

::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty -L ttyS0 115200 vt100

其中rcS会调用/etc/init.d/S50network完成网络和服务启动。

⚠️ 注意:某些 Buildroot/Yocto 构建系统可能使用 systemd 或其他 init 方式,需对应调整启动机制。


登录体验也能优化?加个欢迎页更专业

虽然telnetd本身不支持 banner 显示,但我们可以通过 shell 的初始化脚本实现类似效果。

编辑/root/.profile(首次登录时会被/bin/sh自动加载):

# .profile - 登录时执行的环境脚本 echo "" echo "==================================" echo " Embedded Debug Console" echo " Powered by BusyBox + telnetd" echo " 🔧 For development only!" echo "==================================" echo "" # 设置提示符,增强辨识度 export PS1='[\u@\h:\w]\$ '

再确认/etc/passwd中 root 的 shell 是/bin/sh

root:x:0:0:root:/root:/bin/sh

下次 telnet 登录时,你会看到清晰的欢迎信息和定制化提示符,团队协作时再也不怕误操作别的设备。


实战中的那些“坑”与应对策略

❗ 问题一:telnet 能连上,但卡住不动?

常见原因:shell 没有正确启动,或者.profile脚本中有死循环/阻塞性命令。

✅ 解决方法:
- 改用sh -x .profile手动测试脚本逻辑
- 移除耗时操作(如 ping 外网)
- 确保每条命令都有超时控制

❗ 问题二:网络起来了,但 telnetd 没响应?

检查点:
- 是否已执行telnetd命令?
- 是否防火墙规则阻止了端口?
- 是否多个进程占用 23 端口?

✅ 排查命令:

netstat -tuln | grep :23 ps | grep telnetd

❗ 问题三:忘记关闭 telnetd,发布后被扫到了怎么办?

📌最佳实践建议
- 开发阶段用 GPIO 按钮触发启动:长按某个按键才开启 telnetd
- 编译时通过宏控制是否包含 telnetd 功能
- 发布前统一清理/etc/init.d/下的调试脚本

例如:

#ifdef CONFIG_ENABLE_DEBUG_SHELL system("telnetd -l root -p 2323 &"); #endif

安全边界在哪里?这几点必须守住

尽管方便,但telnetd的使用必须划清红线:

允许的做法
- 内网调试专用,配合交换机 VLAN 隔离
- 使用非标准端口(如 2323、8023)
- 结合 iptables 限制源 IP 访问
- 临时开启,调试完立即关闭

绝对禁止的行为
- 暴露在公网环境
- 使用-i参数绕过认证
- 生产镜像保留空密码 root 账户
- 未记录登录行为,缺乏审计

小技巧:可以在启动脚本中加入日志记录:

sh logger -t telnetd "Remote debug service started at $(date)"


它真的过时了吗?不,它正活在调试一线

有人问:“现在都 2025 年了,还在用 Telnet?”

答案是:在正确的场景下,越简单的工具越强大

想象一下:
- 你在调试一款基于 RISC-V 的工业控制器,Flash 只有 8MB;
- 新写的驱动导致 kernel panic,串口输出太快抓不住关键信息;
- 你把telnetd编进了 initramfs,重启后直接telnet 192.168.1.10,进系统一看dmesg,发现问题出在 I2C 时序配置……

这一分钟,省去了拆机、换线、重烧固件的半小时。

这就是BusyBox + telnetd的价值:在最关键的时刻,让你“连得上”


写在最后:工具没有高低,只有适不适合

我们推崇安全,但也尊重效率。
SSH 更安全,但不是每个芯片都能轻松跑起来;
Web 界面更友好,但搞个前端引擎太重了;
而 telnetd,就像一把螺丝刀,朴素、直接、可靠。

当你面对一块刚点亮的板子,最需要的不是一个完美的管理系统,而是一个能让你快速验证想法的通道。

所以,请继续用好这把“老工具”,只要记得:

开发时大胆用,发布前果断关

毕竟,真正的高手,不是不用 Telnet,而是知道什么时候该用,什么时候该收。


💬 如果你在项目中也遇到“连不上、调不动”的窘境,欢迎留言分享你是如何破局的。也许下一次救你命的,正是别人踩过的坑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1135892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I2S协议物理层解析:一文说清数据同步与时钟关系

I2S协议物理层解析:一文说清数据同步与时钟关系在数字音频的世界里,信号的“纯净”与“准确”是工程师永恒的追求。无论是你在智能音箱中听到的一声清澈人声,还是车载音响播放的高保真交响乐,背后都离不开一套精密的通信机制——I…

基于python的食品公司采购管理系统的设计与实现_usr5txay

目录摘要内容关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要内容 食品公司采购管理系统基于Python开发,旨在优化采购流程、提升供应链效率并降低运营成本。系统采用…

RS485和RS232通信电平标准入门级解析

RS485与RS232:不只是电平不同,更是两种通信哲学的碰撞你有没有遇到过这种情况?调试一个传感器,用串口线连上PC就能通,换到工业现场一公里外就频繁丢包;或者想把三四个设备挂到一条线上轮询数据,…

pjsip呼叫控制逻辑设计:拨号、接听、挂断完整示例

pjsip呼叫控制实战:从拨号到挂断的完整逻辑拆解你有没有遇到过这样的场景?在开发一款软电话应用时,点击“拨打”按钮后,对方没反应;或者来电了却无法正确弹出提示;最头疼的是通话中突然断开,日志…

燃料电池功率跟随cruise仿真模型!!!此模型基于Cruise2019版及Matlab201...

燃料电池功率跟随cruise仿真模型!!!此模型基于Cruise2019版及Matlab2018a搭建调试而成,跟随效果很好,任务仿真结束起始soc几乎相同。 控制模型主要包括燃料堆控制、DCDC控制、驱动力控制、再生制动控制、机械制动等模块…

医药信息管理|基于Python + Django医药信息管理系统(源码+数据库+文档)

医药信息管理 目录 基于PythonDjango医药信息管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于PythonDjango医药信息管理系统 一、前言 博主介绍&#xff1a…

加法器学习路径:掌握数字设计的第一步

加法器学习路径:掌握数字设计的第一步在数字电路的世界里,加法器远不止是“两个数相加”这么简单。它是一扇门——推开这扇门,你看到的不是单一功能模块,而是整个数字系统设计思维的缩影。从最基础的逻辑门组合,到影响…

招聘推荐|基于Python + Django招聘推荐系统(源码+数据库+文档)

招聘推荐 目录 基于PythonDjango招聘推荐系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于PythonDjango招聘推荐系统 一、前言 博主介绍:✌️大厂码农…

qthread实时性优化技巧实战分享

QThread实时性调优实战:从理论到工业级音频系统的精准控制你有没有遇到过这样的情况?明明代码逻辑清晰,硬件性能也够用,但系统就是“卡”在某个环节——音视频采集偶尔丢帧、控制指令响应延迟波动、高频数据处理出现抖动。尤其是在…

深度学习中文情感分析|基于Python + Django深度学习中文情感分析系统(源码+数据库+文档)

深度学习中文情感分析 目录 基于PythonDjango深度学习中文情感分析系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于PythonDjango深度学习中文情感分析系统 一、…

USB3.0接口定义引脚说明与电源管理设计完整示例

深入理解USB3.0接口设计:从引脚定义到电源管理的完整实战指南你有没有遇到过这样的情况?一个USB3.0设备插上去,系统识别成“USB2.0高速设备”,传输速度只有几百MB/s不说,还时不时断连、发热严重。调试几天下来&#xf…

P4145 上帝造题的七分钟 2 / 花神游历各国[线段树 区间开方(剪枝) + 区间求和]

P4145 上帝造题的七分钟 2 / 花神游历各国 时间限制: 1.00s 内存限制: 125.00MB 复制 Markdown 中文 退出 IDE 模式 题目背景 XLk 觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。 题目描述 “第一分钟,X 说,要有数列&#xff0c…

虚拟串口软件权限配置:入门级安全设置指南

虚拟串口安全入门:从配置到防护的实战指南你有没有遇到过这样的场景?调试一个工业通信程序时,手头没有真实PLC设备,于是用虚拟串口软件搭了个仿真环境。一切正常运行——直到某天,另一个后台服务突然“抢走”了你的COM…

新手必看:QListView初学者常见问题汇总

QListView新手避坑指南:从“显示空白”到“流畅交互”的实战解析你有没有遇到过这种情况——代码写完,编译通过,运行起来却发现QListView一片空白?点也点不动,改也改不了。别急,这几乎是每个Qt初学者都会踩…

停车场管理|基于Python + Django停车场管理系统(源码+数据库+文档)

停车场管理 目录 基于PythonDjango停车场管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于PythonDjango停车场管理系统 一、前言 博主介绍:✌️大…

P1637 三元上升子序列[线段树维护 + 离散化]

P1637 三元上升子序列 时间限制: 1.00s 内存限制: 128.00MB 复制 Markdown 中文 退出 IDE 模式 题目描述 Erwin 最近对一种叫 thair 的东西巨感兴趣。。。 在含有 n 个整数的序列 a1​,a2​,…,an​ 中&#xff0c;三个数被称作thair当且仅当 i<j<k 且 ai​<aj…

医院信息管理|基于Python + Django医院信息管理系统(源码+数据库+文档)

医院信息管理 目录 基于PythonDjango医院信息管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango医院信息管理系统 一、前言 博主介绍&#xff1a…

低成本DSP变频器方案全解析:C语言源码、编译码、PCB图纸及物料清单详解

低成本dsp变频器方案&#xff0c;有C语言源码&#xff0c;编译码&#xff0c;PCB图纸&#xff0c;物料清单。最近在捣鼓个低成本DSP变频器方案&#xff0c;折腾了半个月总算有点眉目了。这次直接把PCB图纸甩进立创EDA就能打板&#xff0c;物料成本压到五十块以内&#xff0c;核…

让陪伴不缺席,让安心常在线——智慧康养服务APP功能一览

当忙碌让陪伴变得稀缺&#xff0c;当衰老让安全充满顾虑&#xff0c;这款专为老年群体量身打造的智慧康养服务APP&#xff0c;以AI技术精准匹配适老需求&#xff0c;将情感陪伴、记忆珍藏、安全守护三大核心价值融于一体——既为独居老人筑牢全天候温暖防线&#xff0c;也让异地…

RustFS主要有哪些竞争对手?一文讲透对象存储选型

当MinIO转身拥抱商业化的消息传开&#xff0c;技术圈一片哗然。寻找下一个靠谱的开源对象存储&#xff0c;突然成了许多开发团队的紧急任务。RustFS虽亮眼&#xff0c;但这条赛道上可不止它一位选手。 自从MinIO在2025年底宣布其开源版本进入“维护模式”&#xff0c;不再进行主…