
Hice esta función bash para detectar si el usuario que ejecuta realmente inició sesión como usuario root y no usa sudo verificando el directorio de inicio uid + del usuario que ejecuta el comando:
#!/bin/bash
set -x
function check_root(){
home=`sh -c 'cd ~/ && pwd'`
if [ "$home" != "/root" ] || [ "$(id -u)" != "0" ]; then
echo -e "This script can only be executed by the root user, not with sudo elevation"
exit 1
fi
}
check_root
Cuando lo ejecuto como usuario normal (uid 1000), funciona como se esperaba:
++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/home/jake
++ '[' /home/jake '!=' /root ']'
++ echo -e 'This script can only be executed by the root user, not with sudo elevation'
This script can only be executed by the root user, not with sudo elevation
++ exit 1
Cuando lo ejecuto como root también funciona como se esperaba:
++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/root
++ '[' /root '!=' /root ']'
+++ id -u
++ '[' 0 '!=' 0 ']'
Pero cuando lo ejecuto como usuario normal (uid 1000) con sudo elevación me sale esto:
./check_root.sh: 4: ./check_root.sh: Syntax error: "(" unexpected
Información del sistema:
Linux jake 3.11.0-26-generic #45~precise1-Ubuntu SMP martes 15 de julio 04:02:35 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash --versión GNU bash, versión 4.2.25(1)-lanzamiento (x86_64-pc-linux-gnu)
Respuesta1
Mientras tanto, resolví esto, pero aún no publiqué la solución; resultó estar relacionada con la sintaxis:
Soluciones de trabajo:
function check_root {
stuff..
}
y
function check_root () {
stuff..
}
Por ejemplo, eliminar () de la declaración de función o asegurarse de que esté separado por espacios en ambos lados soluciona el problema.
Esto es lo que encontré en la página de manual de bash que me hizo detectar el error:
Shell Function Definitions
A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters. Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
This defines a function named name. The reserved word function is optional. If the function reserved word is supplied, the parentheses are optional
Pero... no tengo idea de qué es exactamente lo que hace que bash se comporte de esta manera en este caso.