Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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
up vote 29 down vote accepted

I run sudo directly from the script:

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

I suggest:


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

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
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 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
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
Is there a way to do this on Debian, where there seems to be no sudo command? – wrongusername Jul 25 '15 at 18:23
@wrongusername install sudo, it's much better than using su. But if you really want, probably exec su -c "$0" "$@" – Kevin Jul 27 '15 at 17:23

Your Answer


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.