0

我想以编程方式启动 Amazon EC2 实例,使用 cloud-init 执行 Python 脚本,然后让相同的脚本终止实例。一切正常,除了自我终止部分。我试过这个:

os.system('sudo shutdown now -P')

和这个:

os.system('sudo -n shutdown now -P')

还有这个:

os.popen('sudo -S shutdown now -P')

不好。在所有情况下,/var/log/cloud-init.log文件都显示sudo: sorry, you must have a tty to run sudo.

显然,注释掉这Default requiretty行就/etc/sudoers可以了,但我想以编程方式做事,所以我想这不是一个选择(而且它可能也需要 root 权限,这让我们回到了原点)。

我想我可以使用一个多部分的 cloud-init 脚本——比如说,在 Python 脚本之后使用一个 bash 脚本来执行自终止。但是肯定有一种方法可以在 Python 中解决这个问题吗?

(亚马逊 Linux。Python 2.7.5。Boto 2.23)

4

2 回答 2

1

如果没有适当的权限( reboot(2)系统调用需要),您无法关闭 Linux 系统。

并且您需要 root 权限才能编辑以无需密码/etc/sudoers即可启用。sudo

如果您尝试的是可能的,那么 Linux 上就没有保护,它(像所有 Unix 一样)是一个多用户操作系统。

于 2014-01-20T06:37:00.157 回答
1

这可能是一个仅限 AWS 的解决方案,但是......

我启动了一个 EC2 实例,通过 SSH 连接到其中,手动注释掉Default requirettyon /etc/sudoers,保存更改,基于该实例创建一个 Amazon 系统映像 (AMI),然后使用该 AMI 启动所有其他实例。更改会/etc/sudoers传播到基于该 AMI 的任何实例,因此os.system('sudo shutdown now -P')可以正常工作。

于 2014-01-20T07:14:16.423 回答