3、SSH基础与配置:SSH协议原理、Jetson端SSH服务开启与配置、客户端SSH连接(Windows/Mac/Linux)

说到远程开发,SSH 绝对是绕不开的第一道门槛。我刚开始搞 Jetson 那会儿,最头疼的就是每次调试都要搬着显示器、键盘、鼠标跑到设备跟前去。后来把 SSH 玩熟了,直接躺沙发上就能干活,那感觉,真香。

这一章,咱们就把 SSH 彻底搞明白。从协议原理到 Jetson 端的配置,再到各种客户端的连接方式,一条龙讲清楚。

3.1 SSH 协议原理:它到底是怎么工作的?

SSH,全称 Secure Shell,说白了就是一种加密的网络协议。你想想看,如果没有加密,你在终端里敲的密码、命令,全都是在网络上裸奔的,随便抓个包就能看到。这谁受得了?

SSH 的核心机制其实就三件事:

  • 身份验证:确认你是不是你(密码或密钥)
  • 加密传输:所有数据都加密,别人看不懂
  • 完整性校验:确保数据没被篡改

我个人习惯把 SSH 的握手过程分成三个阶段:

  1. TCP 连接建立:客户端先跟服务器打个招呼,建立基本的网络连接
  2. 密钥交换:双方协商加密算法,生成会话密钥。这一步用的是非对称加密,安全得很
  3. 用户认证:用密码或者密钥对验证你的身份

关键点: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

  1. 打开 PuTTY
  2. 在 "Host Name" 里填 IP 地址
  3. Port 填 22(或你改的端口)
  4. Connection type 选 SSH
  5. 点击 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