SSH 基础用法指南
什么是 SSH?
SSH(Secure Shell)是一个网络协议,用于安全地远程登录和执行命令。SSH 使用加密通信,确保你与远程计算机之间的所有数据都被保护,不被第三方窃听或篡改。
SSH 的主要特点
- 安全性 - 使用强加密算法保护通信数据
- 身份验证 - 支持密码认证和密钥认证
- 命令执行 - 可以远程执行单个命令或交互式命令行
- 文件传输 - 通过 SCP 或 SFTP 安全地传输文件
- 端口转发 - 可以建立安全的隧道进行其他协议的通信
- 跨平台 - 在 Linux、Mac、Windows 等多个操作系统上可用
SSH 在 LeBot 中的应用
在 LeBot 开发中,SSH 用于:
- 远程登录到 LeBot 的主控板进行开发和调试
- 执行远程命令和脚本
- 上传代码和配置文件到 LeBot
- 下载日志文件和数据进行分析
- 监控 LeBot 的运行状态
SSH 的工作原理
SSH 通信过程
- 连接建立 - 客户端连接到服务器的 22 端口(默认端口)
- 协议协商 - 客户端和服务器协商 SSH 版本和加密算法
- 密钥交换 - 通过 Diffie-Hellman 密钥交换算法建立加密连接
- 身份验证 - 服务器验证客户端的身份(密码或密钥)
- 建立会话 - 认证成功后,建立加密的会话通道
- 命令执行 - 用户可以执行远程命令或进行交互操作
SSH 密钥对工作原理
SSH 支持基于密钥的认证,这比密码认证更安全:
- 公钥 - 放置在远程服务器上,用于验证客户端
- 私钥 - 保存在本地客户端,用于身份认证
- 签名过程 - 服务器用公钥验证私钥持有者的身份
安装 SSH
Linux/Mac 上安装 SSH 客户端
在大多数 Linux 发行版和 Mac 上,SSH 客户端已经预装。检查是否安装:
ssh -V如果没有安装,使用包管理器安装:
# Debian/Ubuntu
sudo apt install openssh-client
# Red Hat/CentOS
sudo yum install openssh-clients
# Mac(使用 Homebrew)
brew install openssh在 LeBot(服务器端)上安装 SSH 服务器
# 安装 OpenSSH 服务器
sudo apt update
sudo apt install openssh-server
# 启动 SSH 服务
sudo systemctl start ssh
# 启用开机自启
sudo systemctl enable ssh
# 检查 SSH 服务状态
sudo systemctl status sshWindows 上使用 SSH
选项 1:使用 WSL(Windows Subsystem for Linux)
启用 WSL 后,可以使用内置的 SSH 客户端。
选项 2:使用 PuTTY
PuTTY 是一个免费的 SSH 客户端,可以从官网下载安装。
选项 3:使用 OpenSSH(Windows 10+)
# 在 PowerShell 中检查 SSH 客户端
Get-Command ssh
# 如果未安装,通过设置安装
# 设置 > 应用 > 应用和功能 > 可选功能 > 添加功能 > OpenSSH 客户端基本 SSH 命令
远程登录
使用密码认证登录
ssh username@hostname
# 例如:
ssh user@lebot.local
ssh user@192.168.1.100按提示输入密码后即可登录。
使用自定义端口
# 如果 SSH 服务运行在非标准端口(例如 2222)
ssh -p 2222 username@hostname指定用户名
# 如果不指定用户名,默认使用当前系统用户名
# 显式指定用户名
ssh username@hostname
# 等同于
ssh -l username hostname执行远程命令
# 执行单个命令并立即返回
ssh username@hostname "command"
# 例如:
ssh user@lebot.local "ls -la /home/user"
ssh user@lebot.local "ps aux | grep python"
ssh user@lebot.local "cat /var/log/syslog | tail -20"
# 执行需要交互的命令
ssh -t username@hostname "sudo command"退出 SSH 会话
# 在 SSH 会话中,使用 exit 命令退出
exit
# 或按 Ctrl + DSSH 密钥认证
为什么使用密钥认证?
密钥认证相比密码认证有以下优势:
- 更安全 - 密钥长度通常很长,很难被破解
- 自动化 - 可以配置免密登录,便于脚本和自动化
- 不易被截获 - 私钥不需要在网络上传输
- 抗暴力攻击 - 即使有人知道用户名也无法通过密钥认证登录
生成 SSH 密钥对
在 Linux/Mac 上生成密钥
# 使用默认设置生成 RSA 密钥
ssh-keygen -t rsa -b 4096
# 或使用更安全的 ED25519 密钥
ssh-keygen -t ed25519 -C "your_email@example.com"执行命令后,会要求输入:
- 密钥文件位置 - 按 Enter 使用默认位置(~/.ssh/id_rsa)
- 密钥密码 - 建议设置一个强密码来保护私钥(可以为空,但不推荐)
完成后会在 ~/.ssh/ 目录下生成:
id_rsa- 私钥(保密)id_rsa.pub- 公钥(可以公开共享)
在 Windows 上生成密钥
使用 Git Bash 或 WSL 执行上述命令,或使用 PuTTYgen 工具。
将公钥上传到远程服务器
方法 1:使用 ssh-copy-id(最简单,Linux/Mac)
# 自动将本地公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname
# 例如:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@lebot.local方法 2:手动复制(适用所有平台)
# 1. 查看本地公钥
cat ~/.ssh/id_rsa.pub
# 2. 登录到远程服务器
ssh username@hostname
# 3. 在远程服务器上创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
# 4. 将公钥内容追加到 authorized_keys 文件
# 在本地执行:
cat ~/.ssh/id_rsa.pub | ssh username@hostname "cat >> ~/.ssh/authorized_keys"
# 5. 设置正确的权限
ssh username@hostname "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"方法 3:使用 SCP 复制
# 先通过密码认证上传公钥
scp ~/.ssh/id_rsa.pub username@hostname:/tmp/
# 然后登录服务器添加公钥
ssh username@hostname
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys使用密钥进行无密码登录
配置完毕后,可以直接用密钥登录:
# 如果密钥名称不是默认的 id_rsa,需要指定
ssh -i ~/.ssh/custom_key_name username@hostname
# 在 SSH 配置中设置默认密钥
# 编辑 ~/.ssh/config,添加以下内容:
Host lebot
HostName lebot.local
User user
IdentityFile ~/.ssh/id_rsa
Port 22
# 之后可以直接连接
ssh lebot使用密钥认证的最佳实践
# 1. 密钥权限应该是 600(仅所有者可读写)
chmod 600 ~/.ssh/id_rsa
# 2. .ssh 目录权限应该是 700
chmod 700 ~/.ssh
# 3. 在远程服务器上,authorized_keys 权限应该是 600
chmod 600 ~/.ssh/authorized_keys
# 4. 禁用密码认证(在服务器上)
# 编辑 /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
# 找到并修改以下行:
# PasswordAuthentication no
# PubkeyAuthentication yes
# 5. 重启 SSH 服务使配置生效
sudo systemctl restart sshSSH 文件传输
SCP - 安全复制
SCP(Secure Copy Protocol)用于在本地和远程主机之间安全地传输文件。
上传文件到远程服务器
# 上传单个文件
scp local_file.txt username@hostname:/remote/path/
# 例如:
scp script.py user@lebot.local:/home/user/scripts/
# 指定端口
scp -P 2222 local_file.txt username@hostname:/remote/path/
# 上传多个文件
scp file1.txt file2.txt username@hostname:/remote/path/
# 递归上传整个目录
scp -r local_directory/ username@hostname:/remote/path/从远程服务器下载文件
# 下载单个文件
scp username@hostname:/remote/path/file.txt local_path/
# 例如:
scp user@lebot.local:/var/log/lebot.log ./
# 递归下载目录
scp -r username@hostname:/remote/directory/ local_path/使用密钥进行 SCP
# 如果使用非默认的密钥
scp -i ~/.ssh/custom_key local_file.txt username@hostname:/remote/path/SFTP - 交互式文件传输
SFTP 提供了一个交互式的文件传输界面,类似于 FTP,但使用 SSH 加密。
# 连接到远程服务器
sftp username@hostname
# 常用 SFTP 命令:
help # 显示帮助
ls # 列出远程文件
cd directory # 改变远程目录
pwd # 显示远程工作目录
get remote_file # 下载文件
put local_file # 上传文件
quit # 退出 SFTP
# 例如,一个完整的 SFTP 会话:
sftp user@lebot.local
sftp> ls
sftp> cd /var/log
sftp> get lebot.log
sftp> cd /home/user
sftp> put local_config.txt
sftp> quitSSH 配置文件
SSH 客户端配置
SSH 客户端配置文件位于 ~/.ssh/config。通过配置文件可以简化命令行操作。
创建基本配置
# 编辑配置文件
nano ~/.ssh/config
# 添加以下内容:
Host lebot
HostName 192.168.1.100
User user
IdentityFile ~/.ssh/id_rsa
Port 22
# 保持连接活跃(防止超时断开)
ServerAliveInterval 60
ServerAliveCountMax 5
# 连接多路复用(重用连接)
ControlMaster auto
ControlPath ~/.ssh/control-%h-%p-%r
ControlPersist 600
# 配置文件权限必须是 600
chmod 600 ~/.ssh/config使用配置后的简化命令
# 之前需要:
ssh -i ~/.ssh/id_rsa user@192.168.1.100
# 现在只需:
ssh lebot
# SCP 也可以简化:
scp file.txt lebot:/remote/path/配置多个主机
Host lebot1
HostName 192.168.1.100
User user1
IdentityFile ~/.ssh/id_rsa_1
Host lebot2
HostName 192.168.1.101
User user2
IdentityFile ~/.ssh/id_rsa_2
Host lebot-prod
HostName prod.lebot.com
User admin
IdentityFile ~/.ssh/id_rsa_prod
Port 2222
# 使用通配符匹配多个主机
Host lebot*
ServerAliveInterval 60
Compression yesSSH 服务器配置
SSH 服务器配置文件位于 /etc/ssh/sshd_config。
常见的服务器配置选项
# 编辑服务器配置
sudo nano /etc/ssh/sshd_config
# 重要配置选项:
# 监听地址和端口
Port 22 # SSH 监听的端口
ListenAddress 0.0.0.0 # 监听所有网络接口
ListenAddress :: # IPv6 监听
# 认证设置
PermitRootLogin no # 禁止 root 用户登录
PubkeyAuthentication yes # 启用公钥认证
PasswordAuthentication no # 禁用密码认证
PermitEmptyPasswords no # 禁用空密码
# 会话设置
X11Forwarding yes # 启用 X11 转发
PrintMotd yes # 显示登录消息
MaxAuthTries 3 # 最多认证尝试次数
ClientAliveInterval 60 # 发送保活信号的时间间隔(秒)
ClientAliveCountMax 5 # 保活计数上限
# 限制登录
AllowUsers user1 user2 user3 # 只允许特定用户登录
DenyUsers root banned_user # 禁止特定用户登录
# 修改后重启 SSH 服务
sudo systemctl restart ssh
# 验证配置文件语法
sudo sshd -tSSH 的高级用法
端口转发(隧道)
SSH 可以用来建立安全的隧道,转发其他应用程序的流量。
本地端口转发
将本地端口的流量转发到远程服务器的特定端口:
# 语法
ssh -L local_port:remote_host:remote_port username@hostname
# 例如,将本地 8888 端口转发到 LeBot 的 5900 端口(VNC)
ssh -L 8888:localhost:5900 user@lebot.local
# 然后在本地可以访问
vncviewer localhost:8888远程端口转发
将远程端口的流量转发回本地:
# 语法
ssh -R remote_port:local_host:local_port username@hostname
# 例如,将远程服务器的 9999 端口转发回本地的 22 端口
ssh -R 9999:localhost:22 user@remote_server
# 然后可以从远程服务器访问本地 SSH
ssh -p 9999 localhost动态端口转发(SOCKS 代理)
# 创建 SOCKS 代理
ssh -D 1080 user@lebot.local
# 然后配置应用程序使用 127.0.0.1:1080 作为 SOCKS 代理SSH 密钥管理
SSH Agent(密钥代理)
SSH Agent 存储解锁的私钥,避免每次都输入密码:
# 启动 SSH Agent
eval $(ssh-agent)
# 添加密钥到 Agent
ssh-add ~/.ssh/id_rsa
# 添加指定密钥
ssh-add -i ~/.ssh/custom_key
# 列出 Agent 中的密钥
ssh-add -l
# 从 Agent 中删除密钥
ssh-add -d ~/.ssh/id_rsa
# 删除 Agent 中的所有密钥
ssh-add -D密钥轮换
# 定期生成新的密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 将新公钥添加到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@lebot.local
# 验证新密钥可用后,删除旧密钥
rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pubSSH 安全最佳实践
1. 密钥安全
# 使用强密钥加密
ssh-keygen -t ed25519 -C "your_email@example.com"
# 定期检查密钥权限
ls -la ~/.ssh/
# 确保私钥权限为 600
chmod 600 ~/.ssh/id_rsa
# 使用密钥密码保护
# 在 ssh-keygen 过程中设置密码2. 服务器安全配置
# 禁用根用户登录
sudo nano /etc/ssh/sshd_config
# PermitRootLogin no
# 使用非标准端口
# Port 2222
# 禁用密码认证(使用密钥认证)
# PasswordAuthentication no
# 限制登录用户
# AllowUsers user1 user2
# 设置连接超时
# ClientAliveInterval 60
# ClientAliveCountMax 3
# 启用日志记录
# LogLevel VERBOSE3. 定期维护
# 检查 SSH 日志
sudo tail -f /var/log/auth.log
# 监控失败的登录尝试
sudo grep "Failed password" /var/log/auth.log | wc -l
# 检查当前连接
who4. 防火墙配置
# 使用 ufw 限制 SSH 访问
sudo ufw allow from 192.168.1.0/24 to any port 22
# 限制连接速率(防止暴力破解)
sudo ufw limit 22/tcp常见问题和故障排除
连接超时
# 原因:网络不可达或防火墙阻止
# 解决:
# 1. 检查网络连接
ping hostname
# 2. 检查 SSH 服务是否运行
sudo systemctl status ssh
# 3. 检查防火墙规则
sudo ufw status
sudo iptables -L -n | grep 22权限拒绝
# 原因:密钥权限不正确
# 解决:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh
ssh -v user@hostname # 使用 -v 查看详细信息密钥不被识别
# 原因:服务器上公钥不正确或权限问题
# 解决:
# 1. 检查公钥是否正确上传
cat ~/.ssh/authorized_keys
# 2. 检查权限
ls -la ~/.ssh/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 3. 重启 SSH 服务
sudo systemctl restart ssh连接断开
# 原因:网络不稳定或服务器设置断开闲置连接
# 解决:
# 在 ~/.ssh/config 中配置保活:
Host *
ServerAliveInterval 60
ServerAliveCountMax 5总结
SSH 是远程连接和管理 LeBot 的关键工具。本章涵盖了:
- SSH 的基本概念和工作原理
- SSH 客户端的安装和基本使用
- SSH 密钥对的生成和配置
- 文件传输方法(SCP 和 SFTP)
- SSH 配置文件的使用
- 高级功能如端口转发
- 安全最佳实践
掌握这些知识后,你可以安全、高效地管理 LeBot 系统。在接下来的章节中,我们将探讨网络通信的更多方面。