文章目录
在本地生成密钥
在自己的电脑执行:
ssh-keygen -t ed25519
一路回车(也可以设置密码)
会生成:
私钥:~/.ssh/id_ed25519
公钥:~/.ssh/id_ed25519.pub
手动复制公钥
查看你的公钥
在 PowerShell 输入:
type $env:USERPROFILE\.ssh\id_ed25519.pub
或者输入:
cat ~/.ssh/id_ed25519.pub
或者输入:
bash
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
这三个爱用哪个用哪个。
会输出一行类似:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... 乱七八糟的乱码
复制整行。
登录服务器(用密码)
ssh user@服务器IP
在服务器上执行
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
把刚才复制的内容粘进去,如果发现无法复制,可以尝试点击第一个空行,然后再复制,注意,是第一个空行,而非整个空白区域。
保存:
Ctrl + O → 回车
Ctrl + X
设置权限:
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试登录
退出服务器:
bash
exit
再登录:
bash
ssh user@服务器IP
如果不用密码直接进 = 成功,如果你设置了密钥的密码,就会提示你输入passphrase。
关闭密码登录
编辑 SSH 配置:
bash
nano /etc/ssh/sshd_config
找到并修改这两行:
搜索,按:
bash
Ctrl + W
输入:
bash
PasswordAuthentication
如果你看到:
bash
#PasswordAuthentication yes
改成(去掉 #):
bash
PasswordAuthentication no
这个表示禁止密码登录。
再搜索 root 登录
按:
bash
Ctrl + W
输入:
bash
PermitRootLogin
如果看到:
bash
#PermitRootLogin prohibit-password
改成:
bash
PermitRootLogin prohibit-password
(如果没有这一行,就自己加一行)
这个表示root 只能用密钥登录,不能用密码。
保存并退出
按:
bash
Ctrl + O (保存)
回车
bash
Ctrl + X (退出)
重启 SSH 服务
执行:
bash
systemctl restart ssh
如果你是CentOS/RHEL之类的,执行:
bash
systemctl restart sshd
检查配置是否生效
执行:
bash
sshd -T | grep passwordauthentication
如果输出:
bash
passwordauthentication yes
说明密码登录还在开启。
如果前面怎么改都不行的话,主配置可能被覆盖了,真正生效的配置,可能在 /etc/ssh/sshd_config.d/ 目录里。
查看这个目录
执行:
bash
ls /etc/ssh/sshd_config.d/
查看里面的内容
bash
cat /etc/ssh/sshd_config.d/*.conf
如果看到了:
bash
PasswordAuthentication yes
那就对胃了。
直接改这个文件:
bash
nano /etc/ssh/sshd_config.d/50-cloud-init.conf
把里面的:
bash
PasswordAuthentication yes
改成:
bash
PasswordAuthentication no
重启 SSH
bash
systemctl restart ssh
再验证
bash
sshd -T | grep passwordauthentication
这次应该是:
bash
passwordauthentication no
一般这种情况是Ubuntu,特别是云服务器,常见。使用 cloud-init 自动生成配置,放在/etc/ssh/sshd_config.d/优先级比主文件还高,配置被"隐藏配置文件"覆盖了
验证一下
不要马上断开当前连接,先开一个新窗口测试:
bash
ssh root@你的服务器IP
如果能正常登上去,就可以断开链接了