单元四 上云 · 第 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"

它会问三个问题:

  1. 保存位置:直接回车,用默认位置。如果接着提示 id_ed25519 already exists. Overwrite (y/n)?,说明你以前已经生成过密钥,输入 n,直接用现有的那一对。覆盖会让旧密钥能登录的地方全部失效。
  2. 密码短语(passphrase):给私钥再加一道密码。设了更安全,每次登录要输一次;个人电脑也可以直接回车不设。
  3. 再输一次密码短语:同上。

完成后,家目录的 .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-server

6. 关闭密码登录(在服务器上)

密钥登录已经能用了,现在关掉密码登录,让猜密码的程序彻底没机会。

先确认:你现在能用 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 -y

sudo 表示“以管理员身份执行”,第一次使用可能要求输入你的登录密码。更新过程中如果出现紫色或蓝色的对话框询问配置文件怎么处理,直接回车选默认项即可。

如果你的用户名是 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_keys

adduser 会让你设置这个用户的密码(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 能直接登录。
  • 密码登录已经关闭。
  • 我能根据提示符分清自己在服务器上还是在自己电脑上。