如何以系统用户身份 运行 bash 命令而不授予该用户以任何用户身份执行 运行 命令的权利
How to run the bash command as a system user without giving that user the right to run commands as any user
我写了一个 python 脚本,其中包括这一行:
response = subprocess.check_output(['/usr/bin/sudo /bin/su - backup -c "/usr/bin/ssh -q -o StrictHostKeyChecking=no %s bash -s" <<\'EOF\'\nPATH=/usr/local/bin:$PATH\nmvn --version|grep -i Apache|awk \'{print }\'|tr -d \'\n\'\nEOF' % i], shell=True)
这是一个 for 循环,遍历主机名列表,我想检查每个主机名的命令结果。当我自己 运行 它时,这工作正常,但是,这个脚本将由系统用户 运行(shinken - 一个 nagios 分支)在这一点上我遇到了一个问题。
shinken ALL=(ALL) NOPASSWD: ALL
但是,我想限制用户只允许它运行作为备用用户:
shinken ALL=(backup) NOPASSWD: ALL
但是当我 运行 脚本时,我得到:
sudo: no tty present and no askpass program specified
我已阅读相关内容并尝试了一些方法来修复它。我尝试将 -t 添加到我的 ssh 命令,但这没有帮助。我相信我应该能够 运行 使用类似于以下内容的命令:
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 }\'|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 }\'|tr -d \'\n\'\nEOF""" ']' returned non-zero exit status 1
如果我手动 运行 命令我得到:
sudo: /usr/bin/ssh: command not found
这很奇怪,因为那是它所在的地方....我不知道我正在尝试的东西是否可行。感谢您的任何建议!
至于sudo
:
shinken ALL=(backup) NOPASSWD: ALL
...仅当您 直接 从 shinken
切换到 backup
时才有效。 你在这里不这样做。 sudo su - backup
告诉 sudo
将 切换到 root,然后切换到 运行 命令 su - backup
as root。那么,显然,如果您要使用 sudo su
(我在其他地方建议不要这样做),您需要 /etc/sudoers
配置来支持它。
因为您的 /etc/sudoers
不允许直接切换到您请求的 root
,它会尝试提示输入密码,这需要 TTY,因此会导致失败。
下面,我正在重写脚本以直接从 shinken
切换到 backup
, 而无需 通过 root
和 运行宁 su
:
至于剧本:
import subprocess
remote_script='''
PATH=/usr/local/bin:$PATH
mvn --version 2>&1 | awk '/Apache/ { print }'
'''
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]
我写了一个 python 脚本,其中包括这一行:
response = subprocess.check_output(['/usr/bin/sudo /bin/su - backup -c "/usr/bin/ssh -q -o StrictHostKeyChecking=no %s bash -s" <<\'EOF\'\nPATH=/usr/local/bin:$PATH\nmvn --version|grep -i Apache|awk \'{print }\'|tr -d \'\n\'\nEOF' % i], shell=True)
这是一个 for 循环,遍历主机名列表,我想检查每个主机名的命令结果。当我自己 运行 它时,这工作正常,但是,这个脚本将由系统用户 运行(shinken - 一个 nagios 分支)在这一点上我遇到了一个问题。
shinken ALL=(ALL) NOPASSWD: ALL
但是,我想限制用户只允许它运行作为备用用户:
shinken ALL=(backup) NOPASSWD: ALL
但是当我 运行 脚本时,我得到:
sudo: no tty present and no askpass program specified
我已阅读相关内容并尝试了一些方法来修复它。我尝试将 -t 添加到我的 ssh 命令,但这没有帮助。我相信我应该能够 运行 使用类似于以下内容的命令:
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 }\'|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 }\'|tr -d \'\n\'\nEOF""" ']' returned non-zero exit status 1
如果我手动 运行 命令我得到:
sudo: /usr/bin/ssh: command not found
这很奇怪,因为那是它所在的地方....我不知道我正在尝试的东西是否可行。感谢您的任何建议!
至于sudo
:
shinken ALL=(backup) NOPASSWD: ALL
...仅当您 直接 从 shinken
切换到 backup
时才有效。 你在这里不这样做。 sudo su - backup
告诉 sudo
将 切换到 root,然后切换到 运行 命令 su - backup
as root。那么,显然,如果您要使用 sudo su
(我在其他地方建议不要这样做),您需要 /etc/sudoers
配置来支持它。
因为您的 /etc/sudoers
不允许直接切换到您请求的 root
,它会尝试提示输入密码,这需要 TTY,因此会导致失败。
下面,我正在重写脚本以直接从 shinken
切换到 backup
, 而无需 通过 root
和 运行宁 su
:
至于剧本:
import subprocess
remote_script='''
PATH=/usr/local/bin:$PATH
mvn --version 2>&1 | awk '/Apache/ { print }'
'''
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]