Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

In order to avoid the user having to explicitly prefix a script with sudo or su --command, I wrote the following:

import sys
import os

if os.getuid():
    root = "/usr/bin/sudo"
    if not os.path.exists("/usr/bin/sudo"):
        root = "/bin/su --command"
    command = "{} {}".format(root, sys.argv[0])
    command = command.split()
    retcode = subprocess.call(command)
    if retcode:
        print("something wrong happened")
else:
    action_that_needs_admin_rights()

It feels like a hack to me, so am looking forward to better approaches.

share|improve this question
add comment

1 Answer

up vote 4 down vote accepted

The last time I checked (which admittedly has been a while) all major Linux distributions except Ubuntu have a default setup in which sudo is installed, but not configured to be able to start arbitrary applications. So on those your script will fail.

Apart from that I think it's a bad idea to use split like this. This will break if the python file (or the path to it if it was invoked with a path) contains spaces. I'd do it like this instead:

if sudo:
    root = ["/usr/bin/sudo"]
else:
    root = ["/bin/su", "--command"]
command = root + [ sys.argv[0] ]

A further problem is that you're requiring the script to be marked as executable. I think it'd be a better idea to use sys.executable to get the python interpreter and invoke that.

share|improve this answer
    
What's wrong with requiring the script executable? –  Tshepang May 3 '11 at 2:21
    
@Tshepang: It's not wrong as such, it just means that it won't work in cases in which it otherwise would (i.e. in the case where the user invokes the script with python script.py rather than making it executable). –  sepp2k May 3 '11 at 2:32
    
Even in that case it should work, because sys.argv[0] is always the script filename. –  Tshepang May 3 '11 at 8:30
1  
@Tshepang: Yes, that's the point. sudo filename.py does not work, if the file is not executable. You need to do sudo python filename.py. –  sepp2k May 3 '11 at 8:40
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.