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
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.
0 votos
@Rakib Fiha, RE: "Si yo estuviera en tu lugar, probablemente cambiaría el tinglado". -- ¿Por qué? Para tu información, en una instalación limpia por defecto de MacOS Big Sur por defecto
shell
eszsh
.0 votos
OP preguntó específicamente lo que yo haría. Sucede que ejecuto el último bash como mi shell por defecto por razones personales (como compatibilidad con posix y demás) y hago muchos scripts en bash para mi trabajo para tener compatibilidad con Linux. Asi que mi shebang en la mayoria de los casos es #!/usr/bin/env bash. Pero aquí, claramente OP no necesita preocuparse por esas cuestiones.
0 votos
Buen punto, no use
zsh
sish
es suficiente (que lo es para un script como este).