sudoers - Google Compute Engine - 没有 root 访问权限

5

我有一个在Google Compute Engine上运行的Asterisk服务器的VM实例。当我尝试运行sudo时,会收到以下消息:

sudo: parse error in /etc/sudoers near line 21
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

有没有root的密码,这样我就可以尝试在那里更改它了?对此有什么建议吗?


你需要从你的服务器管理员那里获取。 - Panther
这是我 ;) - 你知道Google Cloud Engine是否提供从console.developers.google.com重置Root的功能吗? - MCG
7个回答

11

看起来您手动编辑了/etc/sudoers文件,因此尽管您通常具有sudo访问权限,但由于解析错误,您将无法直接执行此操作。

以下是修复此问题的方法。

1. 保存当前引导磁盘

  • 转到Google Cloud Console中的实例视图

  • 找到您的VM实例并单击其名称; 您现在应该正在查看类似于此URL的内容:https://console.cloud.google.com/project/[PROJECT]/compute/instancesDetail/zones/[ZONE]/instances/[VM-NAME]

  • 停止实例

  • 从实例中分离引导磁盘

2. 修复引导磁盘上的/etc/sudoers

  • 创建一个拥有自己引导磁盘的新VM实例;您应该在此处具有sudo访问权限
  • 将上面保存的磁盘作为单独的持久磁盘附加
  • 挂载刚刚附加的磁盘
  • 修复磁盘上的/etc/sudoers文件
  • 卸载第二个磁盘
  • 从VM中分离第二个磁盘
  • 删除新的VM实例(让它删除其引导磁盘,您不需要它)

3. 恢复原始VM实例

  • 重新附加引导磁盘到原始VM
  • 使用已更正的配置重启带有原始引导磁盘的原始VM

如何避免这种情况再次发生

以后编辑 /etc/sudoers 文件时,应该始终使用命令visudo,而不是直接使用任何文本编辑器,因为这会在保存之前验证文件的内容。


1
太好了!我正要从头开始。你救了我的一天! - MCG
你也可以尝试使用 EDITOR=nano visudo 或者在 screen 中开启 root 会话以进行紧急修复。 - Nakilon
1
  1. 修复引导磁盘上的 /etc/sudoers:对我来说完美地解决了问题。感谢您提供的解决方案。
- Amol Ghatol
我按照这些步骤操作,但当我从服务器上拆下磁盘时,所有的东西都被删除了。太好了。 - Oscar Chambers

10

我也遇到了这个问题,并且在尝试gcloud解决方法时出现了Nakilon报告的相同问题。

我们最终做的是配置一个启动脚本,删除了破损的sudoers文件。

因此,在您的metadata中放置类似以下内容:

#/bin/sh

rm "/etc/sudoers.d/broken-config-file"
echo "ok" > /tmp/ok.log

https://cloud.google.com/compute/docs/startupscript


1
除了这个完美的解决方案,其他所有答案都不起作用,非常感谢,它救了我的一天。 - Calvin Zhou
1
非常感谢,那个方法确实有效,但我还需要运行 usermod -aG sudo username。无论如何,这是恢复 root 访问权限的方法 :) - Emma Labbé

1

由于我也遇到了这个问题,如果您有另一个实例或任何可以使用gcloud特权运行的地方,您可以运行:

gcloud compute --project "<project id>" ssh --zone "europe-west1-b" "<servername>"

我在一个安装了gcloud的服务器上运行了这个命令,所以你也需要以root用户身份登录到另一台机器上!然后解决你的问题。(如果你没有一台机器,只需启动一个具有正确gcloud权限的微型实例即可),这样可以节省磁盘等问题的麻烦。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic). ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255]. - Nakilon
这比删除/重新创建实例要好得多!谢谢! - darron
哦,太棒了!感谢您在Gcp中为这个问题提供的绝妙解决方案。这真的解决了我的问题。 - Abhinay Gupta

1
您可能已经意识到,这需要修复/etc/sudoers文件。由于没有人拥有该实例的root访问权限,您将无法从实例内部执行此操作。
解决此问题的最佳方法是从另一个实例编辑磁盘。要执行此操作的基本步骤如下:
  1. 备份磁盘快照(!)
  2. 关闭实例,注意不要删除引导磁盘。
  3. 从标准GCE映像之一启动新的“调试器”实例。
  4. 将旧的引导磁盘附加到新实例。
  5. 在调试器实例中,挂载磁盘。
  6. 在调试器实例中,在已挂载的磁盘上修复sudoers文件。
  7. 在调试器实例中,卸载磁盘。
  8. 关闭调试器实例。
  9. 创建一个与原始实例具有相同规格的新实例,使用已修复的磁盘作为引导磁盘。
然后,新磁盘将具有已修复的sudoers文件。

1
正如上面的评论所提到的,我在GCP虚拟机中遇到了以下相同的错误。
sudo: parse error in /etc/sudoers near line 21
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

我已经通过ssh登录到另一个虚拟机并以root身份运行gcloud ssh命令连接到我们的主要虚拟机(出现sudo错误的地方)。为了解决这个问题。
gcloud compute --project "<project id>" ssh --zone "europe-west1-b "<servername>"

现在,您已经作为VM中的root用户登录。

现在,您可以相应地访问/更改/etc/sudoers文件。


我发现这种方法比重新创建vm /磁盘更好。 希望这对某些人有所帮助!


你是我的英雄。小提示:可以直接从Cloud Shell机器上执行此操作,只需在运行gcloud命令之前在Cloud Shell中执行“sudo su”即可。 - Jefrey Sobreira Santos

0

您可以从开发者控制台Google Cloud Shell以root身份连接到VM。确保VM正在运行,启动Shell并使用此命令:

gcloud compute ssh root@<instance-name> --zone <zone> [--project <project-id>]

在 Compute Engine VM 实例屏幕中找到 instance-name。如果您要连接到与启动 shell 的项目不同的项目中的实例,则 project-id 是可选的,但是必需的。

然后,您可以解决可能会阻止您使用 sudo 的此问题和其他问题。


Permission denied (publickey,gssapi-keyex,gssapi-with-mic). ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255]. - Nakilon

0
当我尝试通过gcloud ssh到问题实例时,出现了“Permission denied”错误。使用@Jorick上面提到的启动脚本可以解决这个问题。有关此脚本的说明在这里。您需要停止并重新启动VM实例以执行启动脚本。我稍微修改了脚本:
rm -f /etc/sudoers.d/google_sudoers >& /tmp/startup.log

重启后,从云控制台启动一个SSH会话,并检查您是否能够查看文件内容(例如使用sudo more /etc/sudoers.d/google_sudoers)。如果可以正常工作,则问题已经解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接