嵌入式设备传输方式:SCP、SSH文件传输实操
作者:黒漂技术佬
适合人群:嵌入式开发新手,已连通开发板网络
关键词:SSH、SCP、文件传输、开发板
引言
上一篇 HelloWorld 实战中,我们提到了 SCP 传输但没有展开。实际开发中,你编译的程序、配置文件、内核镜像需要频繁在PC和开发板之间来回传。U盘拷贝太慢,串口传输也效率低下,网络传输才是正道。这篇就带你把 SSH 和 SCP 用熟,让文件传输变成一条命令的事。
一、SSH服务基础
1.1 什么是SSH
SSH(Secure Shell)是一种加密网络传输协议,用于在不安全的网络上安全地执行命令和传输文件。在嵌入式开发中,SSH承担两个角色:
- 远程登录:在PC上通过SSH连接开发板终端,不需要串口线
- 文件传输:基于SSH的SCP/SFTP协议,在PC和开发板间传输文件
1.2 开发板端SSH服务配置
大多数Linux开发板出厂时已预装SSH服务(通常是dropbear或openssh-server)。如果没有,需要手动安装:
# Ubuntu/Debian系统开发板aptupdateaptinstallopenssh-server# 或轻量级SSH服务 dropbear(适合资源受限的板子)aptinstalldropbear1.3 启动和检查SSH服务
# 启动SSH服务systemctl start sshd# 或servicesshstart# 设置开机自启systemctlenablesshd# 检查服务状态systemctl status sshd# 确认SSH端口(默认22)是否监听netstat-tlnp|grep221.4 开发板网络配置
确保开发板和PC在同一局域网内,能互相ping通:
# 开发板端查看IPifconfig# 或 ip addr# PC端ping开发板(假设开发板IP为192.168.1.100)ping192.168.1.100# 开发板端ping PC(假设PC IP为192.168.1.50)ping192.168.1.50如果ping不通,依次检查:1) IP是否同一网段 2) 防火墙是否放行 3) 网线/WiFi是否连接 4) 开发板网卡是否up状态。
二、SSH远程登录
2.1 基本登录
# 从PC登录开发板sshroot@192.168.1.100# 指定端口(非默认22端口时)ssh-p2222root@192.168.1.100# 首次连接会提示确认指纹,输入yes即可2.2 SSH免密登录配置
每次输密码太麻烦,用密钥对实现免密登录:
# PC端生成密钥对(如果已有可跳过)ssh-keygen-trsa-b2048# 一路回车即可,默认生成在 ~/.ssh/id_rsa# 将公钥传到开发板ssh-copy-id root@192.168.1.100# 之后登录不再需要密码sshroot@192.168.1.1002.3 常用SSH参数
| 参数 | 作用 | 示例 |
|---|---|---|
-p | 指定端口 | ssh -p 2222 root@192.168.1.100 |
-i | 指定私钥文件 | ssh -i ~/.ssh/mykey root@192.168.1.100 |
-C | 压缩传输 | ssh -C root@192.168.1.100 |
-f | 后台执行 | 配合端口转发使用 |
-L | 本地端口转发 | ssh -L 8080:localhost:80 root@192.168.1.100 |
三、SCP文件传输
3.1 SCP命令语法
SCP(Secure Copy Protocol)基于SSH协议,语法简单直观:
scp[参数]源文件 目标位置3.2 从PC传文件到开发板(上传)
# 传输单个文件scphello_arm root@192.168.1.100:/root/# 传输到指定目录并改名scphello_arm root@192.168.1.100:/root/myapp# 传输多个文件scpfile1 file2 root@192.168.1.100:/root/# 传输整个目录(-r 递归)scp-r~/embedded_projects/ root@192.168.1.100:/root/projects/3.3 从开发板传文件到PC(下载)
# 下载单个文件scproot@192.168.1.100:/root/log.txt ./# 下载整个目录scp-rroot@192.168.1.100:/root/logs/ ./3.4 常用SCP参数
| 参数 | 作用 | 说明 |
|---|---|---|
-r | 递归传输 | 传目录时必须加 |
-P | 指定端口 | 注意是大写P(SSH是-p小写) |
-C | 压缩传输 | 传大文件时节省带宽 |
-v | 显示详细信息 | 排查问题时用 |
-p | 保留原文件属性 | 保留时间戳和权限 |
3.5 指定端口传输示例
# 如果开发板SSH端口为2222scp-P2222hello_arm root@192.168.1.100:/root/四、文件传输实战
4.1 实战场景:传输编译好的程序
# PC端:编译程序arm-linux-gnueabihf-gcc hello.c-ohello_arm# 传输到开发板scphello_arm root@192.168.1.100:/root/# SSH登录开发板sshroot@192.168.1.100# 开发板端:赋权并运行chmod+x /root/hello_arm /root/hello_arm4.2 实战场景:批量传输项目文件
# PC端:打包后传输更高效cd~/embedded_projects/tarczf myproject.tar.gz hello/# 传输压缩包scpmyproject.tar.gz root@192.168.1.100:/root/# 开发板端解压sshroot@192.168.1.100"cd /root && tar xzf myproject.tar.gz"4.3 实战场景:从开发板拉取日志
# 开发板上的运行日志拉到PC分析scp-Croot@192.168.1.100:/var/log/messages ./# 拉取dmesg内核日志sshroot@192.168.1.100"dmesg">dmesg_board.log五、SFTP文件管理
SCP够用了,但如果你需要更灵活的文件管理(浏览目录、断点续传),可以用SFTP:
# 连接到开发板sftproot@192.168.1.100# 进入交互模式后可用命令:sftp>ls# 列出远程文件sftp>cd/root# 切换远程目录sftp>lcd ~/Desktop# 切换本地目录sftp>put hello_arm# 上传文件sftp>get log.txt# 下载文件sftp>quit# 退出SFTP vs SCP对比
| 对比项 | SCP | SFTP |
|---|---|---|
| 传输方式 | 一次性传输 | 交互式会话 |
| 断点续传 | 不支持 | 支持 |
| 目录浏览 | 不支持 | 支持 |
| 操作复杂度 | 简单 | 稍复杂 |
| 适用场景 | 传单个文件/目录 | 需要浏览和管理文件 |
六、常见问题排查
6.1 Connection refused
# 报错:ssh: connect to host 192.168.1.100 port 22: Connection refused# 原因:开发板SSH服务未启动# 解决:在开发板上启动SSHsystemctl start sshd6.2 Connection timed out
# 报错:Connection timed out# 原因:网络不通或IP错误# 排查:ping192.168.1.100# 先确认网络连通# 检查IP是否正确ifconfig6.3 Permission denied(密码)
# 报错:Permission denied, please try again.# 原因1:密码错误# 原因2:SSH配置禁止root登录# 解决:修改/etc/ssh/sshd_configvim/etc/ssh/sshd_config# 修改 PermitRootLogin yessystemctl restart sshd问题速查表
| 报错 | 原因 | 解决方案 |
|---|---|---|
| Connection refused | SSH服务未启动 | systemctl start sshd |
| Connection timed out | 网络不通 | 检查IP、网线、防火墙 |
| Permission denied | 密码错误或禁止root | 修改sshd_config |
| Host key verification | 之前连接的IP被重用 | 删除~/.ssh/known_hosts对应行 |
总结
SSH和SCP是嵌入式开发中最高频使用的网络工具。SSH解决远程登录问题,SCP解决文件传输问题,两者都基于加密协议,安全可靠。掌握上传、下载、目录递归传输、指定端口这几个常用操作,日常开发就足够了。传输大文件时加-C压缩能提速,需要交互式文件管理时切到SFTP。遇到连接问题记住排查三步走:先ping确认网络、再检查SSH服务状态、最后看配置文件。下一篇介绍NFS共享目录,那才是实现"PC上编译、开发板上直接运行"的终极方案。