1. 为什么需要telnet+ftpget这种特殊方案?
当你面对一台只有telnet服务的Linux设备时,文件传输会变得异常棘手。我去年调试某工厂的旧款PLC控制器时就遇到过这种情况——设备跑的是裁剪版嵌入式Linux,没有ssh、没有scp,甚至没有完整的ftp客户端。这时候,busybox工具箱里的ftpget/ftpput就成了救命稻草。
这类场景通常有三大特征:
- 设备系统极度精简,可能只有几MB的存储空间
- 网络环境封闭,无法随意安装新软件
- 需要传输的可能是配置文件、日志或固件包
传统方案如scp需要openssh组件,完整版ftp客户端又太占空间。而busybox作为嵌入式系统的"瑞士军刀",其内置的ftp工具只有几十KB大小,却完美解决了基础传输需求。实测在RAM仅32MB的路由器上,用ftpget下载5MB的固件包仅需12秒。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从telnet登录到busybox探索
2.1 telnet连接实战
连接设备其实就一行命令:
bash复制telnet 192.168.1.100
但实际使用时要注意:
- 老式设备可能使用非标准端口(比如23端口被改到2323)
- 登录后立即检查
$PATH变量,看看busybox是否在路径中 - 如果提示"telnet: command not found",说明你的本地电脑需要先安装telnet客户端(Ubuntu下用
sudo apt install telnet)
登录成功后,先用busybox --list查看所有可用命令。我曾遇到过设备厂商隐藏了busybox入口的情况,这时可以尝试直接调用/bin/busybox ftpget。
2.2 验证ftpget可用性
直接输入:
bash复制busybox ftpget --help
正常应该看到类似输出:
code复制BusyBox v1.30.1 (2020-06-15 17:14:13 UTC) multi-call binary.
Usage: ftpget [OPTIONS] HOST [LOCAL_FILE] REMOTE_FILE
Options:
-c Continue interrupted transfer
-v Verbose
-u Username
-p Password
-P Port
如果没有返回帮助信息,说明这个busybox编译时没包含ftp功能,那就只能另寻他法了。
3. ftpget下载文件详解
3.1 基础下载操作
假设远程FTP服务器IP是10.0.0.5,要下载/var/log目录下的system.log文件:
bash复制busybox ftpget -u admin -p password 10.0.0.5 ./system.log /var/log/system.log
这里有几个易错点:
- 路径问题:远程路径要写FTP服务器上的绝对路径
- 权限问题:确保FTP用户有读取权限
- 防火墙:检查FTP服务器的21端口是否开放
如果下载大文件时中断,可以加-c参数续传:
bash复制busybox ftpget -c -u admin -p password 10.0.0.5 ./large_file.iso /backups/large_file.iso
3.2 实用技巧锦囊
-
密码含特殊字符:用单引号包裹密码
bash复制busybox ftpget -u admin -p 'abc@123' 10.0.0.5 ./file /path/file -
非标准端口:比如FTP服务器跑在2121端口
bash复制
busybox ftpget -P 2121 -u admin -p password 10.0.0.5 ./file /path/file -
批量下载脚本:
bash复制for file in config1.conf config2.conf; do busybox ftpget -u admin -p password 10.0.0.5 ./$file /etc/$file done
4. ftpput上传文件实战
4.1 基本上传操作
把本地的firmware.bin传到FTP服务器的/updates目录:
bash复制busybox ftpput -u admin -p password 10.0.0.5 /updates/firmware.bin ./firmware.bin
注意参数顺序和ftpget不同:[REMOTE_FILE]在前,[LOCAL_FILE]在后。
4.2 真实场景避坑指南
遇到过最坑的情况是FTP服务器采用被动模式(PASV),而busybox的ftp工具默认是主动模式。这时候需要在FTP服务端配置中:
- 开放被动模式端口范围(如30000-31000)
- 在防火墙放行这些端口
- 添加
pasv_address=外网IP配置
另一个常见问题是传输二进制文件(如固件镜像)时出现损坏,记得FTP服务端要设置为二进制模式:
bash复制# 在FTP服务端的配置文件(如vsftpd.conf)中添加
binary_enable=YES
5. 进阶应用与替代方案
5.1 结合管道实现流式处理
busybox的强大之处在于可以组合命令。比如直接解压远程的压缩包:
bash复制busybox ftpget -u admin -p password 10.0.0.5 - - /backups/data.tar.gz | tar xz
这里的-表示将文件输出到标准输出,然后通过管道传给tar解压。
5.2 当ftp不可用时的备选方案
如果网络环境不允许FTP协议,可以尝试:
-
HTTP下载(如果busybox带wget):
bash复制
busybox wget http://10.0.0.5/file -O local_file -
netcat传输:
在接收端:bash复制
busybox nc -l -p 1234 > file发送端:
bash复制
busybox nc 10.0.0.5 1234 < file -
使用tftp:
bash复制
busybox tftp -g -r remote_file -l local_file 10.0.0.5
6. 安全注意事项
虽然这种方案很实用,但必须注意:
- telnet本身是明文传输,不要在公网环境使用
- FTP密码会出现在命令历史,使用后立即清理:
bash复制history -d $(history | grep ftpget | awk '{print $1}') - 可以考虑使用
ftpget -u $FTP_USER -p $FTP_PASS的方式,通过环境变量传密码 - 传输完成后及时关闭FTP服务
在给某银行维护ATM机时,我们就建立了严格的流程:先用临时密码传输,完成后立即修改密码并审计日志。
