【问题标题】:os.system('sudo shutdown now -P') doesn't work with cloud-initos.system('sudo shutdown now -P') 不适用于 cloud-init
【发布时间】:2014-02-09 04:41:24
【问题描述】:

我想以编程方式启动 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

显然在/etc/sudoers 上注释掉Default requiretty 行可以解决问题,但我想以编程方式做事,所以我想这不是一个选项(它可能也需要root 权限,这让我们回过头来平方一)。

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

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

【问题讨论】:

  • 我很困惑,您为什么不想注释掉相应的行“/etc/sudoers”并“以编程方式”执行sudo shutdown 命令?
  • 请原谅我的 nOOb 问题,但是有没有办法以编程方式注释掉 Default requiretty 行呢?而且这本身不需要root权限吗?
  • 抱歉,我的意思是您可以在登录并修改系统文件后以编程方式执行sudo shutdown 命令。为什么需要从同一个脚本修改文件?
  • 因为我没有实际登录,所以我通过 cloud-init 传递脚本。

标签: python linux amazon-web-services amazon-ec2 cloud-init


【解决方案1】:

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

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

如果您的尝试可行,Linux 上将没有任何保护措施,Linux(与所有 Unix 一样)是multi-user 操作系统。

【讨论】:

  • 假设我手动更改 /etc/sudoers 然后重新捆绑 AMI。这种变化会传播到新实例吗?
  • 好的,我会尝试并在这里报告。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多