Aquí está mi fuente:
#!/bin/bash
echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";
Despeja cachés y esas cosas, y se hace eco de que necesita ser ejecutado como root en el terminal. Básicamente, solo quiero que el script deje de ejecutarse si detecta que no se está ejecutando como root.
Ejemplo:
"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."
Si se ejecuta con privilegios elevados, simplemente se ejecuta normalmente. ¿Algunas ideas? ¡Gracias!
shell-script
root
M. Knepper
fuente
fuente
root
anteponiendo el prefijo todos los comandos que se deben ejecutar comoroot
consudo
.Respuestas:
El usuario raíz tiene UID 0 (independientemente del nombre de la cuenta "raíz"). Si el UID efectivo devuelto por
id -u
no es cero, el usuario no ejecuta la secuencia de comandos con privilegios de root. Utilíceloid -ru
para probar el ID real (el UID del usuario que invoca el script).No utilice
$EUID
en el guión, ya que puede ser modificado por un usuario sin privilegios:Si un usuario hiciera esto, obviamente no conduciría a una escalada de privilegios, pero podría llevar a que los comandos en el script no puedan hacer lo que se supone que deben hacer y que los archivos se creen con el propietario incorrecto, etc.
fuente
/bin/id -u
da/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
al principio de su$PATH
conseguir el acceso a los servicios públicos POSIX en Solaris.-u
opción deid
no es universal y, por tanto, esta solución es universal sólo con la advertencia de que una versión de POSIXid
debe ocurrir por primera vez en su PATH.$PATH
en la parte superior de la secuencia de comandos de manera que/usr/xpg4/bin
es antes/bin
. Si usted insiste en el uso no POSIXid
, entonces, evidentemente, tendrá que llegar a una solución más portátil.PATH=$( getconf PATH )
o establecer alguna otra ruta predeterminada explícita, o utilizar una ruta explícita para llamarid
.Creo que lo que quiere es más bien para comprobar que dispone de privilegios de superusuario, es decir, que su identificador de usuario efectivo es 0.
zsh
ybash
haga que esté disponible en la$EUID
variable, para que pueda hacer:Con cualquier POSIX como conchas, se puede utilizar el
id
comando estándar:Tenga en cuenta que todos
id -un
owhoami
o la$USERNAME
variable enzsh
le dará el primer nombre de usuario para el fluido. En sistemas que tienen otros usuarios con el ID 0, que no puede haberroot
incluso si el proceso es un descendiente de uno que ha sido autenticado comoroot
.$USER
que por lo general le dará al usuario que autentica, pero confiando en que es bastante frágil. No se establece por la cáscara, pero por lo general se establece mediante el comando de autenticación (comologin
,su
(en sistemas GNU / Linux, no necesariamente otros),sudo
,sshd
(el de OpenSSH al menos) ...). No siempre, aunque (cambiar el UID no establecer automagicamente esa variable, que tiene que ser hecho de manera explícita por la aplicación cambiar el UID) y también podría haber sido modificado por algún otro proceso en la ascendencia de la cáscara.$LOGNAME
, con la misma advertencia es más confiable como lo especifica POSIX (originalmente de FIPS 151-2)fuente
Puede usar
$USER
owhoami
para verificar el usuario actual.fuente
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
con o sin-n
opción es una alternativa al uso de whoami. Sin -n y comparando a cero es una mejor adaptación a la prueba el núcleo está haciendo realidad. Todos los cuidados del núcleo de que es el ID, no el nombre del archivo de contraseñas.$(id -u)
es mejor. En algunos casos (maliciosos),$USER
podría estar equivocado.Lo que realmente quiere es determinar es si usted tiene acceso a hacer estas operaciones. Se considera una mala práctica para comprobar si está o no está arraigado en lugar de eso.
Si el sistema se ha configurado para permitir que un usuario no root para modificar la página de intercambio y caída de caché, ¿por qué no llegar a ese usuario ejecutar la secuencia de comandos?
En su lugar, sólo tiene que probar la operación y salir con un mensaje de ayuda si se produce un error:
fuente
exit
después de que algo falle, en caso de que el usuario quiera hacer todo lo que pueda con sus privilegios actuales. (Pero para un sistema típico donde todo esto requiere root, salir sería más útil / menos ruidoso.)