web-dev-qa-db-fra.com

Envoi de commandes et de chaînes à Terminal.app avec Applescript

Je veux faire quelque chose comme ça:

tell application "Terminal"
  activate
  do script "ssh [email protected]"
  -- // write user's password
  -- // write some linux commands to remote server
end tell

Par exemple, pour vous connecter au serveur, entrez le mot de passe, puis connectez-vous à mysql et sélectionnez un DB.
Je tape cela tous les jours et il serait vraiment utile de le regrouper dans un script. 

De plus, existe-t-il une référence concernant les commandes, propriétés, fonctions, etc. disponibles pour les applications (Terminal, Finder, etc.) dans Applescript? Merci!

EDIT: Permettez-moi d’éclaircir ceci: Je ne veux pas faire plusieurs "scripts" car j’ai essayé et ne fonctionne pas . Je souhaite ouvrir une fenêtre de terminal puis émuler un humain en tapant certains caractères et en appuyant sur Entrée. Il peut s'agir de mots de passe, de commandes, peu importe, uniquement en envoyant des caractères au terminal qui exécute ssh. J'ai essayé la frappe et ne semble pas fonctionner.

46
Petruza

Connectez-vous d'abord au serveur et attendez 6 secondes (vous pouvez le changer), puis exécutez ce que vous avez besoin sur le serveur distant en utilisant le même onglet

tell application "Terminal"
   set currentTab to do script ("ssh user@server;")
   delay 6
   do script ("do something remote") in currentTab
end tell
50
CRP

Comme EvanK l’a déclaré, chaque ligne de script do ouvre une nouvelle fenêtre, mais vous pouvez exécuter
deux commandes avec le même script do en les séparant par un point-virgule. Par exemple:

tell application "Terminal"
    do script "date;time"
end tell

Mais la limite semble être deux commandes.

Cependant, vous pouvez ajouter "dans la fenêtre 1" à la commande do script (pour chaque script après la première) pour obtenir le même effet et continuer à exécuter autant de commandes que nécessaire dans la même fenêtre:

tell application "Terminal"
    do script "date"
    do script "time" in window 1
    do script "who" in window 1
end tell


Notez que je viens d'utiliser la commande who, date et heure comme exemple ... remplacez Par toutes les commandes dont vous avez besoin.

13
user225057

Voici une autre solution, mais avec l'avantage de pouvoir lancer Terminal, de le placer au premier plan et de créer une seule fenêtre.

J'aime ça quand je veux être présenté avec les résultats de mon script.

tell application "Terminal"
    activate
    set Shell to do script "echo 1" in window 1
    do script "echo 2" in Shell
    do script "echo 3" in Shell
end tell
10
Ze'ev

Que dis-tu de ça? Aucun code de clé n'est nécessaire (du moins dans Lion, je ne le savais pas plus tôt) et un sous-programme simplifie le script principal.

Le script ci-dessous va ssh sur localhost en tant qu'utilisateur "moi", saisit le mot de passe "myPassw0rd" après un délai de 1 seconde, lance ls, retarde 2 secondes, puis quitte.

tell application "Terminal"
    activate
    my execCmd("ssh me@localhost", 1)
    my execCmd("myPassw0rd", 0)
    my execCmd("ls", 2)
    my execCmd("exit", 0)
end tell
on execCmd(cmd, pause)
    tell application "System Events"
        tell application process "Terminal"
            set frontmost to true
            keystroke cmd
            keystroke return
        end tell
    end tell
    delay pause
end execCmd
8
Allen Robel

Vous n'avez pas besoin de "dire" à Terminal de faire quoi que ce soit. AppleScript peut faire des scripts Shell directement.

set theDir to "~/Desktop/"
do Shell script "touch " & theDir &"SomeFile.txt"

ou peu importe ...

5
user1984702

Pourquoi ne pas utiliser attendre:

tell application "Terminal"
    activate
    set currentTab to do script ("expect -c 'spawn ssh user@IP; expect \"*?assword:*\"; send \"MySecretPass
\"; interact'")
end tell
2
K. Biermann

Votre question porte précisément sur la façon de faire quoi faire. Applescript. Mais, pour l’exemple particulier décrit, vous voudrez peut-être examiner la solution attendue.

2
pizzaFace

