将结构脚本运行为

2024-05-18 09:09:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 本地用户的SSH
  2. 运行:sudo su -成为根用户(再次提供本地用户密码)
  3. 做根的工作:)

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

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

localuser ALL = /usr/bin/su -

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


Tags: run用户服务器脚本密码键入exitsudo
3条回答

你的问题有几种解决方法。首先,要使用sudo运行命令。您可以使用fabric方法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/")

另一个想法是要包装一组命令(需要sudoed)。 您可以使用Fabric上下文管理器(ref)来实现这一点。特别是,您可以使用prefixsettings

例如:

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

将询问您一次根密码,然后作为根执行命令。 您可以选择存储密码的设置。

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

面对与您相同的问题(只有管理员允许的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')

相关问题 更多 >