Terminalbefehl als App / Script umsetzen

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
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.
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.135
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

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
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
 

mausfang

Aktives Mitglied
Mitglied seit
04.08.2016
Beiträge
1.850
Liegt plink auch im PATH?
Sonst den Pfad zur plink executable abgeben ...
 
  • Gefällt mir
Reaktionen: Maddeen

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
@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

electricdawn

Aktives Mitglied
Mitglied seit
01.12.2004
Beiträge
11.538
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

electricdawn

Aktives Mitglied
Mitglied seit
01.12.2004
Beiträge
11.538
\\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

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
@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?
 

electricdawn

Aktives Mitglied
Mitglied seit
01.12.2004
Beiträge
11.538
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

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
Es funktioniert!!! Sehr geil... vielen Dank dafür!!
 
  • Gefällt mir
Reaktionen: electricdawn, mausfang und dg2rbf

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
@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.
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.135
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

electricdawn

Aktives Mitglied
Mitglied seit
01.12.2004
Beiträge
11.538
Das waere ja auch doppelt gemoppelt. AppleScript ruft Terminal auf, welches Osascript aufruft um eine AppleScript-Zeile auszufuehren... Macht nicht wirklich Sinn.
 

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
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
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.135
Probier mal result is statt =
Sonst lass dir doch mal result ausgeben.
 
  • Gefällt mir
Reaktionen: Maddeen

electricdawn

Aktives Mitglied
Mitglied seit
01.12.2004
Beiträge
11.538
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

varuna

Mitglied
Mitglied seit
21.10.2009
Beiträge
471
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

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.135
Vielleicht dann eher contains statt =.

Edit: Oder halt \n bzw \r mit in den Vergleichsstring.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Maddeen

Maddeen

Neues Mitglied
Thread Starter
Mitglied seit
21.04.2012
Beiträge
11
@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
 
Oben