目录
- SSH 是什么? - 简要介绍
- 准备工作
- 在服务器上安装和启动 SSH 服务
- 在客户端电脑上安装 SSH 客户端
- 首次连接 (基本用法)
- 基本命令
- 首次连接的密钥确认提示
- 更安全的连接方式 (使用 SSH 密钥)
- 为什么推荐使用密钥?
- 在客户端生成 SSH 密钥对
- 将公钥上传到服务器
- 使用密钥进行连接
- 常用 SSH 命令和技巧
- 指定用户名和端口
- 断开连接
- 在后台运行命令 (
nohup,tmux,screen)
- SSH 配置优化 (
~/.ssh/config)- 为什么需要配置文件?
- 配置文件示例
- 使用配置文件简化连接
- 常见问题与解决方案
Connection refused(连接被拒绝)Permission denied (publickey,password)(权限被拒绝)Could not resolve hostname(无法解析主机名)- 连接缓慢或卡顿
SSH 是什么?
SSH (Secure Shell) 是一种网络协议,用于计算机之间的安全通信和数据传输,它最广泛的应用就是安全地远程登录和管理服务器,与传统的 Telnet、FTP 等协议不同,SSH 对所有传输的数据都进行了加密,可以有效防止信息泄露和中间人攻击。

准备工作
你需要两台机器:
- 服务器: 一台运行 Ubuntu 的远程服务器,拥有一个公网 IP 地址。
- 客户端: 你本地的电脑(可以是 Windows, macOS, 或另一台 Linux)。
在服务器上安装和启动 SSH 服务
如果你的 Ubuntu 服务器还没有安装 SSH 服务,可以按以下步骤操作。
-
更新软件包列表:
sudo apt update
-
安装 OpenSSH 服务器:
(图片来源网络,侵删)sudo apt install openssh-server
-
检查 SSH 服务状态:
sudo systemctl status ssh
如果看到
active (running),说明服务已成功启动并正在运行。 -
启动并设置开机自启 (如果未自动启动):
sudo systemctl start ssh sudo systemctl enable ssh
在客户端电脑上安装 SSH 客户端
- Linux / macOS: 通常已经预装了 SSH 客户端,打开终端,输入
ssh命令,如果能看到帮助信息,说明已安装。 - Windows:
- 推荐 (Windows 10/11): 使用内置的 OpenSSH 客户端,直接在命令提示符 或 PowerShell 中使用
ssh命令即可。 - 传统方式: 使用第三方客户端,如 PuTTY, MobaXterm 等,PuTTY 是一个非常流行的选择。
- 推荐 (Windows 10/11): 使用内置的 OpenSSH 客户端,直接在命令提示符 或 PowerShell 中使用
首次连接 (基本用法)
假设你的服务器 IP 地址是 168.1.100,用户名是 ubuntu。

