【发布时间】:2017-06-11 18:14:46
【问题描述】:
我编写了一个包含这一行的 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 $3}\'|tr -d \'\n\'\nEOF' % i], shell=True)
这是在一个遍历主机名列表的 for 循环中,我想检查每个主机名的命令结果。当我自己运行它时,它工作得很好,但是,这个脚本将由系统用户(shinken - nagios fork)运行,此时我遇到了一个问题。
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 $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
这很奇怪,因为那是它生活的地方......我不知道我正在尝试的东西是否可能。感谢您的任何建议!
【问题讨论】:
-
你也许可以使用变量
SUDO_ASKPASS -
该帐户没有密码,所以我认为这不会有帮助。我还尝试在我的 sudoers 文件中设置“Defaults:shinken !requiretty”,但这也没有帮助....
-
“帐户”? 哪个帐户?
sudo将活动用户更改为root,然后su从root下降到backup。sudo su - backup不是一个统一的步骤——它运行的是两个完全独立的程序。 -
...如果您想要只有一步,那么您可以运行
sudo -u backup -i。 -
无论如何,当
sudo要求输入密码时,它要求的是您当前的 密码,而不是目标帐户的密码,除非有相反的配置。显然,您希望为这个用例配置NOPASSWD:,但这是需要在/etc/sudoers中的东西,而不是与脚本相关的细节。