Python Fabric Sudo su - user

8

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

$ 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.

有没有一种方法可以通过命令行来让 fabric 做我所做的事情?

编辑 sudoers 文件不是一个选项。

远程服务器是 Linux RH 7.6。

谢谢。

4个回答

7

是的,你可以使用sudo加上user=参数,就像在shell中一样,使用sudo切换到另一个用户:

from  fabric import Connection

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

sudo 命令接受额外的 usergroup 参数,这些参数会传递给 sudo 命令,允许你以某个用户和/或组而不是 root 用户运行。在大多数系统中,sudo 程序可以使用字符串类型的用户名/组名或整数类型的用户 ID/组 ID(uid/gid);同样,usergroup 也可以是字符串或整数类型。

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

如果你的帐户 myuser 需要密码才能运行 sudo,那么上述解决方案仅在无需输入密码即可运行 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密码,但在Config设置中提供了一个user。并且c.sudo被改回到简单的c.sudo('whoami')。Fabric应该将其解释为sudo su - sudo_user

评论不适合进行长时间的讨论;此对话已被移至聊天室。请将任何相关信息[编辑]到答案中。 - Cody Gray
@CodyGray 谢谢,我不知道有聊天功能。 - Nikolas Stevenson-Molnar
好的,@CodyGray。对此表示抱歉。最后一条评论是这样的。做如下操作似乎已经起作用了,但看起来非常有限。c.run('echo "whoami" | sudo su - dev_user') - jibhas

2
以下内容是有效的:

最初的回答:

c.run("echo 'whoami' | sudo su - dev_user")
c.run("echo 'cd /some/directory && ./somescript.sh' | sudo su - dev_user")

0
你可以尝试这样做:
conn.run("sudo su root -c 'cd /some/directory && ls -la && ./somescript.sh'")

-2

使用 Python 3xFabric 2.4.0,您可以像这样使用它

使用 pip 安装 Fabric 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来运行它。

我尝试了你的建议,但执行后它就卡在那里等待我输入更多的命令。我的目标是在c.run('sudo su - dev_user')之后执行更多的c.run调用,例如c.run('whoami'),并且它会显示dev_user。也就是说,我想在sudo到dev_user后以dev_user身份运行c.run函数。这可能吗? - jibhas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接