¿Cómo verificar si cygwin mintty / bash se ejecuta como administrador?

15

Declaración del problema: ¿Cuál es la forma más elegante y robusta de probar si la mintty bashsesión de Cygwin es "Ejecutar como administrador"?

¿Por qué específicamente? Normalmente tengo varios minttyterminales abiertos cuando uso Windows ( minttyno tiene pestañas). Lo más incómodo es cuando necesito encontrar una ventana de terminal que comencé haciendo clic derecho en "Ejecutar como administrador" cuando, por ejemplo, quiero ejecutar pingu otro procedimiento de una sola vez. Me gustaría indicar visualmente la "ejecución como administrador" de la sesión de terminal visualmente (cambiando la bashvariable de solicitud de shell PS1en mi archivo de inicio ~/.bashrc).

Algunas soluciones potenciales rápidas:

  1. Puedo comparar el valor de algunas variables ambientales. Por un vistazo rápido de envsalida, hay muchas diferencias. Sin embargo, es difícil saber cuál es el más confiable en términos de portabilidad a otra máquina con Windows (tal vez ejecutando una versión diferente de Windows).
  2. id, id -Gnmuestra más específicamente diferentes grupos si se ejecuta como administrador. En mi máquina con Windows 7 tengo Administratorsy rootgrupos agregados a la lista. Nuevamente, no estoy seguro de si esto es portátil.
  3. Podría intentar escribir un archivo en una ubicación que podría fallar como usuario normal. Pero no quiero escribir ningún archivo en lugares extraños; en algunos escenarios imaginarios, esto podría ser potencialmente destructivo (por ejemplo, medios de almacenamiento defectuosos) y esto parece completamente poco elegante para mi gusto.
  4. Ejecutando algún programa de Windows que indicará por estado de retorno o salida si el comando se ejecuta "como administrador". Lo mejor sería alguno con un propósito análogo al del id(1)comando UNIX (pero existente de forma nativa en Windows o Cygwin, pero sin una traducción demasiado exagerada de los conceptos del sistema de Windows a los conceptos emulados POSIX).

¿Alguna sugerencia mejor o más elegante? ¿Quizás cygwin proporciona una utilidad de comando dedicada para este propósito?

Actualización: 97% duplicado de /programming/4051883/batch-script-how-to-check-for-admin-rights/ - la diferencia está aquí usando en bashlugar de Windows (extraño y arcaico) cmd.exe. Verifique las respuestas y comentarios allí.

FooF
fuente
use "ejecutar como administrador" a menos que haga esto, entonces el proceso no se eleva a los permisos de administrador, incluso si una cuenta de administrador inicia el proceso. Simplemente cree un acceso directo para que esto siempre se haga.
Ramhound
1
Recomiendo probar ConEmu . Tiene pestañas, puede ejecutar pestañas como administrador indicado por diferentes íconos en la barra de pestañas y lo más importante usa la consola detrás de escena para que las aplicaciones nativas de Windows funcionen correctamente a diferencia de mintty.
Jan Hudec
2
@Ramhound Tiene razón en que mi problema original (distinguir la ventana del terminal del administrador) que ya había reducido a esta pregunta podría resolverse haciendo un atajo para minttyque 1. se ejecute como administrador, 2. use un archivo de configuración diferente con un color diferente 3. y utiliza un icono alternativo. Si describe al público en general cómo crear esto, le daré un voto positivo (a menos que diga en su respuesta que no se puede hacer dentro de un script :-).
FooF
1
@FooF: el hecho de que ejecute un proceso con un usuario de nivel Administrador no significa que el proceso en sí se haya escalado. Windows de forma predeterminada solo esclavizará un proceso si el usuario aprueba dicha acción, por lo tanto, la función "ejecutar como administrador" en Windows. También puede proporcionar TODOS los permisos a CUALQUIER grupo que desee, incluso el Foogrupo de usuarios si lo desea.
Ramhound
1
@FooF: solo piense sudoque es necesario incluso si está ejecutando como usuario root.
Ramhound

Respuestas:

9

Acabo de escribir esta función por la misma razón. Nunca sé qué shell tiene privilegios de administrador.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Se adaptó de esta respuesta /programming//a/11995662/307968 para Windows cmd shell. Net Session devuelve el estado 0 si es administrador.

Ahora solo necesito cambiar mi indicador, o tal vez el color de la barra de título ...