En quelque sorte, vous voudrez peut-être regarder Shuttle ( http://fitztrev.github.io/shuttle/ ), il s’agit d’un menu contextuel SSH pour OSX.

2
Nathan Pitman

Je peux me tromper, mais je pense que l’intégration d’Applescript Terminal est un accord ponctuel… C’est-à-dire que chaque appel do script équivaut à ouvrir une fenêtre de terminal différente, je ne pense donc pas que vous puissiez interagir avec cela.

Vous pouvez copier les clés publiques SSH pour empêcher l'invite du mot de passe, puis exécuter toutes les commandes réunies (warning: la commande suivante est totalement non testée):

tell application "Terminal"
    activate
    do script "ssh [email protected] '/home/jdoe/dosomestuff.sh && /home/jdoe/dosomemorestuff.sh'"
end tell

Vous pouvez également insérer les commandes ssh et suivantes dans un script Shell à l’aide de Expect , puis appeler ledit script Shell à partir de votre Applescript.

1
EvanK

configurez ssh sans mot de passe (ssh-keygen, puis ajoutez la clé à ~/.ssh/authorized_keys sur le serveur). Faites une entrée dans ~/.ssh/config (sur votre bureau), de sorte que lorsque vous exécutez ssh mysqlserver, il apparaisse sur utilisateur @ nomhôte ... ou créez un alias de shell, comme gotosql, qui passe à ssh user@Host -t 'mysql_client ...' pour démarrer le client mysql de manière interactive .

Ensuite, vous aurez probablement besoin de la réponse de quelqu'un d’autre pour écrire le processus par la suite, car je ne sais pas comment définir les commandes de démarrage de mysql.

Au moins, votre mot de passe SSH reste en dehors du script!

1
Peter Cordes

Petruza,

Au lieu d'utiliser la frappe, utilisez le code clé.
L'exemple suivant devrait fonctionner pour vous.

tell application "System Events"
    tell application process "Terminal"
        set frontmost to true
        key code {2, 0, 17, 14}
        keystroke return
    end tell
end tell

L’exemple ci-dessus envoie les caractères {d a t e} À Terminal, puis
touche retour va entrer et exécuter la commande. Utilisez l'exemple ci-dessus
Avec tous les codes de clé dont vous avez besoin, vous pourrez faire ce que vous essayez de faire.

1
user225057

Le dernier exemple récupère des erreurs sous 10.6.8 (Build 10K549) causées par le mot clé "pause".

Le remplacer par le mot "wait" le fait fonctionner:

tell application "Terminal"
    activate
    my execCmd("ssh me@localhost", 1)
    my execCmd("myPassw0rd", 0)
    my execCmd("ls", 2)
    my execCmd("exit", 0)
end tell

on execCmd(cmd, wait)
    tell application "System Events"
       tell application process "Terminal"
          set frontmost to true
          keystroke cmd
          keystroke return
       end tell
    end tell

    delay wait
end execCmd
1
user1019711

qu'en est-il quelque chose comme ceci: 

tell application "Terminal"

    activate
    do Shell script "Sudo dscl localhost -create /Local/Default/Hosts/cc.josmoe.com IPAddress 127.0.0.1"
    do Shell script "Sudo dscl localhost -create /Local/Default/Hosts/cc.josmos2.com IPAddress 127.0.0.1"

end tell
0
joey

Comme solution soignée, essayez

$ open -a /Applications/Utilities/Terminal.app  *.py

ou

$ open -b com.Apple.terminal *.py

Pour le shell lancé, vous pouvez aller dans Préférences> Shell> le configurer pour qu'il quitte si aucune erreur ne se produit.

C'est tout.

J'ai construit ce script. C'est dans Yosemite et c'est un script bash utilisant AppleScript de choisir une liste d'utilisateurs pour les serveurs SSH. En gros, vous définissez une adresse IP, puis les noms d'utilisateur. Lorsque l'application démarre, elle vous demande qui vous souhaitez vous connecter en tant que .. le terminal SSH est lancé et connecté, ce qui entraîne un mot de passe ...

(***
 * --- --- --- --- ---
 * JD Sports Fashion plc
 * Apple Script
 * Khaleel Mughal
 * --- --- --- --- ---
 * #SHELLSTAGINGSSHBASH
 * --- --- --- --- ---
***)

set stagingIP to "192.162.999.999"

set faciaName to (choose from list {"admin", "marketing", "photography_cdn"})

if faciaName is false then
    display dialog "No facia was selected." with icon stop buttons {"Exit"} default button {"Exit"}
else
    set faciaName to (item 1 of faciaName)

    tell application "Terminal"
        activate
        do script "ssh " & faciaName & "@" & stagingIP & ""
    end tell

end if

Je recommande fortement cependant; Nathan Pickmans post ci-dessus à propos de Shuttle ( http://fitztrev.github.io/shuttle/ ) .. une application très intelligente et simple.

0
TheBlackBenzKid