0 votos

Comprobación del shell de MacOS script. Una forma mejor de ejecutar la sentencia if y comprobar una condición

Necesito escribir un shell script muy sencillo que compruebe si el sistema está configurado para aplicar la autenticación multifactor.

Para verificar que el sistema está configurado para aplicar la autenticación multifactor, ejecute los siguientes comandos:

/usr/sbin/system_profiler SPConfigurationProfileDataType | /usr/bin/grep enforceSmartCard

Si los resultados no muestran " enforceSmartCard=1 ", esto es un hallazgo.

He creado este sencillo script, pero estoy bastante seguro de que hay una forma más efectiva, elegante y eficiente de conseguir el mismo resultado.

Básicamente, si fueras tú, ¿qué tipo de modificaciones aplicarías al script de abajo para conseguir los mismos resultados?

Muchas gracias de antemano por su ayuda.

#!/bin/zsh

myVAR=`/usr/sbin/system_profiler SPConfigurationProfileDataType | /usr/bin/grep enforceSmartCard`

if [ $myVAR = "enforceSmartCard=1" ]
then
    echo "The system is configured to enforce multi-factor authentication"
else
    echo "The system is not configured to enforce multi-factor authentication"
fi

2 votos

No estoy seguro de lo que quiere decir con más simple, parece ser bastante simple ya?

0 votos

Podría deshacerse de la variable ejecutando los comandos dentro del if, pero la legibilidad se resentiría.

0 votos

Si yo estuviera en tu lugar, probablemente cambiaría el tinglado.

3voto

Mark Puntos 6

Esto podría ser un poco más elegante, no necesariamente más sencillo : Estoy envolviendo las partes de la tubería en sus propias funciones

profile () { /usr/sbin/system_profiler SPConfigurationProfileDataType; }
enforces2fa () { /usr/bin/grep -F -q 'enforceSmartCard=1'; }

if profile | enforces2fa; then
    echo "The system is configured to enforce multi-factor authentication"
else
    echo "The system is not configured to enforce multi-factor authentication"
fi

Algunas notas

  • prefiere $(...) en `...` para la sustitución de comandos: es más fácil de leer.
  • if toma un comando y se ramifica en función del comando estado de salida . En un prompt de bash, introduzca help if para más detalles.
    • [ es un comando incorporado en bash, no sólo la sintaxis.
  • si "enforceSmartCard=1" es el único texto de la línea, añada -x a las opciones de grep.

Además, puedes modificar el PATH en tu script para agilizar las funciones

PATH=$(getconf PATH)      # /usr/bin:/bin:/usr/sbin:/sbin

profile () { system_profiler SPConfigurationProfileDataType; }
enforces2fa () { grep -F -q 'enforceSmartCard=1'; }

Esto sólo tiene efecto mientras dure el script en ejecución, y no afectará a su shell interactivo.

1 votos

getconf PATH puede ser peligroso si otras partes del script dependen de comandos almacenados en /usr/local/bin o similar. En general yo no especificaría rutas para comandos que están en las rutas estándar. Si PATH no las incluye, otras cosas tampoco funcionarán.

1voto

qarma Puntos 71

Me inclinaría por leer el valor de la enforceSmartCard directamente desde el com.apple.security.smartcard.plist ubicado en el archivo /Library/Preferences carpeta.

Esto se puede hacer utilizando el defaults herramienta de línea de comandos, que será significativamente más rápida que el system_profiler y no necesitarás grep su salida:

defaults read /Library/Preferences/com.apple.security.smartcard enforceSmartCard

Estas son las posibles salidas del system_profiler | grep y defaults comandos, junto con su significado:

system_profiler | grep

defaults

enforceSmartCard=0

0

El enforceSmartCard está ajustada,
y su valor es false

enforceSmartCard=1

1

El enforceSmartCard está ajustada,
y su valor es true

estado de salida distinto de cero

Mensaje de error y
estado de salida distinto de cero

El enforceSmartCard La clave es no
conjunto, o ( defaults solamente) la propiedad
la lista no existe

El valor por defecto de enforceSmartCard es false por lo que un estado de salida distinto de cero es esencialmente equivalente en significado -para nuestros propósitos- a enforceSmartCard=0 . En el caso del defaults también se imprime un mensaje de error parecido al siguiente:

The domain/default pair of (/Library/Preferences/com.apple.security.smartcard, enforceSmartCard) does not exist

por lo que, siempre que no haya un error tipográfico al emitir el comando, entonces el archivo /Library/Preferences/com.apple.security.smartcard.plist no existe, o sí existe y el enforceSmartCard no está configurada. En cualquier caso, el mensaje de error tiene poco valor, por lo que se puede suprimir redirigiendo stderr en el vacío:

defaults read /Library/Preferences/com.apple.security.smartcard enforceSmartCard 2>/dev/null

Así, el predicado que discriminamos será si este comando produce o no "1" (sin comillas): si lo hace, el usuario debe autenticarse utilizando su tarjeta inteligente (además de cualquier otra forma de autenticación que se requiera); cualquier otro resultado (ya sea una salida de "0" o un estado de salida distinto de cero sin salida) infiere que un usuario puede autenticarse sin usar una tarjeta inteligente.

Aquí está el script que debería ser equivalente al tuyo:

#!/usr/bin/env zsh

plist=/Library/Preferences/com.apple.security.smartcard

(( $( defaults read "$plist" \
enforceSmartCard 2>/dev/null )
)) && i=1 _not= || 
      i=2 _not=not

printf '%s ' The system is ${_not} configured to \
             enforce multi-factor authentication \
             >/dev/fd/$i

0 votos

JSYK El salida es atípico en el sentido de que mientras que el consulte vuelve a una posición normal, no obstante, el mensaje tiene un espacio y cualquiera que sea el carácter de aviso está después de ella, resaltada, y no parece en absoluto normal para salida estándar . Cambiar printf '%s ' a echo eliminará el extraño salida .

0 votos

@user3439894- No lo haría printf '%s \n' ¿Arreglar el problema?

0 votos

OK, es necesario citar la salida deseada. ...mi error....

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X