How to tell whether a bash script has root privileges [duplicate]
This question already has an answer here:
How can a script check if it's being run as root?
10 answers
I have a bash script that will only work with root privileges, so I want to test whether the user has them. Other posts (see below) ask and answer how to know whether the user is actually running as root
, but not whether the script has root privileges. These posts say to test whether $EUID
is 0.
To try this idea in the context of sudo
, I wrote a bash script /tmp/a.sh
:
#!/bin/bash
echo $EUID
The following two commands were run as a non-root user with sudo
privileges on Ubuntu 16.04. If the $EUID
suggestion worked in the context of sudo
, the second command would have printed 0 instead of a blank line.
$ /tmp/a.sh
1000
$ sudo /tmp/a.sh
$
FYI, an example of the related posts I am referencing is:
How can a script check if it's being run as root?
bash
marked as duplicate by Sergiy Kolodyazhnyy
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 31 at 0:56
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
How can a script check if it's being run as root?
10 answers
I have a bash script that will only work with root privileges, so I want to test whether the user has them. Other posts (see below) ask and answer how to know whether the user is actually running as root
, but not whether the script has root privileges. These posts say to test whether $EUID
is 0.
To try this idea in the context of sudo
, I wrote a bash script /tmp/a.sh
:
#!/bin/bash
echo $EUID
The following two commands were run as a non-root user with sudo
privileges on Ubuntu 16.04. If the $EUID
suggestion worked in the context of sudo
, the second command would have printed 0 instead of a blank line.
$ /tmp/a.sh
1000
$ sudo /tmp/a.sh
$
FYI, an example of the related posts I am referencing is:
How can a script check if it's being run as root?
bash
marked as duplicate by Sergiy Kolodyazhnyy
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 31 at 0:56
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
1
echo $UID
should work. Or according to David F in the comments of your linked answer you should useecho $(id -u)
– Terrance
Jan 30 at 18:32
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it
– Sergiy Kolodyazhnyy
Jan 31 at 0:58
add a comment |
This question already has an answer here:
How can a script check if it's being run as root?
10 answers
I have a bash script that will only work with root privileges, so I want to test whether the user has them. Other posts (see below) ask and answer how to know whether the user is actually running as root
, but not whether the script has root privileges. These posts say to test whether $EUID
is 0.
To try this idea in the context of sudo
, I wrote a bash script /tmp/a.sh
:
#!/bin/bash
echo $EUID
The following two commands were run as a non-root user with sudo
privileges on Ubuntu 16.04. If the $EUID
suggestion worked in the context of sudo
, the second command would have printed 0 instead of a blank line.
$ /tmp/a.sh
1000
$ sudo /tmp/a.sh
$
FYI, an example of the related posts I am referencing is:
How can a script check if it's being run as root?
bash
This question already has an answer here:
How can a script check if it's being run as root?
10 answers
I have a bash script that will only work with root privileges, so I want to test whether the user has them. Other posts (see below) ask and answer how to know whether the user is actually running as root
, but not whether the script has root privileges. These posts say to test whether $EUID
is 0.
To try this idea in the context of sudo
, I wrote a bash script /tmp/a.sh
:
#!/bin/bash
echo $EUID
The following two commands were run as a non-root user with sudo
privileges on Ubuntu 16.04. If the $EUID
suggestion worked in the context of sudo
, the second command would have printed 0 instead of a blank line.
$ /tmp/a.sh
1000
$ sudo /tmp/a.sh
$
FYI, an example of the related posts I am referencing is:
How can a script check if it's being run as root?
This question already has an answer here:
How can a script check if it's being run as root?
10 answers
bash
bash
asked Jan 30 at 18:23
Colin McRaeColin McRae
212
212
marked as duplicate by Sergiy Kolodyazhnyy
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 31 at 0:56
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Sergiy Kolodyazhnyy
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Jan 31 at 0:56
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
1
echo $UID
should work. Or according to David F in the comments of your linked answer you should useecho $(id -u)
– Terrance
Jan 30 at 18:32
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it
– Sergiy Kolodyazhnyy
Jan 31 at 0:58
add a comment |
1
echo $UID
should work. Or according to David F in the comments of your linked answer you should useecho $(id -u)
– Terrance
Jan 30 at 18:32
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it
– Sergiy Kolodyazhnyy
Jan 31 at 0:58
1
1
echo $UID
should work. Or according to David F in the comments of your linked answer you should use echo $(id -u)
– Terrance
Jan 30 at 18:32
echo $UID
should work. Or according to David F in the comments of your linked answer you should use echo $(id -u)
– Terrance
Jan 30 at 18:32
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why
$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it– Sergiy Kolodyazhnyy
Jan 31 at 0:58
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why
$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it– Sergiy Kolodyazhnyy
Jan 31 at 0:58
add a comment |
2 Answers
2
active
oldest
votes
The script /tmp/a.sh
only works with #!/bin/bash
on the first line. When actually running the example I gave, the !
was accidentally omitted and the only user reported was the non-root user as shown in the question.
2
Probably because without the shebang, the script was interpreted by your current shell (likelybash
) when called withoutsudo
, but was interpreted bydash
(which doesn't setEUID
) when called withsudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script withls -l /proc/$$/exe
reports the script is run via/bin/dash
, however on my other debian-based system root hasbash
as login shell and that's what is reported there. Sosudo
checks either$SHELL
environment variable or/etc/passwd
or other login system such as LDAP
– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting thatsudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the-i
(or--login
) option - I'd never really thought about that before
– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to/bin/sh
. I've repeated the experiment couple times again:/proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.
– Sergiy Kolodyazhnyy
Feb 1 at 0:34
add a comment |
I use the following in some of my scripts:
#!/bin/bash
if [ "$(id -un)" != "root" ]; then
echo "Need root - sudoing..."
exec sudo "$0" "$@"
fi
# Now we are root
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The script /tmp/a.sh
only works with #!/bin/bash
on the first line. When actually running the example I gave, the !
was accidentally omitted and the only user reported was the non-root user as shown in the question.
2
Probably because without the shebang, the script was interpreted by your current shell (likelybash
) when called withoutsudo
, but was interpreted bydash
(which doesn't setEUID
) when called withsudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script withls -l /proc/$$/exe
reports the script is run via/bin/dash
, however on my other debian-based system root hasbash
as login shell and that's what is reported there. Sosudo
checks either$SHELL
environment variable or/etc/passwd
or other login system such as LDAP
– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting thatsudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the-i
(or--login
) option - I'd never really thought about that before
– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to/bin/sh
. I've repeated the experiment couple times again:/proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.
– Sergiy Kolodyazhnyy
Feb 1 at 0:34
add a comment |
The script /tmp/a.sh
only works with #!/bin/bash
on the first line. When actually running the example I gave, the !
was accidentally omitted and the only user reported was the non-root user as shown in the question.
2
Probably because without the shebang, the script was interpreted by your current shell (likelybash
) when called withoutsudo
, but was interpreted bydash
(which doesn't setEUID
) when called withsudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script withls -l /proc/$$/exe
reports the script is run via/bin/dash
, however on my other debian-based system root hasbash
as login shell and that's what is reported there. Sosudo
checks either$SHELL
environment variable or/etc/passwd
or other login system such as LDAP
– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting thatsudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the-i
(or--login
) option - I'd never really thought about that before
– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to/bin/sh
. I've repeated the experiment couple times again:/proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.
– Sergiy Kolodyazhnyy
Feb 1 at 0:34
add a comment |
The script /tmp/a.sh
only works with #!/bin/bash
on the first line. When actually running the example I gave, the !
was accidentally omitted and the only user reported was the non-root user as shown in the question.
The script /tmp/a.sh
only works with #!/bin/bash
on the first line. When actually running the example I gave, the !
was accidentally omitted and the only user reported was the non-root user as shown in the question.
answered Jan 30 at 18:41
Colin McRaeColin McRae
212
212
2
Probably because without the shebang, the script was interpreted by your current shell (likelybash
) when called withoutsudo
, but was interpreted bydash
(which doesn't setEUID
) when called withsudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script withls -l /proc/$$/exe
reports the script is run via/bin/dash
, however on my other debian-based system root hasbash
as login shell and that's what is reported there. Sosudo
checks either$SHELL
environment variable or/etc/passwd
or other login system such as LDAP
– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting thatsudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the-i
(or--login
) option - I'd never really thought about that before
– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to/bin/sh
. I've repeated the experiment couple times again:/proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.
– Sergiy Kolodyazhnyy
Feb 1 at 0:34
add a comment |
2
Probably because without the shebang, the script was interpreted by your current shell (likelybash
) when called withoutsudo
, but was interpreted bydash
(which doesn't setEUID
) when called withsudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script withls -l /proc/$$/exe
reports the script is run via/bin/dash
, however on my other debian-based system root hasbash
as login shell and that's what is reported there. Sosudo
checks either$SHELL
environment variable or/etc/passwd
or other login system such as LDAP
– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting thatsudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the-i
(or--login
) option - I'd never really thought about that before
– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to/bin/sh
. I've repeated the experiment couple times again:/proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.
– Sergiy Kolodyazhnyy
Feb 1 at 0:34
2
2
Probably because without the shebang, the script was interpreted by your current shell (likely
bash
) when called without sudo
, but was interpreted by dash
(which doesn't set EUID
) when called with sudo
– steeldriver
Jan 30 at 18:49
Probably because without the shebang, the script was interpreted by your current shell (likely
bash
) when called without sudo
, but was interpreted by dash
(which doesn't set EUID
) when called with sudo
– steeldriver
Jan 30 at 18:49
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script with
ls -l /proc/$$/exe
reports the script is run via /bin/dash
, however on my other debian-based system root has bash
as login shell and that's what is reported there. So sudo
checks either $SHELL
environment variable or /etc/passwd
or other login system such as LDAP– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@steeldriver Confirmed. On my Ubuntu 18.04 virtual machine the script with
ls -l /proc/$$/exe
reports the script is run via /bin/dash
, however on my other debian-based system root has bash
as login shell and that's what is reported there. So sudo
checks either $SHELL
environment variable or /etc/passwd
or other login system such as LDAP– Sergiy Kolodyazhnyy
Jan 31 at 1:14
@SergiyKolodyazhnyy it's kind of interesting that
sudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the -i
(or --login
) option - I'd never really thought about that before– steeldriver
Jan 31 at 14:22
@SergiyKolodyazhnyy it's kind of interesting that
sudo
appears to use the login shell specified in the target user's passwd entry even when not explicitly invoked with the -i
(or --login
) option - I'd never really thought about that before– steeldriver
Jan 31 at 14:22
@steeldriver Correction: it defaults to
/bin/sh
. I've repeated the experiment couple times again: /proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.– Sergiy Kolodyazhnyy
Feb 1 at 0:34
@steeldriver Correction: it defaults to
/bin/sh
. I've repeated the experiment couple times again: /proc/19051/exe -> /bin/dash
is reported on both systems, so previous conclusion is mistaken.– Sergiy Kolodyazhnyy
Feb 1 at 0:34
add a comment |
I use the following in some of my scripts:
#!/bin/bash
if [ "$(id -un)" != "root" ]; then
echo "Need root - sudoing..."
exec sudo "$0" "$@"
fi
# Now we are root
add a comment |
I use the following in some of my scripts:
#!/bin/bash
if [ "$(id -un)" != "root" ]; then
echo "Need root - sudoing..."
exec sudo "$0" "$@"
fi
# Now we are root
add a comment |
I use the following in some of my scripts:
#!/bin/bash
if [ "$(id -un)" != "root" ]; then
echo "Need root - sudoing..."
exec sudo "$0" "$@"
fi
# Now we are root
I use the following in some of my scripts:
#!/bin/bash
if [ "$(id -un)" != "root" ]; then
echo "Need root - sudoing..."
exec sudo "$0" "$@"
fi
# Now we are root
answered Jan 30 at 22:26
RalfRalf
20116
20116
add a comment |
add a comment |
1
echo $UID
should work. Or according to David F in the comments of your linked answer you should useecho $(id -u)
– Terrance
Jan 30 at 18:32
Thanks Terrance, that works too. I posted an answer after noticing a fat-finger that causes $EUID and $UID to resolve properly only for non-root users (still a bit of a mystery).
– Colin McRae
Jan 30 at 18:43
There are multiple other solutions to detect script running as root on the question to which you referred, if that's really what you're asking. If you are asking specifically why
$EUID
doesn't work, please edit the question to clarify the title and the body of the question, and we can re-open it– Sergiy Kolodyazhnyy
Jan 31 at 0:58