sudoers - Google Compute Engine - 无权访问root

时间:2014-12-23 14:47:26

标签: root google-compute-engine sudoers

我有一台运行Asterisk服务器的Google Compute Engine 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是否有密码所以我可以尝试在那里更改?对此有何建议?

6 个答案:

答案 0 :(得分:7)

看起来您已手动编辑了/etc/sudoers文件,因此在您通常sudo访问时,由于解析错误,您将无法直接执行此操作。

以下是解决这种情况的方法。

<强> 1。保存当前启动盘

  • 转到Developers Console中的实例视图
  • 找到您的VM实例并单击其名称;你现在应该看一个像这样的URL https://console.cloud.google.com/project/[PROJECT]/compute/instancesDetail/zones/[ZONE]/instances/[VM-NAME]
  • 重要提示:取消选中“删除实例时删除启动磁盘”框
  • 删除实例

<强> 2。修复/etc/sudoers在启动盘上

  • 使用自己的启动盘创建新的VM实例;你应该sudo访问
  • attach上面保存的磁盘作为单独的永久磁盘
  • 安装刚刚连接的磁盘
  • 修复磁盘上的/etc/sudoers文件
  • 卸载第二个磁盘
  • 从VM中分离第二个磁盘
  • 删除新的VM实例(让它删除它的启动盘,你不需要它)

第3。恢复原始VM实例

  • 使用您作为启动盘的磁盘重新创建原始VM实例

如何在将来避免这种情况

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

答案 1 :(得分:2)

我也遇到了这个问题,在尝试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

答案 2 :(得分:1)

正如您可能想到的那样,需要修复/ etc / sudoers文件。由于没有人对该实例具有root访问权限,因此您无法从实例内部执行此操作。

解决此问题的最佳方法是edit the disk from another instance。执行此操作的基本步骤是:

  1. 将您的磁盘快照作为备份(!)
  2. 关闭您的实例,注意不要删除启动盘。
  3. 从其中一个库存GCE图像启动一个新的“调试器”实例。
  4. Attach the old boot disk到新实例。
  5. 在调试器实例中,装入磁盘。
  6. 在调试器实例中,修复挂载磁盘上的sudoers文件。
  7. 在调试器实例中,卸载磁盘
  8. 关闭调试器实例。
  9. 使用固定磁盘作为启动磁盘,使用与原始实例相同的规范创建新实例。
  10. 然后新磁盘将具有固定的sudoers文件。

答案 3 :(得分:1)

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

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

我在一台以gcloud为root的服务器上运行了这个,所以你也以root身份登录到另一个盒子!然后解决您的问题。 (如果你没有盒子,只需用正确的gcloud特权旋转一个微型)可以省去磁盘等的麻烦。

答案 4 :(得分:1)

正如上面的评论中提到的,我在 gcp VM 中遇到了如下相同的错误。

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>"

还有 BOOM!,现在以 root 身份登录 VM。

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


我发现这个 hack 比重新创建虚拟机/磁盘更好。 希望这对某人有所帮助!

答案 5 :(得分:0)

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

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

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

然后,您可以修复此问题以及可能阻止您使用sudo的其他问题。