【问题标题】:Running fabric scripts as root以 root 身份运行结构脚本
【发布时间】:2023-03-16 00:59:01
【问题描述】:

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

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

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

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

localuser ALL = /usr/bin/su -

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

【问题讨论】:

  • 使用sudo_prefix='su - -c ' 如该帖子所述需要root密码。如果我使用sudo_prefix='sudo su - -c ',我会收到此错误消息Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname.
  • 设置shell=False似乎没有效果。设置pty=False 返回错误sudo: no tty present and no askpass program specified

标签: python sudo fabric su


【解决方案1】:

遇到了和你一样的问题,(管理员只允许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')

【讨论】:

  • 这看起来是一个不错的解决方案,但它需要 python 在远程机器上。
【解决方案2】:

您的问题有多种解决方案。首先,您想使用sudo 运行命令。你可以使用fabric方法sudo代替run那个runs a shell command on a remote host, with superuser privileges(sudo 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/")

另一个想法是你想包装一组命令(需要sudoed)。 您可以使用 Fabric 上下文管理器 (ref) 来执行此操作。特别是,您可以使用prefixsettings

例如:

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

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

【讨论】:

  • 这两种解决方案都不适合我。我尝试了第一个,sudo('pwd') 转换为sudo -S -p 'sudo password:' /bin/bash -l -c "pwd",我收到一条错误消息Sorry, user localuser is not allowed to execute '/bin/bash -l -c pwd' as root on hostname. 第二个解决方案意味着我有 root 密码,但我没有。
  • 对于第二种解决方案,您不能使用您通常使用的密码来获得超级用户访问权限吗?
【解决方案3】:

以下问题有一种解决方案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

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2014-05-21
    • 1970-01-01
    • 2016-06-19
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多