Darrel Lee
fuente
Buen hallazgo Aunque parece haber casos extremos donde esto también falla, si revisa los comentarios de stackoverflow.
FooF
Sin embargo, acepté esta respuesta porque apunta a una discusión muy exhaustiva (la pregunta de stackoverflow y la respuesta aceptada actualmente tienen puntajes de 147 y 255, respectivamente).
FooF
¡Gracias! Lo uso para colorear selectivamente el nombre de usuario en mi solicitud. Si la venta es elevada, la coloreo de rojo, de lo contrario, verde. Útil para realizar un seguimiento de qué shells están elevados si tiene muchas ventanas de terminal abiertas.
Hola
16

La respuesta definitiva a esta pregunta proviene de la lista de correo de Cygwin . Se está ejecutando un proceso con derechos de administrador si el usuario que lo inició es parte del grupo 544 (Administradores). También del comentario a continuación de Cromax, parece que el grupo 114 (Cuenta local y miembro del grupo Administrador) también a veces está presente. La prueba para estos dos grupos es

id -G | grep -qE '\<(114|544)\>'

Por ejemplo,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

En el pasado, también era necesario verificar el grupo 0, el grupo raíz en / etc / group. Pero / etc / group ya no está instalado en Cygwin y, por lo general, debe eliminarse si está presente, por lo que ya no se recomienda verificar el grupo 0 también. Solo grupo 544.

Andrew Schulman
fuente
1
Gracias por preguntar en la lista de correo de Cygwin. :-) Es bueno saber que los ID de grupo (emulados / traducidos) permanecen constantes entre sistemas.
FooF
Claro ... quería conocerme a mí mismo, y la gente allí lo sabe .
Andrew Schulman
1
Lamentablemente, esto no funciona en Mingw / Msys. La respuesta de Steven sí, aunque solo en Windows 7.
gorrión
1
Acabo de probar eso (en W7) y no funcionó, pero me di cuenta de que si el usuario de Windows uno está registrado como administrador, entonces cuando Cygwin se ejecuta como administrador, hay otro grupo que aparece en idla salida, es decir, 114 (cuenta local y miembro del grupo Administrador). Por lo tanto, la id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
expresión regular
Gracias. No lo he visto yo mismo, pero veo que el grupo 114 parece ser un grupo de Administradores, por lo que parece razonable verificarlo también. Revisé la respuesta.
Andrew Schulman
7

Yo uso el valor de retorno del programa de Windows at. También recreé la funcionalidad del carácter especial PROMPTING \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Ejemplos

Steven
fuente
Suponiendo que no hay un equivalente del idcomando UNIX en Windows, acepto esto como una respuesta correcta. Al menos ejecutar un atcomando sin ningún argumento no parece tener ningún efecto secundario. ¡Voy a usar este método en mi .bashrcarchivo de ahora en adelante! Gracias por el hack.
FooF
1
no parece funcionar en windows8.1
zzapper
1
@zzapper Por favor sea más específico. ¿Qué pasa / no pasa? ¿Error de mensajes?
Steven
44
id devuelve los mismos valores, en desuso utiliza schtasks.exe en su lugar, pero esto funciona ya sea administrador o no
zzapper
2

id -G | grep -qE '\<(544|0)\>'no parecía funcionar para mí, ya que mi salida no tenía ni <> ni 544 incluso cuando estaba elevada. Sin embargo, dado que se requiere elevación para escribir %WINDIR%\system32, lo usé para probar la elevación con una función de shell:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

Cuando se aplica a la excelente idea de Steven de un personaje de hash rojo:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
Josh
fuente
1

Haga algo que solo el administrador pueda hacer y pruebe el éxito o el fracaso:

if touch c:/Users/.x ; then  echo 'ok'  ; fi

o

touch c:/Users/.x && echo ok

o

touch c:/Users/.x && \rm c:/Users/.x && echo ok

o

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
zzapper
fuente
1

En Msys en Windows intente esto (encontré que la respuesta aceptada no funcionaba en Msys)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

Esto se basa en el código de retorno de atser cero solo cuando se ejecuta como administrador.

gorrión
fuente
1
Este parece el mismo método que @Steven dio en una respuesta anterior (que no parece funcionar en Windows 8.1 según un comentario, a menos que MSYS "at" esté de alguna manera). Si bien la pregunta era sobre Cygwin, es interesante compararla con MSYS similares. Gracias por el aporte.
FooF
Muy similar si. Sin embargo, terminé con esta pregunta tratando de usarla para registrar un script (Win7, Msys) en lugar de configurar el estilo de solicitud de bash, por lo que pensé que esto podría ser útil para que alguien más haga lo mismo
sparrowt
Estoy de acuerdo en la utilidad.
FooF