Python Fabric Sudo su - пользователь - PullRequest
0 голосов
/ 11 февраля 2019

В настоящее время я делаю из командной строки следующее:

$ ssh myuser@remote-server 
password:
[myuser@remote-server ~]$ sudo su - dev_user
[dev_user@remote-server ~]$ whoami
dev_user
[dev_user@remote-server ~]$

Нет прав доступа.

У myuser достаточно прав для выполнения описанных выше действий, но у него нет прав для sudo su -c whoami dev_user

Я попробовал следующий код

from fabric import Connection, task

@task
def abcd(ctx):
    sudo_pass = getpass.getpass("What's your sudo password?")
    config = Config(overrides={'sudo': {'password': sudo_pass}})
    with Connection('dev-server', user='myuser', connect_kwargs={"password": sudo_pass}, config=config) as c:
        c.sudo('/bin/bash -l -c whoami', user='dev_user')

Я получаю следующий вывод:

fab abcd
What's your sudo password?
[sudo] password: Sorry, user myuser is not allowed to execute '/bin/bash -l -c whoami' as dev_user on dev-server.

Есть ли способ заставить ткань делать то, что я делал из командной строки?

Редактирование файла sudoers не вариант.

Удаленным сервером является Linux RH 7.6.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Да, вы можете использовать sudo с аргументом user=, чтобы использовать sudo для переключения на другого пользователя, как вы это делаете в оболочке:

from  fabric import Connection

c = Connection('host')
c.sudo('/bin/bash -l -c whoami', user='dev_user')

sudo принимает дополнительные user и group аргументы, которые передаются в sudo и позволяют вам работать от имени другого пользователя и / или группы, отличных от root.В большинстве систем программа sudo может принимать строковое имя пользователя / группу или целое число userid / groupid (uid / gid);user и group могут также быть строками или целыми числами.

http://docs.fabfile.org/en/1.14/api/core/operations.html?highlight=sudo#fabric.operations.sudo

Приведенное выше решение будет работать только в том случае, если вы можете запустить sudo без ввода пароля.Если для вашей учетной записи myuser требуется пароль для запуска sudo, вы можете запросить этот пароль и передать его в конфигурацию fabric:

import getpass
from fabric import Connection, Config

sudo_pass = getpass.getpass("What's your sudo password?")
config = Config(overrides={'sudo': {'password': sudo_pass}})
c = Connection('host', config=config)

c.sudo('/bin/bash -l -c whoami', user='dev_user')

http://docs.fabfile.org/en/2.3/getting-started.html#the-sudo-helper

Одна заключительная идея:

from  fabric import Connection, Config

config = Config(overrides={'sudo': {'user': 'sudo_user'}})
c = Connection('host', config=config)

c.sudo('whoami')

Обратите внимание, что в этом случае пароль sudo не предоставляется, но user есть, в настройке Configc.sudo изменяется на простой c.sudo('whoami').Это должно быть интерпретировано как sudo su - sudo_user Fabric.

0 голосов
/ 15 февраля 2019

работают следующие работы:

c.run("echo 'whoami' | sudo su - dev_user")
c.run("echo 'cd /some/directory && ./somescript.sh' | sudo su - dev_user")
0 голосов
/ 12 февраля 2019

С paython 3x и fabric 2.4.0 вы можете использовать его следующим образом

установить фабрику, используя pip pip3 install fabric>=2.4.0

from fabric import Connection as connection, task

@task
def executeTask(ctx):
    with connection(host=dev_server, user=myuser) as c:
         c.run('sudo su - dev_user')

Поместите этот код в файл с именем fabfile.py изапустите его, выполнив эту команду из командной строки fab executeTask.

...