Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以root用户身份运行结构脚本_Python_Sudo_Fabric_Su - Fatal编程技术网

Python 以root用户身份运行结构脚本

Python 以root用户身份运行结构脚本,python,sudo,fabric,su,Python,Sudo,Fabric,Su,我正在尝试使用fabric自动化一些管理工作,这些工作是我在两台服务器上完成的。一般流程如下所示: 本地用户SSH 运行:sudo su-成为root用户(再次提供本地用户密码) 以root用户身份执行此工作:) 不幸的是,使用run('sudosu-')会阻止脚本的执行并允许用户输入。当我键入exit或Ctrl+D时,scipt恢复,但没有root权限 我在中看到过类似的问题,但我仅限于sudo su-,因为我不允许更改包含以下行的/etc/sudoers文件: localuser ALL=/

我正在尝试使用fabric自动化一些管理工作,这些工作是我在两台服务器上完成的。一般流程如下所示:

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

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

    localuser ALL=/usr/bin/su-


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

    有几种解决方案。首先,要使用
    sudo
    运行命令。您可以使用fabric方法
    sudo
    而不是
    run
    ,该方法
    在远程主机上以超级用户权限运行shell命令

    例如,使用
    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
    ed)。 您可以使用结构上下文管理器()来实现这一点。特别是,您可以使用
    前缀
    设置

    例如:

    with settings(user='root'):
        run('do something')
        run('do another thing')
    
    将询问您一次root密码,然后以root身份执行命令。
    您可以通过设置来存储密码。

    遇到了与您相同的问题,(管理员只允许
    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')
    

    以下问题有一个解决方案
    对不起,不允许用户localuser在主机名上以root用户身份执行“/usr/bin/su--c/bin/bash-l-c pwd”。

    您可以尝试
    sudo('mkdir~/test\u fabric',shell=False)
    。使用param
    shell
    来避免bash param
    -l

    看看这个例子:如那篇文章所述,使用sudo_prefix='su--c'
    需要根密码。如果我使用
    sudo\u prefix='sudo su--c'
    我会收到此错误消息
    对不起,不允许用户localuser在主机名上执行'/usr/bin/su--c/bin/bash-l-c pwd'作为根用户。
    设置
    shell=False
    似乎没有效果。设置
    pty=False
    返回错误
    sudo:no tty present和no askpass program specified
    这两种解决方案对我都不起作用。我尝试了第一个,而
    sudo('pwd')
    转换为
    sudo-S-p'sudo密码:'/bin/bash-l-c“pwd”
    ,我收到一条错误消息
    对不起,不允许用户localuser在主机名上以root用户身份执行“/bin/bash-l-c pwd”。
    第二个解决方案意味着我有root密码,而我没有。对于第二个解决方案,您不能使用通常用于获取超级用户访问权限的密码吗?这看起来是一个不错的解决方案,但它要求python位于远程计算机上。