Python Fabric Sudo su - 用户

jib*_*has 6 python sudo fabric

我目前从命令行执行以下操作:

$ ssh myuser@remote-server 
password:
[myuser@remote-server ~]$ sudo su - dev_user
[dev_user@remote-server ~]$ whoami
dev_user
[dev_user@remote-server ~]$
Run Code Online (Sandbox Code Playgroud)

没有权限问题。

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')
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

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.
Run Code Online (Sandbox Code Playgroud)

有没有办法让面料做我从命令行做的事情?

编辑 sudoers 文件不是一种选择。

远程服务器是 Linux RH 7.6。

谢谢你。

Nik*_*nar 7

是的,您可以使用sudo参数user=,使用 sudo 切换到另一个用户,就像您在 shell 中所做的那样:

from  fabric import Connection

c = Connection('host')
c.sudo('/bin/bash -l -c whoami', user='dev_user')
Run Code Online (Sandbox Code Playgroud)

sudo接受附加的usergroup参数,这些参数被传递给 sudo 并允许您以 root 以外的某个用户和/或组的身份运行。在大多数系统上,sudo 程序可以采用字符串用户名/组或整数用户 ID/组 ID (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')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下没有提供 sudo 密码,但user在设置中提供了密码Config。并且c.sudo又变回了简单的c.sudo('whoami'). 这应该由 Fabric解释sudo su - sudo_user


Pes*_*rge -2

paython 3xfabric 2.4.0可以像这样使用它

使用 pip 安装 Fabricpip3 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')
Run Code Online (Sandbox Code Playgroud)

将此代码放入名为 fabfile.py 的文件中,并通过从命令行执行此命令来运行它fab executeTask