Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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 如何以系统用户的身份运行bash命令,而不授予该用户以任何用户的身份运行命令的权限_Python_Bash_Ssh_Visudo - Fatal编程技术网

Python 如何以系统用户的身份运行bash命令,而不授予该用户以任何用户的身份运行命令的权限

Python 如何以系统用户的身份运行bash命令,而不授予该用户以任何用户的身份运行命令的权限,python,bash,ssh,visudo,Python,Bash,Ssh,Visudo,我编写了一个python脚本,其中包括以下内容: response=subprocess.check_输出['/usr/bin/sudo/bin/su-backup-c/usr/bin/ssh-q-o StrictHostKeyChecking=no%s bash-s至于sudo: …仅当您直接从shinken切换到backup时才有效。您在这里没有这样做。sudo su-backup告诉sudo切换到root,并以root身份运行命令su-backup。显然,如果您要使用我在别处建议不要使用的

我编写了一个python脚本,其中包括以下内容:

response=subprocess.check_输出['/usr/bin/sudo/bin/su-backup-c/usr/bin/ssh-q-o StrictHostKeyChecking=no%s bash-s至于sudo:

…仅当您直接从shinken切换到backup时才有效。您在这里没有这样做。sudo su-backup告诉sudo切换到root,并以root身份运行命令su-backup。显然,如果您要使用我在别处建议不要使用的sudo su,您需要/etc/sudoers配置来支持这一点

因为您的/etc/sudoers不允许直接切换到您请求的root用户,所以它试图提示输入密码,这需要TTY,从而导致失败

下面,我正在重写脚本,以便直接从shinken切换到备份,而无需通过root并运行su:

至于剧本:

import subprocess

remote_script='''
PATH=/usr/local/bin:$PATH
mvn --version 2>&1 | awk '/Apache/ { print $3 }' 
'''

def maven_version_for_host(hostname):

    # storing the command lets us pass it when constructing a CalledProcessError later
    # could move it directly into the Popen creation if you don't need that.
    cmd = [
        'sudo', '-u', 'backup', '-i', '--',
        'ssh', '-q', '-o', 'StrictHostKeyChecking=no', str(hostname),
        'bash -s' # arguments in remote-command position to ssh all get concatenated
                  # together, so passing them as one command aids clarity.
    ]
    proc = subprocess.Popen(cmd,
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    response, error_string = proc.communicate(remote_script)
    if proc.returncode != 0:
        raise subprocess.CalledProcessError(proc.returncode, cmd, error_string)
    return response.split('\n', 1)[0]

你也许可以使用变量SUDO_askpass帐户没有密码,所以我认为这不会有帮助。我也尝试在我的sudoers文件中设置默认值:shinken!requirety,但也没有帮助…帐户?哪个帐户?SUDO正在将活动用户更改为root,然后su从root下降到backup。SUDO su-backup不是single统一步骤-它运行两个完全独立的程序…如果您只想有一个步骤,那么您应该运行sudo-u backup-i。无论如何,当sudo请求密码时,它请求的是您的当前密码,而不是目标帐户的密码,除非相反地配置。显然,您希望它配置为NOPASSWD:对于这个用例,但这需要在/etc/sudoers中,而不是与脚本相关的细节。仅供参考,re:建议的编辑添加2>&1,您可以将'bash-s 2>&1'全部放在一个字符串中-这是因为ssh连接其所有尾部位置参数以生成一个命令。也就是说,如果您想要捕获stderr,您可以还要传递stderr=subprocess.PIPE,注意通信返回的元组的第二部分……或者您可以传递stderr=subprocess.STDOUT来组合它们,如果您希望组合它们而不是将错误分开,我个人会这样做——这样您就可以捕获来自sudo或ssh的错误,而不仅仅是cap处理发生在远程端的错误…不过,我个人认为将错误分开是最佳做法;请参阅编辑。添加这一点的原因是,当使用java而不是maven运行检查时,java检查的响应会出现在终端中,但响应字段中没有值,因此检查不会出现错误ork。maven检查在我输入2&>1时不起作用,所以我显然是错的。我已将编辑更改为Follow。另外,先生,您是一位绅士,非常感谢您在这里帮助我,有些很明显,有些不太像有响应和错误字符串,感谢您更改了标签!但这会花费我很长时间呃没有你的帮助!!
shinken ALL=(backup) NOPASSWD: ALL
sudo: no tty present and no askpass program specified
response = subprocess.check_output(['/usr/bin/sudo -u backup """ "/usr/bin/ssh -q -o StrictHostKeyChecking=no %s bash -s" <<\'EOF\'\nPATH=/usr/local/bin:$PATH\njava -version|grep -i version|awk \'{print $3}\'|tr -d \'\n\'\nEOF""" ' % i], shell=True)
subprocess.CalledProcessError: Command '['/usr/bin/sudo -u backup """ "/usr/bin/ssh -q -o StrictHostKeyChecking=no bamboo-agent-01 bash -s" <<\'EOF\'\nPATH=/usr/local/bin:$PATH\njava -version|grep -i version|awk \'{print $3}\'|tr -d \'\n\'\nEOF""" ']' returned non-zero exit status 1
sudo:  /usr/bin/ssh: command not found
shinken ALL=(backup) NOPASSWD: ALL
import subprocess

remote_script='''
PATH=/usr/local/bin:$PATH
mvn --version 2>&1 | awk '/Apache/ { print $3 }' 
'''

def maven_version_for_host(hostname):

    # storing the command lets us pass it when constructing a CalledProcessError later
    # could move it directly into the Popen creation if you don't need that.
    cmd = [
        'sudo', '-u', 'backup', '-i', '--',
        'ssh', '-q', '-o', 'StrictHostKeyChecking=no', str(hostname),
        'bash -s' # arguments in remote-command position to ssh all get concatenated
                  # together, so passing them as one command aids clarity.
    ]
    proc = subprocess.Popen(cmd,
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    response, error_string = proc.communicate(remote_script)
    if proc.returncode != 0:
        raise subprocess.CalledProcessError(proc.returncode, cmd, error_string)
    return response.split('\n', 1)[0]