Python 系统(';sudo shutdown now-P';)不';不能使用cloudinit

Python 系统(';sudo shutdown now-P';)不';不能使用cloudinit,python,linux,amazon-web-services,amazon-ec2,cloud-init,Python,Linux,Amazon Web Services,Amazon Ec2,Cloud Init,我想以编程方式启动一个AmazonEC2实例,使用CloudInit执行一个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:对不起,您必须有一

我想以编程方式启动一个AmazonEC2实例,使用CloudInit执行一个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:对不起,您必须有一个tty才能运行sudo

显然,注释掉
/etc/sudoers
上的
默认requirety
行就可以了,但是我想用编程的方式来做事情,所以我想这不是一个选项(而且可能还需要root权限,这让我们回到原点)

我想我可以使用一个由多个部分组成的cloudinit脚本——比如说,在Python脚本之后使用一个bash脚本来完成自终止。但肯定有办法从Python内部解决这个问题吗


(Amazon Linux.Python 2.7.5.Boto 2.23)

如果没有适当的权限(syscall要求),您无法关闭Linux系统

您需要root权限来编辑
/etc/sudoers
以启用
sudo
,而无需密码


如果您所尝试的是可能的,那么Linux(像所有Unix一样)是一个操作系统,它将没有任何保护。

这可能是AWS唯一的解决方案,但是


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

我很困惑,为什么不注释掉相应的行“/etc/sudoers”并“以编程方式”执行
sudo shutdown
命令?请原谅我的nOOb问题,但是有没有一种方法可以通过编程方式注释掉
defaultrequirety
行呢?这本身不需要root权限吗?对不起,我的意思是,您可以在登录并修改系统文件后以编程方式执行
sudo shutdown
命令。为什么需要修改同一脚本中的文件?因为我没有实际登录,所以我正在通过cloud-init传递脚本。假设我手动更改
/etc/sudoers
,然后重新绑定AMI。这种变化会传播到新的实例吗?好的,我会尝试一下,然后在这里报告。