Terminalbefehl als App / Script umsetzen

Maddeen

Mitglied
Thread Starter
Dabei seit
21.04.2012
Beiträge
20
Reaktionspunkte
4
Hi zusammen,

kurz zum Hintergrund:
Ich habe einen unRAID-Server im Betrieb der - neben vielen anderen Sachen - eine Gaming-VM hostet.
Diese VM starte ich relativ regelmäßig, sodass ich gerne den Weg über das Webinterface (Safari starten, WebGUI aufrufen, Einloggen, VM starten) von unRAID umgehen würde.
Dafür habe ich mir via Macports einen Putty-Port erstellt. Mit diesem ist es nämlich dann möglich, dass ich via Terminal und dem Befehl "plink" die VM starten kann.

unRaid ist leider nur über Umwege in der Lage mit SSH-Keys ein passwortlosen Shell-Zugang bereitzustellen. Und mit Umwege meine ich --> für mich als Otto-Normal-User nicht umsetzbar :(
Auf der anderen Seite ist der Befehl "sshpass" - der auch eine native Lösung bieten würde - leider nicht im Umfang des macOS Terminals :(
Ergo musste ich einen Weg finden, wie ich einen Terminalbefehl Richtung unRAID absetzen, der aber das Passwort für den SSH-Root-Zugriff durchreichen kann. Und das kann "plink" ;)
.... also so ne Art von Hinten, über das Knie, durch den Magen zum Auge-Operation :)

Mit dieser Konstellation ist es mir jetzt mit dem folgenden Terminalbefehl möglich, die VM ohne Zugriff via WebGUI zu starten :dance:

plink -pw "hier_steht_ein_passwort_mit_Sonderzeichen" root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS

Jetzt suche ich lediglich noch eine Lösung, wie ich diesen Codeschnipsel in eine App / Automator-Script oder irgendwas packen kann, was man einfach auf den Desktop packen und per Doppelklick ausführen kann.
Allerdings ohne das das Terminal (sichtbar!) gestartet wird -- also im "Hide" Modus oder wie man das nennt :)

Das Problem hierbei ist, dass ich schon keine Ahnung habe, was der Unterschied zwischen einem Terminalbefehl, Apple-Script und einem Shell-Script usw. ist.
In der Windowswelt - wo ich solche CMD-Befehle gerne mal beruflich nutze - muss ich immer nur das, was in der CMD funktioniert 1:1 in eine Textdatei kopieren - Dateiendung ändern - fertig - funktioniert.
Das geht - wie ich jetzt lernen musste - auf macOS leider nicht.

Es wäre daher super, wenn mir jemand eine Dummy-Anleitung geben könnte, wie ich mein Ziel erreiche.
Herzlichen Dank und allen einen schönen Feierabend.
 
Da du das Terminal nicht geöffnet haben willst, bleibt ja nur
do shell script
über Applescript bzw Automator.

Ansonsten wäre die Lösung mit Textdatei speichern auch einfach, du musst nur ein shebang als erste Zeile machen und es als .command speichern.
#!/bin/sh
plink
 
  • Gefällt mir
Reaktionen: Maddeen und electricdawn
Das ohne Terminal wäre die "Goldkantenlösung" - und wie ich dich verstehe, sollte das ja auch möglich sein, aber das mit dem Applescript bzw. Automator klappt leider nicht - wobei das aber sicherlich mit meiner Ahnungslosigkeit zu tun hat.
Ich habe den Script-Editor geöffnet und folgendes dort hinterlegt

[B]do shell script[/B] "plink -pw 'hier_steht_ein_Passwort_mit_Sonderzeichen' root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"

Wenn ich das aber ausführe kommt ein:
Skriptfehler sh: plink: command not found
 
Liegt plink auch im PATH?
Sonst den Pfad zur plink executable abgeben ...
 
  • Gefällt mir
Reaktionen: Maddeen
@mausfang - gute Frage. Keine Ahnung.
Da ich den Befehl ja nur im Terminal im "root" genutzt habe, hätte ich gar nicht gedacht, dass ich überhaupt einen Pfad angeben muss. Ist ja im Terminal auch nicht nötig.

Laut der Suche (siehe Screenshot), liegt die plink Datei (Terminal-Dokument) wohl unter
\\opt\local\bin\plink
 

Anhänge

  • Bildschirmfoto 2020-08-28 um 08.12.26.png
    Bildschirmfoto 2020-08-28 um 08.12.26.png
    19,6 KB · Aufrufe: 96
Das geht - wie ich jetzt lernen musste - auf macOS leider nicht.
Das geht sehr wohl. Die Endung waere ".command" statt ".cmd" wie in Windows. Und dann muss natuerlich noch das "Execute"-Flag gesetzt werden, damit MacOS die Datei als ausfuehrbar akzeptiert.
 
  • Gefällt mir
Reaktionen: Maddeen und dg2rbf
\\opt\local\bin\plink
\\ ist ein Pfad zu einem Server unter Windows. Nicht, was Du hier willst. Unter einem Unix (wie MacOS) musst Du den Pfad als /opt/local/bin/plink angeben.

