IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Applescript + Terminal [AppleScript]


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut Applescript + Terminal
    Bonjour,

    je créé mon premier script applescript et je suis bloqué quasiment à la fin de ce que je veux faire.

    Situation: je travaille dans une société qui utilise à 99% du mac. Nous avons installons sur chaque machine un compte admin uniquement utilisable par les informaticiens. Nous souhaitons caché ce compte admin et je suis en train de créé le script pour le faire à distance. Ce script demande à l'utilisateur l'IP de l'ordi distant, avec le terminal on y envoi le fichier du script, on créé une connexion ssh, on exécute le script puis on efface le script de l'ordi distant.

    Voici le script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    --affiche une fenêtre de choix
    display dialog "Ce script va cacher le compte admin,voulez vous effectuer ce changement sur un ordinateur distant ou sur cet ordinateur?" buttons {"mac distant", "ce mac", "Annuler"} default button 2
    
    --fonction qui permet d'avoir le chemin du script (pratique quand on change le script de place) et de changer ce chemin pour indiquer le chemin du fichier qui va être copié sur l'ordinateur distant: la variable s'appelera haystack
    --Get the paths of all selected files
    set strFilePath to {}
    tell application "Finder"
    	repeat with objItem in (get selection)
    		set end of strFilePath to POSIX path of (objItem as text)
    	end repeat
    end tell
    
    
    --Copy the file paths to the clipboard
    set {strDelimeter, text item delimiters} to {text item delimiters, return}
    set the clipboard to strFilePath as text
    set text item delimiters to strDelimeter
    
    set haystack to strFilePath
    set needle to "extensions/adminhidercomplement.scpt"
    set replacement to "Get-scriptdirectory.scpt"
    search_replace(haystack, needle, replacement)
    
    on search_replace(haystack, needle, replacement)
    	set old_delimiters to AppleScript's text item delimiters
    	set AppleScript's text item delimiters to needle
    	set temp_list to every text item of haystack
    	set AppleScript's text item delimiters to replacement
    	set return_value to temp_list as text
    	set AppleScript's text item delimiters to old_delimiters
    	return return_value
    end search_replace
    
    display dialog haystack as text with title "Path(s) copied to clipboard" with icon note giving up after 10 buttons {"Close"} default button "Close"
    
    
    --actions si on veut effectuer le script en local
    if the button returned of the result is "ce mac" then
    	tell application "Terminal"
    		activate
    		do shell script "sudo -s dscl . -create /Users/admin UniqueID 401" with administrator privileges
    		do shell script "sudo chown -R admin /Users/admin/" with administrator privileges
    		do shell script "sudo defaults write /Library/Preferences/com.apple.loginwindow Hide500Users -bool YES" with administrator privileges
    	end tell
    else
    	
    	
    	-- actions si on veut efféctuer le script sur un ordinateur distant
    	display dialog "Quel est l'adresse IP de l'ordinateur distant?" default answer "" buttons {"OK"} default button 1
    	
    	display dialog text returned of the result & "
    	
    	" & "Il sagit du mac " & "? Etes vous sûr de vouloir continuer?" buttons {"Ok", "Annuler"}
    	
    	if the button returned of the result is "Ok" then
    		tell application "Terminal"
    			activate
    			do shell script "scp -r haystack admin@" & text returned of the result & ":/Users/admin/Desktop/"
    			do shell script "ssh admin@" & text returned of the result
    			do shell script "osascript -l /Users/admin/Desktop/adminhidercomplement.scpt"
    		end tell
    	end if
    end if

    là où le script déconne c'est à la partie "-- actions si on veut effectuer le script sur un ordinateur distant".

    Cette partie demande à l'utilisateur de taper l'adresse IP de l'ordinateur distant. Adresse IP stockée dans la variable result. Au préalable, on à créé une variable haystack contenant le chemin où trouver le fichier du script à copier sur l'ordi distant.
    Ensuite, on lance l'appli terminal et on lance 3 commandes qui font appelle à ces 2 variables. Problème, ces variables ont été créées dans le script mais pas dans la session du terminal et donc mes commandes terminal ne les connaissent pas. (la partie posant problème est en rouge)

    Quelqu'un connait il une solution à ce problème?


    J’espère que j'ai été clair dans mes explications. Merci d'avance à ceux qui se pencheront sur mon problème .

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour Blackviking,

    Voici quelques pistes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do shell script "scp -r haystack admin@" & text returned of the result & ":/Users/admin/Desktop/"
    ... ne peut fonctionner car effectivement l'instruction que tu envoies est "scp -r haystack admin@ ..." qui ne veut rien dire car "haystack" n'est pas un chemin.
    Pour que le texte haystack soit remplacé par sa valeur de variable, il faut sortir du mode texte avec des ", puis mettre haystack qui sera alors interprété, puis entrer de nouveau en mode texte avec des guillemets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do shell script "scp -r " & haystack & " admin@" & text returned of the result & ":/Users/admin/Desktop/"
    C'est à dire remplacement de : haystack par :" & haystack & " -- sans oublier les espaces après le -r et avant le admin
    Compte tenu de la ligne 9, il semble que haystack soit bien au format Unix, donc cela devrait fonctionner.


    Pour le reste, je ne peux tester car, sur ma version système (Snow Leopard), je n'ai pas de flag Hide500Users dans la plist com.apple.loginwindow !

    Cordialement

  3. #3
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Ah oui, merci, faute d'inattention. La syntaxe est bonne maintenant mais mon problème persiste: mes variables (haystack et text returned) créées dans applescript ne sont pas transférées dans ma session de terminal

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Blackviking,

    Pour la variable haystack, je te suggère de tester avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Instruction to "scp -r " & haystack & " admin@"
    display dialog "vérification d'instruction=" & Instruction[/CODE]

    normalement le dialog affiché devrait contenir exactement l'instruction Unix que tu souhaites envoyer à la machine distante (tout du moins la première partie).

    Pour la variable "text returned", cela m'avait échappé en première lecture, mais l'erreur vient du fait que les valeurs de résultat de text et bouton "returned" sont écrasées après chaque display dialog.
    Dans ton code, la ligne 49 demande l'adresse IP et le résultat du bouton.
    Ces dernières sont remises à 0 lors du second display dialog en ligne 51

    Donc je te suggère de stocker l'adresse IP dans une variable temporaire IP_Adresse, qui, elle, ne peut être effacée automatiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	display dialog "Quel est l'adresse IP de l'ordinateur distant?" default answer "" buttons {"OK"} default button 1
    Set IP_Adresse to text returned of the result	
    	display dialog IP_Adresse & "
     
    	" & "Il sagit du mac " & "? Etes vous sûr de vouloir continuer?" buttons {"Ok", "Annuler"}
     
    	if the button returned of the result is "Ok" then
    		tell application "Terminal"
    			activate
    			do shell script "scp -r " & haystack & " admin@" & IP_Adresse & ":/Users/admin/Desktop/"
    			do shell script "ssh admin@" & IP_Adresse
    			do shell script "osascript -l /Users/admin/Desktop/adminhidercomplement.scpt"
    		end tell
    	end if
    e
    Enfin, un conseil, pour débugger ce type de code (cela m'arrive assez souvent !) : passe par un fichier texte en remplaçant les do shell script par un enregistrement texte. Ensuite, tu peux copier coller chaque ligne de ce texte directement dans le terminal pour vérifier le résultat ..et voir éventuellement les erreurs émises par le terminal (type connexion non établie, etc...).
    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Ah super, c'est ça qui coinçait.
    Merci beaucoup PBELL.


    Voici le code réorganisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    --fonction qui permet d'avoir le chemin du script (pratique quand on change le script de place) et de changer ce chemin pour indiquer le chemin du fichier qui va être copié sur l'ordinateur distant: la variable s'appellera haystack
    --Get the paths of all selected files
    set strFilePath to {}
    tell application "Finder"
    	repeat with objItem in (get selection)
    		set end of strFilePath to POSIX path of (objItem as text)
    	end repeat
    end tell
     
     
    --Copy the file paths to the clipboard
    set {strDelimeter, text item delimiters} to {text item delimiters, return}
    set the clipboard to strFilePath as text
    set text item delimiters to strDelimeter
     
    set haystack to strFilePath
    set needle to "extensions/adminhidercomplement.scpt"
    set replacement to "Get-scriptdirectory.scpt"
    search_replace(haystack, needle, replacement)
     
    on search_replace(haystack, needle, replacement)
    	set old_delimiters to AppleScript's text item delimiters
    	set AppleScript's text item delimiters to needle
    	set temp_list to every text item of haystack
    	set AppleScript's text item delimiters to replacement
    	set return_value to temp_list as text
    	set AppleScript's text item delimiters to old_delimiters
    	return return_value
    end search_replace
     
     
     
     
     
    --affiche une fenêtre de choix
    display dialog "Ce script va cacher le compte admin. Voulez vous effectuer ce changement sur un ordinateur distant ou sur cet ordinateur?" buttons {"mac distant", "ce mac", "Annuler"} default button 2
     
     
     
     
    --actions si on veut effectuer le script en local
    if the button returned of the result is "ce mac" then
    	tell application "Terminal"
    		activate
    		do shell script "sudo -s dscl . -create /Users/admin UniqueID 401" with administrator privileges
    		do shell script "sudo chown -R admin /Users/admin/" with administrator privileges
    		do shell script "sudo defaults write /Library/Preferences/com.apple.loginwindow Hide500Users -bool YES" with administrator privileges
    	end tell
    else
     
     
     
     
     
    	-- actions si on veut effectuer le script sur un ordinateur distant
    	display dialog "Quel est l'adresse IP de l'ordinateur distant?" default answer "192.168." buttons {"OK"} default button 1
    	set IP_adress to text returned of the result
    	set IP_adress2 to result
    	display dialog "Il sagit du mac _______? Etes vous sûr de vouloir continuer?" with title IP_adress2 buttons {"Ok", "Annuler"}
     
    	if the button returned of the result is "Ok" then
    		tell application "Terminal"
    			activate
    			do shell script "scp -r " & haystack & " admin@" & IP_adress & ":/Users/admin/Desktop/"
    			do shell script "ssh admin@" & text returned of the result
    			do shell script "osascript -l /Users/admin/Desktop/adminhidercomplement.scpt"
    			do shell script "rm /Users/admin/Desktop/adminhidercomplement.scpt"
    		end tell
    	end if
    end if
    Reste plus que quelques petites modifs et ce script sera parfait! :notamment ligne 59 indiquer le nom de l'ordinateur distant et faire des tests sur des ordi plus récents (mon ordi distant test en ce moment est en 10.5.9 et bloque au moment de la connexion ssh)

  6. #6
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Hello, bon après bien des tests et des heures à chercher, j'ai des problèmes pour les commandes Terminal à distance.

    Quand je fais les commandes directement dans le Terminal. Le Terminal me demande le mot de passe admin. Avec Applescript, il ne me demande rien et me met ces messages d’erreurs:



    la commande de connexion ssh me donne:




    La session à distance est activée dans l'onglet de partage sur les 2 macs.
    Quelqu'un aurait une idée?

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [sondage terminé] Quel est le meilleur Antivirus , firewall, etc ?
    Par Jean-Philippe Dubé dans le forum Sécurité
    Réponses: 277
    Dernier message: 22/04/2009, 22h53
  2. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24
  3. [TTHREAD] ne termine pas sont exécution
    Par Bbenj dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2002, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo