5

我正在尝试使用结构来自动化我在几台服务器上所做的一些管理工作。一般流程如下:

  1. SSH 与本地用户
  2. 运行:sudo su -成为root(再次提供本地用户密码)
  3. 以root身份完成工作:)

不幸的是,使用run('sudo su -')会阻止脚本的执行并允许用户输入。当我键入exitCtrl+Dscipt 恢复时,但没有 root 权限。

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

localuser ALL = /usr/bin/su -

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

4

3 回答 3

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')
于 2014-03-18T14:56:23.470 回答
2

您的问题有几种解决方案。首先,您想使用sudo. 您可以使用 fabric 方法来sudo代替(sudo ref)。runruns a shell command on a remote host, with superuser privileges

例如,这些命令使用以下命令执行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编辑)。您可以使用 Fabric 上下文管理器 ( ref ) 来执行此操作。特别是,您可以使用prefixor settings

例如:

with settings(user='root'):
    run('do something')
    run('do another thing')

将询问您一次root密码,然后以root身份执行命令。您可以使用 tweek 设置来存储密码。

于 2013-02-27T14:41:17.700 回答
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)。使用 paramshell来避免 bash param -l

于 2017-01-06T12:44:39.680 回答