"\" ist ein "Escape"-Zeichen unter Unix, waehrend "/" das korrekte Pfadsymbol unter Unix ist. Windows hat sich das ja von Unix abgeschaut und einfach umgedreht.
 
  • Gefällt mir
Reaktionen: Maddeen und dg2rbf
@electricdawn - danke für die Hinweise. Das mit ".command" ist ja aber nicht zielführend, wenn ich das oben richtig verstanden habe. Ich möchte ja, dass die Aktion ohne öffnen des Terminals (bzw. wenn, aber dann nicht sichtbar) stattfinden.

Bzgl. deinem Hinweis... dann wäre also der korrekte Befehl für den Script-Editor wie folgt

do shell script "/opt/local/bin/plink -pw 'hier_steht_ein_Passwort_mit_Sonderzeichen' root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"

Passt das?
 
Wenn das ganze im Terminal ohne do shell script so laeuft, dann ja. Und ja, meine Methode oeffnet immer ein Terminal. Ich benutze das um Windowsprogramme (Spiele) mit Hilfe von Wine zu starten. Habe mich aber auch noch nicht damit beschaeftigt, wie ich das Terminalfenster vermeiden kann.
 
  • Gefällt mir
Reaktionen: Maddeen
Es funktioniert!!! Sehr geil... vielen Dank dafür!!
 
  • Gefällt mir
Reaktionen: electricdawn, mausfang und dg2rbf
@electricdawn - vielleicht kannst du mir noch mal helfen. Natürlich kommen jetzt noch ein paar Wünsche, die das ganze abrunden würden.
Da ich es aber einfach nicht kapiere, warum ein "Terminalbefehl" im Terminal funktioniert, aber in AppleScript (und/oder) als shell script nicht, komme ich hier nicht weiter :)

Wie gesagt - generell funktioniert es ja jetzt. Ich habe es mittlerweile sogar hinbekommen, dass der unRAID Server doch meinen SSH-Key dauerhaft speichert, sodass das Script aktuell nur noch so aussieht
Code:
do shell script
"ssh root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"

Ich würde das jetzt gerne um eine bzw. zwei Notifications erweitern, da man ja sonst nicht weiß ob
a) das Script auch gestartet wurde
b) das die VM auch gestartet wurde.

Dazu habe ich im Netz jetzt folgenden Befehl gefunden - der wie o.a. - innerhalb des Terminals auch wieder perfekt funktioniert.
osascript -e 'display notification "Script gestartet" with title "Gaming VM"'

Diesen kriege ich jetzt aber nicht in das o.a. Shell Script integriert... offensichtlich scheint die komplette "Parametrisierung" zwischen einem Terminalbefehl und diesem (ich nenne es jetzt mal) "Shell script als AppleScript" anders zu sein.
Zudem weiß ich auch nicht, wie ich auf Basis der Ausgabe des Scripts (also der Bestätigung, dass die VM auch wirklich gestartet wurde) dann eine neue Display notification ausgeben kann.

Mal ganz "menschlich" beschrieben, müsste es von der Logik ja ungefähr so sein

START Action --> "ssh root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"
THEN Notification --> osascript -e 'display notification "Script gestartet" with title "Gaming VM"'
IF Ergebnis --> "Domain Windows_10q35_5_own_vBIOS started" (das gibt mir das Terminal bzw. auch der ScriptEditor aus, wenn ich den "virsh start" ausführe und die VM dann tatsächlich gestartet ist)
THEN Notification --> osascript -e 'display notification "Die VM wurde erfolgreich gestartet" with title "Gaming VM"'
IF Ergebnis --> "irgendwas anderes"
THEN Notification --> osascript -e 'display notification "Die VM konnte nicht gestartet werden" with title "Gaming VM"'

Wenn man dann noch mit (angeblich) diesen Befehl
afplay /System/Library/Sounds/Hero.aiff
bei den zwei o.a. Zuständen jeweils einen "Positiven-Ton" und einen "NEgativen-Ton" integrieren könnte, wäre es das Goldrand-Super-Paket (jedenfalls für mich) :)

Ich hoffe ich konnte mich halbwegs verständlich ausdrücken - wie gesagt, bin ich kein Dev oder CLI-Mensch.
 
Du willst osascript über do shell script in einem Applescript aufrufen?
osascript ist dafür da, um im Terminal Applescript aufzurufen.
Da musst du nur den Applescript Teil nehmen und ins Applescript packen.

do shell script gibt dir auch einen return Wert.
Entweder den String oder eine Zahl.
Das kannst du auswerten und für dein if then else nutzen.

Guck halt die Syntax nach.
 
  • Gefällt mir
Reaktionen: electricdawn
Das waere ja auch doppelt gemoppelt. AppleScript ruft Terminal auf, welches Osascript aufruft um eine AppleScript-Zeile auszufuehren... Macht nicht wirklich Sinn.
 
