介绍
ssh-copy-id 命令是一个非常有用的工具,可以方便地在服务器之间设置基于 SSH 密钥的身份验证。但是,在尝试使用此命令时,你可能会偶尔遇到“/usr/bin/ssh-copy-id: error: no identities found”错误。本教程将指导你完成故障排除和解决此问题的步骤,确保顺利完成基于 SSH 密钥的身份验证过程。在本「实验」结束时,你将了解 SSH 密钥身份验证的工作原理,并能够在你的系统上正确配置它。
了解 SSH 密钥身份验证
在我们深入研究“no identities found”错误进行故障排除之前,重要的是要了解什么是 SSH 密钥身份验证以及它的工作原理。
什么是 SSH 密钥身份验证?
SSH(安全外壳协议)密钥身份验证是一种安全登录远程系统的方法,无需每次都输入密码。它使用一对加密密钥:
- 保留在你本地机器上的私钥 (private key)
- 复制到远程服务器的公钥 (public key)
当你尝试连接到远程服务器时,你的 SSH 客户端使用你的私钥来创建签名。服务器使用存储在其 authorized_keys 文件中的公钥来检查此签名。如果签名有效,你无需输入密码即可获得访问权限。
什么是 ssh-copy-id?
ssh-copy-id 命令是一个实用程序,可简化将你的公钥复制到远程服务器的过程。它将你的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,从而允许在将来的连接中进行无密码身份验证。
让我们检查一下你的系统上是否已经有任何 SSH 密钥。在你的终端中运行以下命令:
ls -la ~/.ssh
如果你没有看到任何文件,或者 .ssh 目录不存在,请不要担心——我们将在下一步中创建所有内容。
生成 SSH 密钥
如果你没有 SSH 密钥或想要创建新的密钥,你可以使用 ssh-keygen 命令来生成它们。这通常是解决“no identities found”错误的第一步。
创建新的 SSH 密钥对
让我们通过运行以下命令来生成一个新的 SSH 密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
这个命令:
-t rsa指定要创建的密钥类型 (RSA)-b 4096指定位长度(更强的加密)-C添加注释(通常是电子邮件),以帮助识别密钥
当你运行此命令时,系统将提示你:
- 输入文件位置以保存密钥(按 Enter 键使用默认位置
~/.ssh/id_rsa) - 输入密码短语(你可以按 Enter 键两次以不使用密码短语,但使用密码短语会增加额外的安全层)
输出应类似于:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/labex/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/labex/.ssh/id_rsa
Your public key has been saved in /home/labex/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCD your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+----[SHA256]-----+
验证 SSH 密钥的创建
现在让我们验证密钥是否已正确创建:
ls -la ~/.ssh
你现在应该在输出中看到私钥 (id_rsa) 和公钥 (id_rsa.pub) 文件:
total 20
drwx------ 2 labex labex 4096 Sep 15 10:10 .
drwxr-xr-x 5 labex labex 4096 Sep 15 09:55 ..
-rw------- 1 labex labex 3389 Sep 15 10:10 id_rsa
-rw-r--r-- 1 labex labex 746 Sep 15 10:10 id_rsa.pub
-rw-r--r-- 1 labex labex 444 Sep 15 10:00 known_hosts
让我们也看看你的公钥文件的内容:
cat ~/.ssh/id_rsa.pub
输出应该是一行以 ssh-rsa 开头,后跟一长串字符,并以你的电子邮件地址或注释结尾。
现在我们已经确认我们的 SSH 密钥存在,我们可以继续下一步:故障排除并解决“no identities found”错误。
了解并解决“No Identities Found”错误
现在我们已经准备好了 SSH 密钥,让我们了解为什么会出现“no identities found”错误以及如何修复它。
错误的常见原因
“no identities found”错误通常由于以下原因之一而发生:
- SSH 密钥不存在
- SSH 密钥不在默认位置
- SSH 密钥的权限不正确
ssh-copy-id命令找不到任何要使用的公钥
由于我们已经确认我们的 SSH 密钥存在于默认位置,让我们检查权限。
检查和修复 SSH 密钥权限
出于安全原因,SSH 对文件权限非常挑剔。运行以下命令来检查你的 .ssh 目录及其内容的权限:
ls -la ~/.ssh
为了保证适当的安全性:
.ssh目录应具有 700 (rwx------) 权限- 私钥 (
id_rsa) 应具有 600 (rw-------) 权限 - 公钥 (
id_rsa.pub) 应具有 644 (rw-r--r--) 权限
如果你的权限不正确,你可以使用以下命令修复它们:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
正确使用 ssh-copy-id
现在让我们尝试正确使用 ssh-copy-id 命令。正确的语法是:
ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host
其中:
-i指定要使用的身份文件(公钥)username是你在远程服务器上的用户名remote_host是远程服务器的主机名或 IP 地址
对于我们的实验 (Lab) 环境,我们将通过使用本地机器来模拟这一点。运行:
ssh-copy-id -i ~/.ssh/id_rsa.pub labex@localhost
系统将提示你输入远程用户的密码。
在桌面环境中打开一个终端窗口,只有桌面环境终端才会设置环境变量。

