Как запустить команду bash как системного пользователя, не предоставляя этому пользователю право запускать команды как любой пользователь

Я написал скрипт 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 

Это странно, потому что там живет … Я не знаю, возможно ли то, что я пытаюсь сделать. Спасибо за любые предложения!

One Solution collect form web for “Как запустить команду bash как системного пользователя, не предоставляя этому пользователю право запускать команды как любой пользователь”

Что касается sudo :

 shinken ALL=(backup) NOPASSWD: ALL 

… работает только при переключении непосредственно из shinken в backup . Вы этого не делаете . sudo su - backup сообщает sudo о переключении на root и запускает команду su - backup как 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 $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] 
Python - лучший язык программирования в мире.