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.
1 Answer 1
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.
-
\$\begingroup\$ What's wrong with requiring the script executable? \$\endgroup\$tshepang– tshepang2011年05月03日 02:21:19 +00:00Commented May 3, 2011 at 2:21
-
\$\begingroup\$ @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). \$\endgroup\$sepp2k– sepp2k2011年05月03日 02:32:43 +00:00Commented May 3, 2011 at 2:32 -
\$\begingroup\$ Even in that case it should work, because
sys.argv[0]
is always the script filename. \$\endgroup\$tshepang– tshepang2011年05月03日 08:30:55 +00:00Commented May 3, 2011 at 8:30 -
3\$\begingroup\$ @Tshepang: Yes, that's the point.
sudo filename.py
does not work, if the file is not executable. You need to dosudo python filename.py
. \$\endgroup\$sepp2k– sepp2k2011年05月03日 08:40:00 +00:00Commented May 3, 2011 at 8:40