当你面对一台只有telnet服务的Linux设备时,文件传输会变得异常棘手。我去年调试某工厂的旧款PLC控制器时就遇到过这种情况——设备跑的是裁剪版嵌入式Linux,没有ssh、没有scp,甚至没有完整的ftp客户端。这时候,busybox工具箱里的ftpget/ftpput就成了救命稻草。
这类场景通常有三大特征:
传统方案如scp需要openssh组件,完整版ftp客户端又太占空间。而busybox作为嵌入式系统的"瑞士军刀",其内置的ftp工具只有几十KB大小,却完美解决了基础传输需求。实测在RAM仅32MB的路由器上,用ftpget下载5MB的固件包仅需12秒。
连接设备其实就一行命令:
bash复制telnet 192.168.1.100
但实际使用时要注意:
$PATH变量,看看busybox是否在路径中sudo apt install telnet)登录成功后,先用busybox --list查看所有可用命令。我曾遇到过设备厂商隐藏了busybox入口的情况,这时可以尝试直接调用/bin/busybox 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功能,那就只能另寻他法了。
假设远程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
这里有几个易错点:
如果下载大文件时中断,可以加-c参数续传:
bash复制busybox ftpget -c -u admin -p password 10.0.0.5 ./large_file.iso /backups/large_file.iso
密码含特殊字符:用单引号包裹密码
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
把本地的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]在后。
遇到过最坑的情况是FTP服务器采用被动模式(PASV),而busybox的ftp工具默认是主动模式。这时候需要在FTP服务端配置中:
pasv_address=外网IP配置另一个常见问题是传输二进制文件(如固件镜像)时出现损坏,记得FTP服务端要设置为二进制模式:
bash复制# 在FTP服务端的配置文件(如vsftpd.conf)中添加
binary_enable=YES
busybox的强大之处在于可以组合命令。比如直接解压远程的压缩包:
bash复制busybox ftpget -u admin -p password 10.0.0.5 - - /backups/data.tar.gz | tar xz
这里的-表示将文件输出到标准输出,然后通过管道传给tar解压。
如果网络环境不允许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
虽然这种方案很实用,但必须注意:
bash复制history -d $(history | grep ftpget | awk '{print $1}')
ftpget -u $FTP_USER -p $FTP_PASS的方式,通过环境变量传密码在给某银行维护ATM机时,我们就建立了严格的流程:先用临时密码传输,完成后立即修改密码并审计日志。