要检索密码,请运行以下命令。
printenv | grep PASSWORD
注意: 你必须在桌面环境终端中运行此命令,而不是从顶部菜单栏打开的终端中运行。
此命令将显示所有包含“PASSWORD”的环境变量。查找包含 LABEX_PASSWORD=... 的行。等号后面的字符是你的密码。
你将输入该密码,公钥将被复制到远程服务器。
如果你看到类似“Number of key(s) added: 1”的消息,则表示你的密钥已成功复制。
验证 SSH 密钥认证
现在我们已经解决了“no identities found”错误,并成功地将我们的 SSH 密钥复制到远程服务器,让我们验证 SSH 密钥认证是否正常工作。
测试 SSH 密钥认证
在真实环境中,你将通过连接到远程服务器来测试 SSH 密钥认证:
ssh username@remote_host
如果你的 SSH 密钥设置正确,你应该能够在不输入密码的情况下登录(除非你为你的密钥设置了密码短语,在这种情况下你需要输入该密码短语)。
对于我们的实验 (Lab) 环境,我们可以通过尝试 SSH 连接到 localhost 来进行测试:
ssh labex@localhost
如果你收到提示,要求你确认连接(因为 localhost 不在你的 known hosts 文件中),请键入 yes。
你可能会看到类似这样的消息:
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCD.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
如果系统要求你输入密码,则表示 SSH 密钥认证尚未生效。但是,如果你在不输入密码的情况下成功登录,则表示你的 SSH 密钥认证工作正常。
常见的 SSH 密钥认证问题和解决方案
如果你仍然遇到 SSH 密钥认证问题,以下是一些常见问题和解决方案:
SSH 服务器配置:必须将 SSH 服务器配置为允许公钥认证。通常默认情况下启用此功能,但你可以通过检查远程服务器上的
/etc/ssh/sshd_config文件来检查:grep PubkeyAuthentication /etc/ssh/sshd_config它应该显示
PubkeyAuthentication yes。文件所有权:你的主目录和
.ssh目录必须由你拥有:ls -ld ~ ~/.ssh两者都应显示你的用户名作为所有者。
调试 SSH 连接:你可以使用 verbose 标志来调试 SSH 连接:
ssh -v labex@localhost这将显示有关认证过程的详细信息,这可以帮助识别问题。
SSH 密钥管理最佳实践
以下是一些管理 SSH 密钥的最佳实践:
- **使用密码短语 (passphrase)**:生成 SSH 密钥时,请考虑使用密码短语以增加安全性。
- 为不同的服务器使用不同的密钥:为了增强安全性,请考虑为不同的服务器或目的使用不同的密钥。
- 备份你的密钥:将你的 SSH 密钥备份保存在安全的位置。
- 定期轮换密钥:对于敏感环境,请考虑定期轮换你的 SSH 密钥。
通过遵循这些步骤和最佳实践,你可以确保 SSH 密钥认证能够可靠且安全地工作。
总结
在这个实验 (Lab) 中,你学习了如何在使用 SSH copy-id 命令时排除故障并解决“no identities found”错误。我们涵盖了:
- 了解 SSH 密钥认证以及 ssh-copy-id 命令的工作原理
- 使用 ssh-keygen 命令生成 SSH 密钥对
- 检查和修复 SSH 密钥权限
- 正确使用 ssh-copy-id 将你的公钥复制到远程服务器
- 测试和验证 SSH 密钥认证
- SSH 密钥管理的常见问题和最佳实践
掌握了这些技能,你现在可以设置系统之间安全、无密码的 SSH 连接,这对于高效的系统管理和自动化至关重要。SSH 密钥认证不仅比密码认证提供更好的安全性,而且还简化了合法用户的登录过程。
请记住,正确保护你的 SSH 密钥至关重要,因为它们提供对你的系统的直接访问。始终确保你的私钥安全,并考虑使用密码短语 (passphrase) 以获得额外的保护。