在客户端的终端中,输入以下命令:
ssh ubuntu@192.168.1.100
ubuntu是你要登录的服务器用户名。168.1.100是服务器的 IP 地址。
首次连接会提示:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这是 SSH 的安全机制,它在警告你正在连接一个你之前没有连接过的服务器,指纹是用来验证服务器身份的,如果确认 IP 地址正确,输入 yes 并回车。
之后,系统会提示你输入该用户的密码:
ubuntu@192.168.1.100's password:
输入密码(输入时不会显示任何字符),然后按回车,如果密码正确,你将成功登录到服务器的命令行界面。
更安全的连接方式 (使用 SSH 密钥)
每次输入密码很麻烦,而且有被暴力破解的风险,强烈推荐使用 SSH 密钥对 进行认证,这是一种更安全、更便捷的方式。
为什么推荐使用密钥?
- 安全性高: 密钥比密码复杂得多,极难被破解。
- 方便: 配置好后,登录时无需输入密码。
- 自动化: 便于脚本自动化操作,无需人工干预。
步骤:
第1步:在客户端生成 SSH 密钥对
在你的客户端电脑上打开终端,运行以下命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519:指定密钥类型,Ed25519 是一种现代、安全的加密算法,推荐使用。-C "...":添加一个注释,通常是你的邮箱,用于标识密钥。
命令会提示你:
- 保存密钥的位置: 直接按回车,使用默认路径
~/.ssh/id_ed25519。 - 设置密码(可选): 可以设置一个额外的密码来保护你的私钥,如果设置了,每次使用私钥时都需要输入这个密码,如果不想输入,可以直接按回车跳过。
执行完成后,你的用户主目录下会多出一个 .ssh 文件夹,里面包含:
id_ed25519:私钥,绝对不能泄露! 保存在你的客户端电脑上。id_ed25519.pub:公钥,可以安全地分享给任何人或服务器。
第2步:将公钥上传到服务器
有两种常用方法:
方法A:使用 ssh-copy-id 命令 (最简单)
如果你的客户端系统支持 ssh-copy-id (Linux, macOS, Windows WSL/PowerShell),这是最简单的方法,它会自动将你的公钥追加到服务器上指定用户的 ~/.ssh/authorized_keys 文件中。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@192.168.1.100
系统会提示你输入 ubuntu 用户的密码,验证通过后,你的公钥就会被安全地复制到服务器上。
方法B:手动复制公钥内容
ssh-copy-id 不可用,你可以手动操作:
-
在客户端,查看你的公钥内容:
cat ~/.ssh/id_ed25519.pub
你会看到一长串以
ssh-ed25519开头的文本。 -
登录到服务器(使用密码方式):
ssh ubuntu@192.168.1.100
-
在服务器上,确保
.ssh目录和authorized_keys文件存在并拥有正确的权限:mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
-
将刚才复制的公钥内容,粘贴到
authorized_keys文件的末尾:nano ~/.ssh/authorized_keys
(使用
nano,vim或其他编辑器粘贴并保存)
第3步:使用密钥进行连接
完成上述步骤后,再次尝试连接:
ssh ubuntu@192.168.1.100
这次,如果一切顺利,你应该可以直接登录,而无需输入服务器密码了!
常用 SSH 命令和技巧
-
指定用户名和端口: 如果你的 SSH 服务运行在非标准端口(2222),可以这样连接:
ssh -p 2222 ubuntu@192.168.1.100
-
断开连接:
- 输入
exit命令。 - 或者使用快捷键
Ctrl + D。
- 输入
-
在后台稳定运行命令: 有时候你需要在服务器上运行一个长时间的任务,但又不想保持 SSH 连接不断,可以使用
tmux或screen。- 安装 tmux:
sudo apt install tmux
- 启动一个 tmux 会话:
tmux new -s my_session
- 在会话中运行你的命令(
python my_script.py)。 - 断开会话(但保持其运行): 按
Ctrl + B,然后按D。 - 稍后重新连接到会话:
tmux attach -t my_session
这样,即使你关闭了 SSH 客户端,服务器上的命令也会继续运行。
- 安装 tmux:
SSH 配置优化 (~/.ssh/config)
每次都输入 -p 2222 和 user@host 很麻烦。~/.ssh/config 文件可以让你为每个服务器创建一个“别名”。
-
编辑配置文件:
nano ~/.ssh/config
-
添加以下内容:
# 为我的生产服务器创建一个别名 Host prod-server HostName 192.168.1.100 User ubuntu Port 22 IdentityFile ~/.ssh/id_ed25519 # 如果不想每次输入私钥密码,可以使用 ssh-agent # AddKeysToAgent yes # 为我的另一台测试服务器创建别名 Host test-server HostName 203.0.113.55 User admin Port 2222 IdentityFile ~/.ssh/id_rsa_test -
保存文件后,连接变得极其简单:
ssh prod-server ssh test-server
这比记住完整的 IP、用户名和端口方便多了!
常见问题与解决方案
Connection refused (连接被拒绝)
- 原因: 服务器上的 SSH 服务没有运行,或者防火墙阻止了连接。
- 解决方案:
- 在服务器上检查 SSH 服务状态:
sudo systemctl status ssh,如果没运行,启动它:sudo systemctl start ssh。 - 在服务器上检查防火墙(如
ufw)是否允许 SSH 端口(默认是 22)。# 检查 ufw 状态 sudo ufw status # SSH 被阻止,允许它 sudo ufw allow OpenSSH # 或者允许特定端口 sudo ufw allow 2222/tcp # 启用防火墙 sudo ufw enable
- 在服务器上检查 SSH 服务状态:
Permission denied (publickey,password) (权限被拒绝)
- 原因: 这是最常见的错误,通常是因为:
- 你使用了密钥认证,但服务器上的
authorized_keys文件不存在或内容不正确。 - 服务器上的
.ssh目录或authorized_keys文件的权限不正确,SSH 非常严格,只允许所有者读写。 - 你尝试使用密码,但服务器禁用了密码登录(为了安全)。
- 你使用了密钥认证,但服务器上的
- 解决方案:
- 检查权限: 在服务器上运行以下命令修复权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- 确保文件存在:
ls -l ~/.ssh/authorized_keys - 检查公钥内容: 确保公钥文件内容正确无误,并且没有多余的空格或换行符。
- 检查服务器配置: 如果你想用密码登录,检查
/etc/ssh/sshd_config文件,确保PasswordAuthentication yes这一行没有被注释掉(),修改后需要重启 SSH 服务:sudo systemctl restart sshd。
- 检查权限: 在服务器上运行以下命令修复权限:
Could not resolve hostname (无法解析主机名)
- 原因: 你的客户端无法通过你提供的主机名或 IP 地址找到服务器。
- 解决方案:
- 检查 IP 地址/主机名: 确保你输入的 IP 地址或域名是正确的。
- 检查网络连接: 确保你的客户端电脑能访问互联网,并且网络没有问题。
- DNS 问题: 如果使用域名,可能是 DNS 解析问题,尝试用 IP 地址连接看是否成功。
连接缓慢或卡顿
- 原因: 可能是 DNS 反向解析问题,或者网络延迟。
- 解决方案:
- 在服务器上禁用 DNS 反向解析: 编辑
/etc/ssh/sshd_config文件,找到UseDNS这一行,将其值设为no。UseDNS no然后重启 SSH 服务:
sudo systemctl restart sshd。 - 检查网络延迟: 使用
ping命令测试到服务器的网络延迟:ping 192.168.1.100,如果延迟很高,可能是网络本身的问题。
- 在服务器上禁用 DNS 反向解析: 编辑
希望这份详细的指南能帮助你顺利地在 Ubuntu 上使用 SSH!
