以root身份运行结构脚本

时间:2013-02-27 13:48:35

标签: python sudo fabric su

我正在尝试使用fabric来自动执行我在几台服务器上执行的一些管理工作。一般流程如下:

  1. SSH与本地用户
  2. 运行:sudo su -成为root(再次提供本地用户密码)
  3. 以root身份完成工作:)
  4. 不幸的是,使用run('sudo su -')会阻止脚本的执行并允许用户输入。当我键入exitCtrl+D时,scipt会恢复,但没有root权限。

    我在Switching user in Fabric中看到了类似的问题,但我被限制为sudo su -,因为我不允许更改包含以下行的/etc/sudoers文件:

    localuser ALL = /usr/bin/su -

    我浏览了织物的来源,试图找到一种解决方法,但没有成功。

3 个答案:

答案 0 :(得分:4)

遇到与您相同的问题(管理员仅允许sudo su - user,{}不允许sudo -u user -c cmd),这是我的fabric工作解决方案:

from ilogue.fexpect import expect, expecting, run 

def sudosu(user, cmd):
    cmd += ' ;exit'
    prompts = []
    prompts += expect('bash', cmd)
    prompts += expect('assword:', env.password)

    with expecting(prompts):
        run('sudo su - ' + user)

def host_type():
    sudosu('root', 'uname -s')

答案 1 :(得分:2)

您的问题有多种解决方案。首先,您希望使用sudo运行命令。您可以使用结构方法sudo代替run runs a shell command on a remote host, with superuser privilegessudo ref)的sudo

例如,使用sudo("~/install_script.py") sudo("mkdir /var/www/new_docroot", user="www-data") sudo("ls /home/jdoe", user=1001) result = sudo("ls /tmp/")

执行这些命令
sudo

另一个想法是你要包装一组命令(需要prefix编辑)。 您可以使用Fabric上下文管理器(ref)来执行此操作。特别是,您可以使用settingswith settings(user='root'): run('do something') run('do another thing')

例如:

{{1}}

一旦root密码问你,然后以root身份执行命令。 您可以通过tweek设置来存储密码。

答案 2 :(得分:0)

针对以下问题有一种解决方案Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname. 您可以尝试sudo('mkdir ~/test_fabric',shell=False)。使用参数shell来避免使用bash参数-l