ARD personnaliser la liste de commandes UNIX

{0 Comments}

Apple Remote Desktop est un incontournable de la trousse d’outil de tout macadmin.

Son champ d’action ne se limite pas à la prise de côntrole à distance, et s’il fallait citer dans la panoplie des actions possibles la plus puissante, le premier prix reviendrait sans autre à la possibilité de lancer facilement de lignes de commande ou scripts en modalité root sur plusieurs machines immédiatement ou en tâche programmée tout en ayant un retour précis et classifié des résultats obtenus.

Cette option sobrement appelée Unix avec son icône Terminal dans la barre de tâche est fournie avec une collection de scripts de base très pratiques et joliment rangés.

Dans ce même menu il est possible d’ajouter sa propre collection de scripts crées/trouvés amoureusement au fils des années.

Cette sympathique option est limitée à la création d’entrées successives sans possibilité aucune d’organisation hiérarchique si effectuée par interface graphique.

En effet pour parvenir à organiser ses propres scripts de la même façon que les menus par défaut, il faut mettre la main dans un fichier xml ad hoc.

Ce dernier s’appelle UnixCommandTask.plist et se trouve dans la bibliothèque de l’utilisateur dans:

~/Library/Application\ Support/Remote\ Desktop/Presets/UnixCommandTask.plist

La structure du fichier xml est relativement simple: une fois que l’on connaît l’organisation et la hiérarchie de balises nous pouvons l’adapter pour obtenir ce genre de résultat:

Pour y arriver, observons la structure du fichier UnixCommandTask.plist de l’exemple précédent

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>name</key>
<string>MON DOSSIER TOTO</string>
<key>state</key>
<array>
<dict>
<key>name</key>
<string>MON SCRIPT DE LA MORT QUI TUE</string>
<key>state</key>
<dict>
<key>outputMode</key>
<true/>
<key>script</key>
<string>LA LIGNE DE COMMANDE</string>
<key>userSelect</key>
<integer>0</integer>
</dict>
</dict>
<dict>
<key>name</key>
<string>MON PETIT SCRIPT</string>
<key>state</key>
<dict>
<key>outputMode</key>
<true/>
<key>script</key>
<string>LA LIGNE DE COMMANDE 2</string>
<key>userSelect</key>
<integer>0</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>MON DOSSIER TITI</string>
<key>state</key>
<array>
<dict>
<key>name</key>
<string>MON APPLESCRIPT</string>
<key>state</key>
<dict>
<key>outputMode</key>
<true/>
<key>script</key>
<string>LA LIGNE DE COMMANDE</string>
<key>userSelect</key>
<integer>0</integer>
</dict>
</dict>
<dict>
<key>name</key>
<string>MON SCRIPT PERL</string>
<key>state</key>
<dict>
<key>outputMode</key>
<true/>
<key>script</key>
<string>LA LIGNE DE COMMANDE 2</string>
<key>userSelect</key>
<integer>0</integer>
</dict>
</dict>
</array>
</dict>
</array>
</plist>

La logique est grosso modo la même qui gère la structure du code HTML: les dossiers comme le contenu sont délimités par de balises qui s’imbriquent les unes dans les autres selon la hiérarchie souhaitée.

Si nous ouvrons cette même plist avec un éditeur de texte comme TextWrangler qui range le code de façon à qu’il soit lisible et en mettant en évidence la dépendance entre balises:

 

Nous constatons que mes deux menus « MON DOSSIER TOTO » et « MON DOSSIER TITI » sont contenus dans la première balise <array> qui se ferme à la fin de la plist avec </array>.

De la même façon en descendant dans la hiérarchie le menu « MON DOSSIER TOTO » est délimité par la balise <dict>  à l’intérieur de laquelle on trouve la balise <array>  qui contiens les balises <dict> qui servent à délimiter à leur tour les submenus  « MON SCRIPT DE LA MORT QUI TUE » et « MON PETIT SCRIPT »

En descendant encore nous trouvons les balises <dict> nécessaires à expliciter la ligne de commande ou le script.

Si le script s’articule en plusieurs lignes il suffit de répéter les balises <string> </string>  sur autant de lignes que necessaire.

En respectant ce système de « poupées rousses » il est possible d’imbriquer (par copier / coller par ex.) autant de scripts voulus selon la logique souhaitée.

Vous pouvez télécharger la plist modèle ici:

UnixCommandTask.plist

De suite, en forme d’annexe, quelque script « grand classique » pour votre collection:

  • Le script pour « binder » les machines clientes à un serveur OpenDirectory
computername="`scutil --get ComputerName`"
configname=NOMSERVEUR
dsconfigldap -f -a NOMSERVEUR -u ADMIN_OD -p PASSWORD -c $computername -n $configname -v
dscl /Search -create / SearchPolicy CSPSearchPath
dscl /Search -append / CSPSearchPath /LDAPv3/NOMSERVEUR
dscl /Search/Contacts -create / SearchPolicy CSPSearchPath
dscl /Search/Contacts -append / CSPSearchPath /LDAPv3/NOMSERVEUR
killall DirectoryService

En gras les variables à renseigner avec vos informations

  • L’applescript qui permet de simuler la saisie manuel du login/motdepasse et permettant ainsi l’ouverture d’ une session sur plusieurs ordinateurs à partir de la fenêtre de login
osascript -e 'tell application "System Events" to keystroke "LOGIN_UTILISATEUR"'; \
osascript -e 'tell application "System Events" to keystroke tab'; \
osascript -e 'tell application "System Events" to delay 0.5'; \
osascript -e 'tell application "System Events" to keystroke "MOTdePASSE"'; \
osascript -e 'tell application "System Events" to delay 0.5'; \
osascript -e 'tell application "System Events" to keystroke return'

En gras les variables à renseigner avec vos informations

  • La ligne de commande pour changer le mot de passe d’un utilisateur locale sur la(e) machine(s)
dscl . -passwd /Users/TON_USER TONNOUVEAUPASSWORD

En gras les variables à renseigner avec vos informations

  • script pour changer la configuration IP du port principale d’une machine
mainInt=$(networksetup -listnetworkserviceorder | \
awk '/\(1\)/ {$1="";sub("^ ","",$0);print}')
networksetup -setmanual "$mainInt" 192.168.1.x 255.255.255.0 192.168.1.1

En gras les variables à renseigner avec vos informations


post speciale dédicace David « la tornade »

Leave a Comment

Your email address will not be published.

*