创建实例后,我可以使用 gcutil 或 ssh 登录。我尝试从实例底部列出的 ssh 链接复制/粘贴并得到相同的错误消息。
11 回答
权限被拒绝错误可能表明 SSH 私钥认证失败。假设您使用的是从 gcutil 推荐的 Debian 或 Centos 映像派生的映像,它可能是以下之一:
- 您没有将任何 ssh 密钥加载到您的 ssh 钥匙串中,并且您没有使用该
-i
选项指定私有 ssh 密钥。 - 您的 ssh 密钥与您尝试登录的帐户的 .ssh/authorized_keys 中的条目都不匹配。
- 您正在尝试登录计算机上不存在的帐户,或尝试以 root 身份登录。(默认图像禁用直接 root 登录 - 大多数 ssh 暴力攻击都是针对 root 或其他具有弱密码的知名帐户。)
如何确定实例上有哪些账户和密钥:
在标准 Compute Engine Centos 和 Debian 映像上每分钟运行一个脚本,该脚本从元数据服务器获取“sshKeys”元数据条目,并根据需要创建帐户(具有 sudoers 访问权限)。此脚本需要 sshKeys 元数据中的“account:\n”形式的条目,并且可以将多个条目放入单个帐户的 authorized_keys 中。(或根据需要创建多个帐户)
在最新版本的映像中,此脚本通过 syslog 将其输出发送到串行端口,以及机器上的本地日志。您可以通过 读取最后 1MB 的串行端口输出gcutil getserialportoutput
,这在机器未通过 SSH 响应时非常方便。
工作原理gcutil ssh
:
gcutil ssh
执行以下操作:
- 在 中查找一个键
$HOME/.ssh/google_compute_engine
,如果不存在则调用ssh-keygen
创建一个。 - 检查项目元数据条目的当前内容是否
sshKeys
有类似的条目${USER}:$(cat $HOME/.ssh/google_compute_engine.pub)
- 如果不存在这样的条目,则将该条目添加到项目元数据中,并等待长达 5 分钟,以便元数据更改传播,并等待 VM 内的脚本注意到新条目并创建新帐户。
- 一旦新条目到位,(或立即,如果 user:key 已经存在)
gcutil ssh
调用ssh
一些命令行参数以连接到 VM。
这可能会发生故障的几种方法,以及您可以采取哪些措施来解决它们:
- 如果您删除或修改了 read 的脚本,
sshKeys
控制台和命令行工具将不会意识到修改sshKeys
不起作用,并且上面的许多自动魔法可能会被破坏。 - 如果您尝试使用 raw
ssh
,它可能找不到您的.ssh/google_compute_engine
密钥。您可以通过使用gcutil ssh
或复制您的 ssh 公钥(以 结尾.pub
)并添加到sshKeys
控制台中的项目或实例的条目来解决此问题。(您还需要输入一个用户名,可能与您的本地计算机帐户名相同。) - 如果您从未使用过
gcutil ssh
,则可能没有.ssh/google_compute_engine.pub
文件。您可以使用ssh-keygen
创建一个新的 SSH 公钥/私钥对并将其添加到sshKeys
,如上所述,或者使用gcutil ssh
创建它们并管理sshKeys
。 - 如果您主要使用控制台,则
sshKeys
条目中的帐户名称可能与您的本地用户名不匹配,您可能需要将-l
参数提供给 SSH。
确保您的主目录和您要连接的主机上用户的主目录的权限设置为 700(拥有用户 rwx 只是为了防止其他人看到 .ssh 子目录)。
然后确保 ~/.ssh 目录也是 700(用户 rwx),并且 authorized_keys 是 600(用户 rw)。
~/.ssh 目录中的私钥应为 600 或 400(用户 rw 或用户 r)
我很长一段时间都在面对这个问题。最后是 ssh-add 的问题。未考虑 Git ssh 凭据。
检查以下命令可能对您有用:
ssh-add
我遇到了同样的问题,由于某种原因,sshKeys 没有与我在实例上的用户同步。
我通过将--ssh_user=anotheruser添加到 gcutil 命令来创建另一个用户。
gcutil 看起来像这样
gcutil --service_version="v1" --project="project" --ssh_user=anotheruser ssh --zone="us-central1-a" "inst1"
在连接到我刚刚创建的计算引擎 VM 后,我刚刚遇到了类似的消息 [我的是“权限被拒绝(公钥)”]。看完这篇文章,我决定再试一次。
那个时候奏效了。所以我看到它第二次工作的 3 个可能原因,
- 第二次连接可以解决问题(在第一次创建 ssh 密钥之后),或者
- 也许在创建后立即尝试连接到计算引擎也可能导致问题在一段时间后自行解决,或者
- 仅仅阅读这篇文章就可以解决问题
我怀疑最后一个不太可能:)
我在使用 ssh 连接 ec2 实例时发现了这个错误。如果我写错了用户名,它就会出现。
例如。对于 ubuntu,我需要使用 ubuntu 作为用户名,对于其他人,我需要使用 ec2-user。
您还没有接受答案,所以这就是PuTTY中对我有用的方法:
在不允许更改用户名的情况下,我在网关机器上将此问题的主题视为错误。
这里的技巧是使用 -C(注释)参数来指定您的 GCE 用户 ID。看起来谷歌最后一次在 2018 年引入了这一变化。
如果拥有 GCE 实例的 Google 用户是 myname@gmail.com(您将用作登录用户 ID),则生成密钥对(例如)
ssh-keygen -b521 -t ecdsa -C myname -f mykeypair
当您将 mykeypair.pub 粘贴到实例的公钥列表中时,您应该会看到“myname”显示为密钥的用户 ID。
设置它可以让您从命令行使用 ssh、scp 等。
我从这里开始关注一切: https ://cloud.google.com/compute/docs/instances/connecting-to-instance#generatesshkeypair
但是仍然有一个错误,我的实例元数据中的 SSH 密钥没有被识别。
解决方案:检查您的 ssh 密钥是否有任何换行符。当我使用 cat 复制我的公钥时,它在密钥中添加了行,从而破坏了密钥。必须手动检查任何换行符并更正它。
您需要遵循此说明 https://cloud.google.com/compute/docs/instances/connecting-to-instance#generatesshkeypair
如果得到“权限被拒绝(公钥)”。使用以下命令
ssh -i ~/.ssh/my-ssh-key [USERNAME]@[IP_ADDRESS]
,您需要修改 /etc/ssh/sshd_config 文件并添加该行
AllowUsers [USERNAME]
然后重启ssh服务
service ssh restart
如果您收到消息“无法加载主机密钥:/etc/ssh/ssh_host_ed25519_key”,请执行:
ssh-keygen -A
最后再次重新启动 ssh 服务。
service ssh restart