Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I'm currently working on a bash script that installs and sets up various programs on a stock Linux system (currently, Ubuntu). Because it installs programs and copies a number of files to various folders that require elevated privileges, I've already done the standard "I need elevated privileges"-and-exit.

However, I would like, if possible, to be able to prompt the user for their sudo password and elevate the script's privileges automatically if the user doesn't run the script command with sudo (such as launching it from the GUI file manager), without the user having to restart the script.

As this is designed to run on stock Linux installs, any option that modifies the system won't work for my purposes. All options need to be contained to the script itself.

Is this possible within Bash? If so, what's the best (secure, yet concise) way to do this?

share|improve this question
    
    
@MichaelMrozek - Ah, the joys of having so many niche sites while trying to minimize fragmentation. And you know, the link you gave never once came up for me while searching Google. –  Shauna Jan 10 '12 at 20:19
add comment

3 Answers 3

up vote 14 down vote accepted

I run sudo directly from the script:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
share|improve this answer
add comment

I suggest:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
share|improve this answer
    
What does if [[ -t 1 ]]; check for? –  Shauna Jan 10 '12 at 20:05
    
@Shauna: if stdout (i.e. 1) is a terminal –  enzotib Jan 10 '12 at 20:18
    
Ah, ok. I figured it had something to do with terminal vs GUI, but wasn't sure what the if statement itself was checking. –  Shauna Jan 10 '12 at 20:24
add comment

Add this as the first line of the script:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Change sudo to gksu or gksudo if you prefer a graphical prompt.

share|improve this answer
    
+1 for having an alternative, albeit after Michael. :) –  Shauna Jan 10 '12 at 19:44
2  
Note that "$*" is going to merge all the arguments into one (/path/to/script one two three is going to result in $1 being one two three), and $* without quotes will mess up spaces in arguments. "$@" works right –  Michael Mrozek Jan 10 '12 at 19:55
    
@MichaelMrozek Ah, right. That's the one I was looking for, Fixed –  Kevin Jan 10 '12 at 19:57
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.