Das Problem ist, dass das alles für mich absolut nicht logisch ist...
Ich kann den ssh Befehl einfach im Terminal aufrufen, aber kann diesen nicht ohne das "do shell script" starten.
Bei dem osascript heißt es jetzt, das geht im Terminal, weil es ein Terminalbefehl ist, aber nicht mit "do shell script" - obwohl genau das die Lösung für den SSH Teil war...

Sprich wenn ich jetzt nur das osascript ohen "do shell" nutze, geht das zwar - aber dann geht der SSH nicht mehr :iconfused:

Da komme ich nicht mehr mit :) Bin ja nur nen "Enduser" der - weil es leider ausnahmsweise mal keine App für sowas gibt - nach einer Lösung sucht ^^

Ich habe das Ganze aber jetzt wie folgt gelöst

Code:
try
    do shell script "/usr/bin/ssh root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"
    if result = "Domain Windows_10q35_5_own_vBIOS started" then
        display notification "VM started successfully" with title "Gaming VM"
    else
        display notification "VM couldn't started" with title "Gaming VM"
    end if
on error
    display notification "Script Error" with title "Gaming VM"
end try

Das Problem ist jetzt aber, dass es bei dem o.a. Script kein "Ergebnis" gibt, sodass die Notifications kommen.
Obwohl - und das ist offensichtlich wieder logisch für Entwickler und Scripter, aber nicht für normale User - wenn nur
[B]do shell script[/B] "/usr/bin/ssh root@192.168.1.248 virsh start Windows_10q35_5_own_vBIOS"
im Skripteditor starte -- erscheint unten in der Box die "ERGEBNIS" heißt, genau der Output, den ich eigentlich für die korrekte Notification nutzen möchte. (siehe Screens)

Warum gibt es also bei dem kurzen Script ein Ergebnis und beim langen nicht ?!?

Ausgabe bei "ERGEBNIS", wenn ich nur die SSH-Zeile starte
Bildschirmfoto 2020-09-01 um 20.31.08.png


Und bei dem langen Script bleibt Ergebnis "leer" -- dafür werde ich mit Infos in den anderen beiden Reitern zugeschüttet :) Mit denen ich natürlich auch nichts anfangen kann ;-)

Ausgabe bei "ANTWORTEN"
Bildschirmfoto 2020-09-01 um 20.32.40.png


Ausgabe bei "EVENTS"
Bildschirmfoto 2020-09-01 um 20.32.34.png
 
Probier mal result is statt =
Sonst lass dir doch mal result ausgeben.
 
  • Gefällt mir
Reaktionen: Maddeen
Natürlich lässt sich die secure shell einfach im Terminal starten. Die gibt es ja schon einiges länger als Apple Script. Weiss nicht, was Du da genau vorhast. Aber irgendwas machst Du falsch.
 
  • Gefällt mir
Reaktionen: Maddeen
Hallo,

das Ergebnis entspricht nicht dem deiner if Schleife:

"test
"

ist nicht

"test"


Code:
do shell script "echo 'test
'"
set x to "test
"
if the result is x then display notification "!"
 
  • Gefällt mir
Reaktionen: Maddeen und mausfang
Vielleicht dann eher contains statt =.

Edit: Oder halt \n bzw \r mit in den Vergleichsstring.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Maddeen
@varuna - that's it... da muss man aber auch erst mal drauf kommen. Vor allem sind das alles Leerzeichen bis zu den Anführungszeichen. Hatte erst mit einem Zeilenumbruch probiert - nichts. Dann das Ergebnis aus dem simplen SSH-Befehl copy+paste ins neue Script und tadaaaa .. Notification ist da.

Vielen Dank an alle für die Hilfe
 
Hi zusammen,

ich muss hier noch mal etwas nachfragen :)

Das Script hat bis vor ein paar Monaten gut funktioniert.
Mittlerweile bekomme ich aber immer - auch wenn die VM sauber startet - die Notfication -- VM couldn't started

Ich gehe also davon aus, dass sich die Rückmeldung des Servers geändert hat oder diese ggf. zu lange braucht?!? :unsure:
Aber wie kann ich überhaupt rausfinden, was, wie und in welcher Zeit zurück geliefert wird?
In dem unteren Fenster im "Scripteditor" wird weder bei Ergebnis, Nachricht, Events oder Antworten etwas ausgegeben

Hier noch mal das aktuell genutzte Script, was als .app läuft

Freue mich auf ein paar Tipps. Danke und schönes WE

AppleScript:
try
    do shell script "/usr/bin/ssh root@192.168.2.1 virsh start Windows_10q35_5_own_vBIOS"
    if result is "Domain Windows_10q35_5_own_vBIOS started" then
        display notification "VM started successfully" with title "Gaming VM"
    else
        display notification "VM couldn't started" with title "Gaming VM"
    end if
on error
    display notification "Script Error" with title "Gaming VM"
end try
 
Zurück
Oben Unten