3、SSH基础与配置:SSH协议原理、Jetson端SSH服务开启与配置、客户端SSH连接(Windows/Mac/Linux)
说到远程开发,SSH 绝对是绕不开的第一道门槛。我刚开始搞 Jetson 那会儿,最头疼的就是每次调试都要搬着显示器、键盘、鼠标跑到设备跟前去。后来把 SSH 玩熟了,直接躺沙发上就能干活,那感觉,真香。
这一章,咱们就把 SSH 彻底搞明白。从协议原理到 Jetson 端的配置,再到各种客户端的连接方式,一条龙讲清楚。
3.1 SSH 协议原理:它到底是怎么工作的?
SSH,全称 Secure Shell,说白了就是一种加密的网络协议。你想想看,如果没有加密,你在终端里敲的密码、命令,全都是在网络上裸奔的,随便抓个包就能看到。这谁受得了?
SSH 的核心机制其实就三件事:
- 身份验证:确认你是不是你(密码或密钥)
- 加密传输:所有数据都加密,别人看不懂
- 完整性校验:确保数据没被篡改
我个人习惯把 SSH 的握手过程分成三个阶段:
- TCP 连接建立:客户端先跟服务器打个招呼,建立基本的网络连接
- 密钥交换:双方协商加密算法,生成会话密钥。这一步用的是非对称加密,安全得很
- 用户认证:用密码或者密钥对验证你的身份
关键点:SSH 默认端口是 22。这个端口号你得记住,后面配置的时候会用到。
我在项目中遇到过一个问题:有次客户说 SSH 连不上,排查了半天,发现是防火墙把 22 端口给封了。嗯,这种低级错误其实挺常见的,大家配置的时候别忘了检查防火墙。
3.2 Jetson 端 SSH 服务开启与配置
Jetson 默认是装了 SSH 服务的,但有时候没启动。咱们一步步来。
3.2.1 检查 SSH 服务状态
先登录到 Jetson 上(用显示器或者串口),敲下面这条命令:
sudo systemctl status ssh
如果看到 active (running),说明服务已经跑起来了。如果没启动,执行:
sudo systemctl start ssh
sudo systemctl enable ssh # 设置开机自启
小技巧:我建议你第一次配置时就顺手把开机自启打开。不然哪天 Jetson 重启了,你又得跑过去手动启动,多麻烦。
3.2.2 修改 SSH 配置(可选但推荐)
SSH 的配置文件在 /etc/ssh/sshd_config。我个人习惯会改几个地方:
sudo nano /etc/ssh/sshd_config
常用的配置项:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Port | 2222(或其他) | 改掉默认的 22 端口,减少被扫描的风险 |
| PermitRootLogin | no | 禁止 root 直接登录,用普通用户 + sudo 更安全 |
| PasswordAuthentication | yes(初期) | 先用密码登录,后面换成密钥后再关掉 |
| PubkeyAuthentication | yes | 开启密钥认证 |
改完之后记得重启服务:
sudo systemctl restart ssh
注意:如果你改了端口号,比如改成 2222,那后面连接的时候就要加上 -p 2222 参数。我曾经有一次改完端口忘了这茬,愣是连了半天没连上,还以为是 Jetson 挂了。
3.2.3 查看 Jetson 的 IP 地址
连接之前,你得知道 Jetson 的 IP。用这个命令:
ip addr show
或者更简洁的:
hostname -I
记下那个 IP 地址,后面要用。
3.3 客户端 SSH 连接(Windows / Mac / Linux)
不同系统的客户端工具不一样,但核心思路是一样的。咱们一个一个说。
3.3.1 Linux / Mac 客户端
这两个系统自带 SSH 客户端,直接在终端里敲命令就行:
ssh username@jetson_ip_address
如果你改了端口,加上 -p 参数:
ssh -p 2222 username@jetson_ip_address
第一次连接会提示你确认主机指纹,输入 yes 就行。
我的习惯:我会在 ~/.ssh/config 文件里配置一个别名,这样就不用每次都敲 IP 了:
Host jetson
HostName 192.168.1.100
Port 2222
User nvidia
配置完之后,直接 ssh jetson 就能连上,省事多了。
3.3.2 Windows 客户端
Windows 现在也自带 SSH 客户端了(PowerShell 或 CMD 里直接用),但我个人更推荐用 PuTTY 或者 Windows Terminal。
方法一:用 PowerShell
跟 Linux 一样,直接敲命令:
ssh username@jetson_ip_address
方法二:用 PuTTY
- 打开 PuTTY
- 在 "Host Name" 里填 IP 地址
- Port 填 22(或你改的端口)
- Connection type 选 SSH
- 点击 Open
第一次连接也会弹出指纹确认,点 "Accept" 就行。
避坑指南:我曾经在 Windows 上遇到过一个坑——PuTTY 默认不保存会话配置。每次连接都要重新填 IP 和端口。后来我发现可以在 Session 页面里填好信息,起个名字,点 "Save",下次直接双击加载就行。
3.3.3 密钥认证(推荐)
用密码登录虽然方便,但每次都要输密码,而且安全性也不如密钥。我建议你换成密钥认证。
第一步:生成密钥对
在客户端(你的电脑)上执行:
ssh-keygen -t rsa -b 4096
一路回车就行。生成的文件默认在 ~/.ssh/ 目录下:
id_rsa:私钥,自己留着,千万别泄露id_rsa.pub:公钥,要放到 Jetson 上
第二步:把公钥传到 Jetson
ssh-copy-id username@jetson_ip_address
如果没有 ssh-copy-id 命令(Windows 上可能没有),可以手动复制:
cat ~/.ssh/id_rsa.pub | ssh username@jetson_ip_address "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
第三步:测试连接
现在再 SSH 连接,应该就不用输密码了。如果还提示输密码,检查一下 Jetson 上 ~/.ssh/authorized_keys 文件的权限:
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
重要提醒:密钥认证配置好之后,你可以考虑把 /etc/ssh/sshd_config 里的 PasswordAuthentication 改成 no,彻底禁用密码登录。这样就算有人猜到了你的密码,也连不上来。
3.4 常见问题与排查
搞 SSH 的时候,难免会遇到各种问题。我把自己踩过的坑整理了一下:
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| Connection refused | SSH 服务没启动,或者端口不对 | 检查 systemctl status ssh,确认端口号 |
| Permission denied | 用户名或密码错误,或者密钥不对 | 检查用户名,重新配置密钥 |
| Connection timed out | 网络不通,或者防火墙拦截 | 用 ping 测试连通性,检查防火墙规则 |
| Host key verification failed | Jetson 系统重装过,主机指纹变了 | 删除 ~/.ssh/known_hosts 里对应的记录 |
嗯,基本上把这些问题搞定,SSH 连接就稳了。下一章咱们会讲怎么用 SSH 做端口转发和远程调试,那才是真正的高效玩法。
公众号:蓝海资料掘金营,微信deep3321