单元四 上云 · 第 15 课
SSH:远程登录云主机
SSH 让你在自己电脑的终端里操作远方的服务器,就像坐在它面前一样。这一课还会把“密码登录”换成更安全的“密钥登录”。
本课目标
- 用 SSH 登录云主机。
- 理解密码和密钥的区别,生成自己的密钥。
- 改用密钥登录,并关闭密码登录。
- 设置快捷名称,以后输入
ssh ai-server就能登录。
先懂概念:锁和钥匙
SSH 有两种登录方式:
- 密码:任何知道密码的人都能登录。网上有大量程序整天在猜各个服务器的密码。
- 密钥:一对文件。公钥像一把锁,可以放心地装到任意多台服务器上;私钥像唯一的钥匙,只留在你自己的电脑里。没有这把钥匙,猜密码也没用。
Windows 10/11 和 macOS 都自带 SSH 程序,不需要另外安装。
跟着做
1. 第一次登录(用密码)
在自己电脑的终端里运行,把用户名和 IP 换成你的:
ssh ubuntu@你的服务器IP第一次连接会看到:
The authenticity of host '203.0.113.10' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?意思是:“我第一次见这台服务器,确认它就是你要找的那台吗?”这串指纹是服务器的身份证。
想确认没有连错,可以先在云服务商控制台用网页终端(VNC)登录服务器,运行 sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub,看输出里的 SHA256:... 是否和这里显示的一致。一致后输入 yes 回车,你的电脑会记住它;以后如果指纹变了,SSH 会发出警告,提醒你可能连错了服务器。
然后输入密码。输入密码时屏幕上什么都不显示,这是正常的,输完直接回车。
登录成功后,提示符变成类似这样:
ubuntu@VM-0-8-ubuntu:~$现在你输入的每条命令,都在服务器上执行。输入 exit 回车,就回到自己的电脑。
分清自己在哪台机器上,是使用 SSH 最重要的习惯。看提示符:带服务器名字的是服务器,你熟悉的那个是自己的电脑。
2. 生成密钥(在自己电脑上)
先 exit 回到自己的电脑,运行:
ssh-keygen -t ed25519 -C "ai-course"它会问三个问题:
- 保存位置:直接回车,用默认位置。如果接着提示
id_ed25519 already exists. Overwrite (y/n)?,说明你以前已经生成过密钥,输入n,直接用现有的那一对。覆盖会让旧密钥能登录的地方全部失效。 - 密码短语(passphrase):给私钥再加一道密码。设了更安全,每次登录要输一次;个人电脑也可以直接回车不设。
- 再输一次密码短语:同上。
完成后,家目录的 .ssh 文件夹里多了两个文件:id_ed25519 是私钥(钥匙,不能给任何人),id_ed25519.pub 是公钥(锁)。
3. 把公钥装到服务器上
Windows(PowerShell):
type $HOME\.ssh\id_ed25519.pub | ssh ubuntu@你的服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"macOS:
ssh-copy-id ubuntu@你的服务器IP按提示输入服务器的密码。
4. 用密钥登录
ssh ubuntu@你的服务器IP这次不再要密码就直接登录了(如果给私钥设了密码短语,会问你密码短语)。
5. 设置快捷名称
每次输入用户名和 IP 太麻烦。在自己电脑上给服务器起个名字 ai-server:
Windows:
@'
Host ai-server
HostName 你的服务器IP
User ubuntu
'@ | Add-Content -Encoding ascii "$HOME\.ssh\config"macOS:
cat >> ~/.ssh/config <<'EOF'
Host ai-server
HostName 你的服务器IP
User ubuntu
EOF粘贴前先把 你的服务器IP 和 ubuntu 改成你自己的。以后登录只需要:
ssh ai-server6. 关闭密码登录(在服务器上)
密钥登录已经能用了,现在关掉密码登录,让猜密码的程序彻底没机会。
先确认:你现在能用 ssh ai-server 免密码登录。然后登录服务器,运行:
echo "PasswordAuthentication no" | sudo tee /etc/ssh/sshd_config.d/00-no-password.conf
sudo systemctl restart ssh
sudo sshd -T | grep -i passwordauthentication最后一行输出 passwordauthentication no 就说明生效了。
不要关闭当前这个窗口,新开一个终端,运行 ssh ai-server 试一次。能登录,再关掉旧窗口。万一新窗口登录不了,还可以在旧窗口里删掉刚才的文件恢复:sudo rm /etc/ssh/sshd_config.d/00-no-password.conf && sudo systemctl restart ssh。
7. 更新系统
刚买的服务器,先把系统软件更新到最新:
sudo apt update
sudo apt upgrade -ysudo 表示“以管理员身份执行”,第一次使用可能要求输入你的登录密码。更新过程中如果出现紫色或蓝色的对话框询问配置文件怎么处理,直接回车选默认项即可。
如果你的用户名是 root
root 是 Linux 的超级管理员,权限无限大,日常直接用它登录风险很高。建议在服务器上新建一个普通用户,比如 ubuntu,以后用它登录:
adduser ubuntu
usermod -aG sudo ubuntu
mkdir -p /home/ubuntu/.ssh
cp ~/.ssh/authorized_keys /home/ubuntu/.ssh/
chown -R ubuntu:ubuntu /home/ubuntu/.ssh
chmod 700 /home/ubuntu/.ssh
chmod 600 /home/ubuntu/.ssh/authorized_keysadduser 会让你设置这个用户的密码(sudo 时要用),其他问题直接回车。然后把自己电脑上 ~/.ssh/config 里的 User root 改成 User ubuntu,用 ssh ai-server 确认能以新用户登录。确认后,再按第 6 步关闭密码登录。
你应该看到
ssh ai-server不用输入服务器密码就能登录。sudo sshd -T | grep -i passwordauthentication输出passwordauthentication no。
常见问题
Connection timed out? 连不上服务器。检查 IP 是否正确、服务器是否在运行、防火墙是否开放了 TCP 22。
Permission denied (publickey)? 密钥没装好,或者用户名不对。在控制台用网页终端(VNC)登录,检查 ~/.ssh/authorized_keys 里是否有你的公钥。
REMOTE HOST IDENTIFICATION HAS CHANGED? 服务器的指纹变了。如果你刚重装过系统,这是正常的,在自己电脑上运行 ssh-keygen -R 你的服务器IP 删除旧记录再连;如果没有重装过,先别连,确认 IP 没有填错。
把自己锁在外面了? 云服务商的控制台都提供网页版终端(VNC 登录),不依赖 SSH,可以从那里登录修复。
自检
- 我能说出公钥和私钥的区别,知道私钥不能给任何人。
-
ssh ai-server能直接登录。 - 密码登录已经关闭。
- 我能根据提示符分清自己在服务器上还是在自己电脑上。