0 votes

Vérification du shell MacOS script. Une meilleure façon d'exécuter l'instruction if et de vérifier une condition

Je dois écrire un shell script très simple qui vérifiera si le système est configuré pour appliquer l'authentification multifactorielle.

Pour vérifier que le système est configuré pour appliquer l'authentification multifactorielle, exécutez les commandes suivantes :

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

Si les résultats ne montrent pas " enforceSmartCard=1 ", c'est un constat.

J'ai créé ce script très simple, mais je suis pratiquement sûr qu'il existe un moyen plus efficace, plus élégant et plus efficient d'obtenir le même résultat.

En gros, si c'était vous, quel genre de modifications appliqueriez-vous au script ci-dessous pour obtenir les mêmes résultats ?

Merci beaucoup d'avance pour votre aide.

#!/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

3voto

glenn jackman Points 1869

Cela pourrait être un peu plus élégant, mais pas nécessairement. plus simple : J'emballe les parties du pipeline dans leurs propres fonctions.

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

Quelques notes

  • préférez $(...) sur `...` pour la substitution des commandes : c'est plus facile à lire.
  • if prend un commande et des branches basées sur la commande statut de sortie . À l'invite de bash, entrez help if pour plus de détails.
    • [ est une commande intégrée à bash, et non une simple syntaxe.
  • si "enforceSmartCard=1" est le seul texte sur la ligne, ajoutez -x aux options de grep.

En outre, vous pouvez modifier le PATH dans votre script pour rationaliser les fonctions

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

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

Ceci est seulement en vigueur pour la durée de l'exécution du script, et n'affectera pas votre shell interactif.

1voto

OnePablo Points 1

J'aurais tendance à lire la valeur de l'élément enforceSmartCard directement à partir de l'écran com.apple.security.smartcard.plist situé dans le dossier /Library/Preferences dossier.

Cela peut être fait en utilisant l'option defaults qui sera nettement plus rapide que l'outil en ligne de commande system_profiler et vous n'aurez pas besoin de grep sa sortie :

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

Voici les sorties possibles pour le system_profiler | grep y defaults les commandements, ainsi que leur signification :

system_profiler | grep

defaults

enforceSmartCard=0

0

En enforceSmartCard est réglé,
et sa valeur est false

enforceSmartCard=1

1

En enforceSmartCard est réglé,
et sa valeur est true

statut de sortie non nul

Message d'erreur et
statut de sortie non nul

En enforceSmartCard La clé est pas
set, ou ( defaults seulement) la propriété
la liste n'existe pas

La valeur par défaut pour enforceSmartCard est false Par conséquent, un statut de sortie non nul est essentiellement équivalent en termes de signification - pour nos besoins - à enforceSmartCard=0 . Dans le cas de la defaults un message d'erreur est également imprimé et ressemble à ceci :

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

donc, s'il n'y a pas d'erreur typographique lorsque vous lancez la commande, alors soit le fichier /Bibliothèque/Préférences/com.apple.security.smartcard.plist n'existe pas, ou bien elle existe et le enforceSmartCard n'est pas réglé. Dans tous les cas, le message d'erreur n'a que peu d'intérêt, il peut donc être supprimé en redirigeant le fichier stderr dans le vide :

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

Ainsi, le prédicat sur lequel nous discriminerons sera de savoir si oui ou non cette commande sort "1" (sans guillemets) : si c'est le cas, l'utilisateur doit s'authentifier à l'aide de sa carte à puce (en plus de toute autre forme d'authentification requise) ; tout autre résultat (soit une sortie de "0" ou un statut de sortie non nul sans sortie) déduit qu'un utilisateur peut s'authentifier sans utiliser de carte à puce.

Voici le script final qui devrait être équivalent au vôtre :

#!/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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X