Search code examples
pythonlinuxbashbackupfabric

Python - Using Fabric with Sudo


I'm pretty new to python and fabric and I am trying to do a simple code where I can get the output on two hosts that uses sudo, although I keep getting an error.... Can anyone help me out with what I might be missing ?

My code:

from fabric.api import *
from getpass import getpass
from fabric.decorators import runs_once
env.hosts = ['host1','host2'] 
env.port = '22'
env.user = 'username' 
env.password="password"


def sudo_dsmc(cmd):
    sudo("-l")    

When I run: fab sudo_dsmc:"-1" :

MacBookPRO:PYTHON username$ fab sudo_dsmc:"-l"
[host1] Executing task 'sudo_dsmc'
[host1] sudo: -l
[host1] out: sudo password:
[host1] out: Sorry, user username is not allowed to execute '/bin/bash -l -c -  l' as root on host1.
[host1] out: 

Fatal error: sudo() received nonzero return code 1 while executing!

Requested: -l
Executed: sudo -S -p 'sudo password:'  /bin/bash -l -c "-l"

Aborting.
Disconnecting from host1... done.

Although I can run the apt-get update with my below function fine without any errors:

def sudo_command(cmd):
    sudo("apt-get update")    
# run like: fab sudo_command:"apt-get-update"

Solution

  • It looks like your sudoers file is preventing you from running that command as sudo. Check your /etc/sudoers file and read the sudo documentation.

    Also "-l" isn't a valid command. sudo takes -l as an optional flag (which lists commands allowed by the user). But Fabric's sudo appears to be taking unknown strings and routing them through /bin/bash instead of using them directly as sudo command parameters.