Python Fabric Sudo su-用户

时间:2019-02-11 20:15:13

标签: 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 ~]$

没有权限问题。

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。

谢谢。

3 个答案:

答案 0 :(得分:1)

以下作品:

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

答案 1 :(得分:0)

有了Titanium.App.Propertiespaython 3x,您可以像这样使用它

使用pip fabric 2.4.0

安装结构
pip3 install fabric>=2.4.0

将此代码放在一个名为fabfile.py的文件中,并通过从命令行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') 执行此命令来运行它。

答案 2 :(得分:0)

是的,您可以将sudouser=参数一起使用,以使用sudo切换到另一个用户,就像在shell中一样:

from  fabric import Connection

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

sudo 接受其他usergroup参数,这些参数传递给sudo并允许您以root用户以外的其他用户和/或组身份运行。在大多数系统上,sudo程序可以使用字符串username / group或整数userid / groupid(uid / gid); usergroup可以是字符串或整数。

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设置中为Config。并且c.sudo改回简单的c.sudo('whoami')。 Fabric应该将此 解释为sudo su - sudo_user