以root身份运行fabric脚本

6 投票
3 回答
7194 浏览
提问于 2025-04-17 17:19

我正在尝试使用fabric来自动化我在几个服务器上进行的一些管理工作。大致流程如下:

  1. 用本地用户进行SSH连接
  2. 运行:sudo su -来切换到root用户(需要再次输入本地用户的密码)
  3. 以root身份进行工作 :)

不过,使用run('sudo su -')会阻塞脚本的执行,并且需要用户输入。当我输入exitCtrl+D时,脚本会继续运行,但没有root权限。

我在Fabric中切换用户的讨论中看到过类似的问题,但我只能使用sudo su -,因为我不被允许更改/etc/sudoers文件,而这个文件中有以下内容:

localuser ALL = /usr/bin/su -

我查看了fabric的源代码,试图找到解决办法,但没有成功。

3 个回答

0

针对这个问题,有一个解决办法:抱歉,用户 localuser 没有权限以 root 身份在主机上执行 '/usr/bin/su - -c /bin/bash -l -c pwd'。你可以试试这个命令:sudo('mkdir ~/test_fabric',shell=False)。这里使用了参数 shell,是为了避免使用 bash 的 -l 参数。

2

你遇到的问题有几种解决办法。首先,你需要用 sudo 来运行命令。你可以用 Fabric 的 sudo 方法,代替 run,这样就可以在远程主机上以超级用户的权限执行命令(查看 sudo 的说明)。

比如,下面这些命令是用 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 的上下文管理器(查看说明)来实现。特别是,你可以使用 prefixsettings

例如:

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

这会让你输入一次根用户的密码,然后以根用户的身份执行命令。你可以调整设置来保存密码。

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')

撰写回答