it-swarm.com.de

Senden von Befehlen und Zeichenfolgen mit Applescript an Terminal.app

Ich möchte so etwas machen:

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

Um sich beispielsweise am Server anzumelden, geben Sie das Kennwort ein, melden Sie sich dann bei mysql an und wählen Sie eine Datenbank aus.
Ich schreibe das jeden Tag und es wäre wirklich hilfreich, es in ein Skript zu bündeln. 

Gibt es auch einen Hinweis darauf, welche Befehle, Eigenschaften, Funktionen usw. Anwendungen (Terminal, Finder usw.) zur Verwendung in Applescript zur Verfügung haben? Vielen Dank!

EDIT: Lassen Sie mich das klarstellen: Ich möchte nicht mehrere 'Skript ausführen' machen, da ich es versucht habe und nicht funktioniert . Ich möchte ein Terminalfenster öffnen und emulieren Sie dann einen Menschen, der einige Zeichen eingibt und die Eingabetaste drückt. Könnten Passwörter sein, Befehle, was auch immer, einfach Zeichen an das Terminal senden, das gerade ssh ausführt. Ich habe den Tastenanschlag ausprobiert und scheint nicht zu funktionieren.

46
Petruza

Stellen Sie zunächst eine Verbindung zum Server her und warten Sie 6 Sekunden (Sie können das ändern), und führen Sie dann alles aus, was Sie auf dem Remote-Server benötigen

tell application "Terminal"
   set currentTab to do script ("ssh [email protected];")
   delay 6
   do script ("do something remote") in currentTab
end tell
50
CRP

Wie EvanK feststellte, öffnet jede Skriptzeile ein neues Fenster, das Sie jedoch ausführen können
Zwei Befehle mit demselben Skript werden durch ein Semikolon getrennt. Zum Beispiel:

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

Die Grenze scheint jedoch zwei Befehle zu sein.

Sie können jedoch "in Fenster 1" an den do-Skriptbefehl anhängen (für jedes do-Skript nach dem ersten), um den gleichen Effekt zu erzielen und so viele Befehle auszuführen, wie Sie in demselben Fenster benötigen:

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


Beachten Sie, dass ich gerade den Befehl who, date und time als Beispiel verwendet habe. Ersetzen Sie .__ durch die Befehle, die Sie benötigen.

13
user225057

Hier ist ein anderer Weg, aber mit dem Vorteil, dass es Terminal startet, es nach vorne bringt und nur ein Fenster erstellt.

Ich mag das, wenn ich die Ergebnisse meines Skripts ordentlich präsentieren möchte.

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

Wie wäre es damit? Es gibt keine Notwendigkeit für Schlüsselcodes (zumindest in Lion, bei früheren Versionen nicht sicher), und eine Subroutine vereinfacht das Hauptskript.

Das folgende Skript wird ssh an localhost als Benutzer "me" senden, das Kennwort "myPassw0rd" nach einer Verzögerung von 1 Sekunde eingeben, ls ausgeben, 2 Sekunden verzögern und dann beenden.

tell application "Terminal"
    activate
    my execCmd("ssh [email protected]", 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

Sie müssen das Terminal nicht "anweisen", um etwas zu tun. AppleScript kann Shell-Skripts direkt ausführen.

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

oder Wasauchimmer ...

5
user1984702

Warum nicht verwenden erwarten:

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

In Ihrer Frage geht es speziell darum, wie Sie mit Applescript das tun können, was Sie wollen. Aber für das bestimmte beschriebene Beispiel möchten Sie vielleicht als Lösung "erwarten".

2
pizzaFace

Ein bisschen verwandt, möchten Sie vielleicht Shuttle ( http://fitztrev.github.io/shuttle/ ) sehen, es ist ein SSH-Kontextmenü für OSX.

2
Nathan Pitman

Ich könnte mich irren, aber ich denke, die Integration von Applescript Terminal ist ein One-Shot-Deal ... Das heißt, jeder do script-Aufruf ist wie das Öffnen eines anderen Terminalfensters. Ich glaube also nicht, dass Sie überhaupt damit interagieren können.

Sie können die öffentlichen SSH-Schlüssel kopieren, um die Kennwortabfrage zu verhindern, und dann alle zusammengeführten Befehle ausführen (warning: Folgendes ist völlig ungetestet):

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

Alternativ können Sie die SSH-Befehle und nachfolgende Befehle mit Expect in ein Shell-Skript einfassen und dieses Shell-Skript dann aus Ihrem Applescript aufrufen.

1
EvanK

richten Sie das Kennwort ohne Kennwort ein (ssh-keygen und fügen Sie den Schlüssel zu ~/.ssh/authorized_keys auf dem Server hinzu). Machen Sie einen Eintrag in ~/.ssh/config (auf Ihrem Desktop), so dass beim Ausführen von ssh mysqlserver der Benutzer @ hostname aufgerufen wird. Oder erstellen Sie einen Shell-Alias ​​wie gotosql, der zu ssh [email protected] -t 'mysql_client ...' to erweitert wird Starten Sie den MySQL-Client interaktiv auf dem Server.

Dann brauchen Sie wahrscheinlich die Antwort einer anderen Person, um den Prozess danach zu skripieren, da ich nicht weiß, wie man Startbefehle für mysql setzt.

Zumindest hält das Ihr SSH-Passwort aus dem Skript!

1
Peter Cordes

Petruza,

Verwenden Sie anstelle des Tastenanschlags den Tastencode.
Das folgende Beispiel sollte für Sie funktionieren.

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

Das obige Beispiel sendet die Zeichen {tag} An Terminal und dann
Der Keystroke-Befehl return gibt den Befehl ein. Verwenden Sie das obige Beispiel
mit den von Ihnen benötigten Schlüsselcodes Sie können tun, was Sie versuchen.

1
user225057

Das letzte Beispiel enthält Fehler unter 10.6.8 (Build 10K549), die durch das Schlüsselwort "pause" verursacht werden.

Wenn Sie es durch das Wort "wait" ersetzen, funktioniert es:

tell application "Terminal"
    activate
    my execCmd("ssh [email protected]", 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

was ist mit so etwas: 

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

Als saubere Lösung versuchen Sie

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

oder

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

Wenn die Shell gestartet wurde, können Sie zu Voreinstellungen> Shell> gehen, um sie zu beenden, wenn kein Fehler vorliegt.

Das ist es.

Ich habe dieses Skript gebaut. Es ist in Yosemite und es ist ein Bash-Skript, das AppleScript verwendet, um eine Liste von Benutzern für SSH-Server auszuwählen. Grundsätzlich definieren Sie eine IP und dann die Benutzernamen. Wenn die Anwendung gestartet wird, werden Sie gefragt, als wen Sie sich anmelden möchten. Das SSH-Terminal wird gestartet und mit der Eingabe eines Kennworts angemeldet.

(***
 * --- --- --- --- ---
 * 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

Ich kann es nur wärmstens empfehlen. Nathan Pickmans Beitrag oben über Shuttle ( http://fitztrev.github.io/shuttle/ ) .. eine sehr intelligente und einfache Anwendung.

0
TheBlackBenzKid