面试翻车现场

面试过一个候选人,我问他:"你的机器人跑在Ubuntu上,你平时怎么调试程序?"

他说:"把程序拷到U盘,插到机器人上运行,看输出。"

我问:"如果需要看实时日志、调整参数、用gdb调试呢?"

他说:"那就……多跑几趟?"

做机器人开发,SSH远程调试是标配。你的笔记本跑Windows或macOS,机器人跑Ubuntu,通过SSH你可以远程登录机器人,像在本地一样操作。今天咱们把SSH远程开发这件事说清楚。

SSH基础

SSH(Secure Shell)是加密的网络协议,用于安全地远程登录另一台计算机。

基本用法:

ssh user@hostname
# 或者
ssh user@192.168.1.100

第一次连接会提示你确认指纹,输入yes,然后输入密码。登录成功后,你就在机器人的终端里了,可以执行任何命令。

退出SSH:输入exit或按Ctrl+D。

免密码登录:SSH密钥

每次输密码很烦,配置SSH密钥可以实现免密码登录。

第一步:在本地生成密钥对

ssh-keygen -t ed25519 -C "your_email@example.com"

一路回车,默认保存在~/.ssh/id_ed25519(私钥)和~/.ssh/id_ed25519.pub(公钥)。

第二步:把公钥复制到机器人

ssh-copy-id user@192.168.1.100

输入一次密码,之后SSH连接就不需要密码了。

如果没有ssh-copy-id,手动复制:

cat ~/.ssh/id_ed25519.pub | ssh user@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

SSH配置文件

经常连接同一台机器人?配置~/.ssh/config:

Host myrobot
    HostName 192.168.1.100
    User robot
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3

配置后,直接ssh myrobot就能连接。ServerAliveInterval每60秒发一次心跳包,防止连接断开。

文件传输:scp和rsync

scp:安全复制

# 本地文件传到机器人
scp local_file.txt user@192.168.1.100:/home/robot/

# 机器人文件传到本地
scp user@192.168.1.100:/home/robot/remote_file.txt ./

# 传输整个目录
scp -r local_dir user@192.168.1.100:/home/robot/

rsync:增量同步

rsync比scp更智能,只传输变化的部分,适合大文件和频繁同步:

# 同步本地目录到机器人
rsync -avz ./local_dir/ user@192.168.1.100:/home/robot/remote_dir/

# 从机器人同步到本地
rsync -avz user@192.168.1.100:/home/robot/remote_dir/ ./local_dir/

-a归档模式(保留权限、时间戳等),-v显示详细过程,-z传输时压缩。

端口转发:访问机器人的服务

机器人上可能跑着一些Web服务或ROS2的可视化工具,你可以通过SSH端口转发在本地访问:

# 把机器人的8080端口转发到本地的8080
ssh -L 8080:localhost:8080 user@192.168.1.100

然后在本地浏览器访问http://localhost:8080,实际访问的是机器人的8080端口。

反向端口转发,让机器人访问你本地的服务:

# 让机器人可以通过2222端口访问你本地的3000端口
ssh -R 2222:localhost:3000 user@192.168.1.100

和机器人开发的关系

SSH在机器人开发中的应用非常广泛:

远程编译运行:在笔记本上写代码,用scp或rsync同步到机器人,SSH上去编译运行。

远程调试:SSH到机器人,用gdb调试程序,查看实时日志。

VS Code Remote:用VS Code的Remote-SSH功能,直接在本地VS Code里编辑机器人上的代码,体验和本地开发一样。

多机器人管理:同时SSH到多台机器人,并行调试。可以用tmux分屏,或者开多个终端窗口。

日志收集:用scp或rsync把机器人上的日志文件拉回本地分析。

常见问题排查

连接超时:检查网络连通性(ping 192.168.1.100),检查机器人SSH服务是否运行(systemctl status ssh),检查防火墙是否放行22端口。

密码正确但登录失败:检查/etc/ssh/sshd_config里的PermitRootLogin和PasswordAuthentication设置。

连接经常断开:在~/.ssh/config里加ServerAliveInterval 60,每60秒发一次心跳包。

scp/rsync很慢:加-C参数启用压缩,或者检查网络带宽。大文件用rsync比scp快。

面试常见考点

"SSH密钥登录的原理是什么?"——非对称加密。本地生成公钥和私钥,公钥放在远程机器的~/.ssh/authorized_keys里。登录时,远程机器用公钥加密一个随机字符串发给本地,本地用私钥解密后返回,验证通过就登录成功。

"scp和rsync的区别?"——scp是全量复制,rsync是增量同步。rsync只传输变化的部分,适合大文件和频繁同步。

"SSH端口转发有什么用?"——可以穿透防火墙,访问远程机器上的服务。比如机器人上跑了个Web界面,通过端口转发可以在本地浏览器访问。

"怎么保持SSH连接不断开?"——配置ServerAliveInterval定期发心跳包;或者用tmux/screen,即使SSH断开,会话还在后台运行。

给你的建议

SSH是机器人开发的基本功,必须熟练掌握。

配置好SSH密钥和config文件,免密码登录能省很多时间。用rsync同步代码,比scp快得多。

VS Code Remote-SSH是目前最舒服的远程开发方案,强烈推荐。在本地VS Code里写代码,实际编辑的是机器人上的文件,编译运行也在机器人上执行,体验和本地开发几乎一样。

遇到网络不稳定的环境,用tmux或screen。即使SSH断开,你的终端会话还在后台运行,重新连上后可以恢复。

最后提醒一下安全:生产环境的机器人,SSH要禁用密码登录,只用密钥认证;修改默认端口(22改成其他);用防火墙限制只允许特定IP连接。

SSH的高级用法

除了基本的远程登录,SSH还有很多实用功能。端口转发(-L和-R参数)可以安全地访问远程服务;SSH密钥认证比密码认证更安全也更方便;scp和rsync可以高效地在本地和远程之间传输文件。在机器人项目中,经常用SSH端口转发把机器人上的ROS2端口映射到本地,这样就能在开发机上直接访问机器人的话题和服务。

SSH Agent Forwarding:多跳连接利器

在实际项目中,你可能需要这样连接:笔记本→办公室的跳板机→实验室的机器人。每次都要输入两次密码很烦。SSH Agent Forwarding可以解决这个问题——你只需要在第一跳时认证一次,后续的跳转自动使用本地的密钥。

# 启动ssh-agent并添加密钥
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519

# 连接时加-A启用agent forwarding
ssh -A user@jump-server
# 在跳板机上直接ssh到机器人,不需要再输密码
ssh robot@192.168.1.100

也可以在~/.ssh/config里配置ForwardAgent yes,但要注意安全风险——跳板机的管理员可以临时使用你的密钥。只在信任的跳板机上开启这个功能。另一个更安全的方案是用ProxyJump:

ssh -J user@jump-server robot@192.168.1.100

一条命令直达目标机器,中间跳转自动处理。


上一篇:第94篇 cron定时任务——机器人日志清理和数据定期备份

下一篇预告:第96篇 Docker入门——机器人开发环境的隔离与复现

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