• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Shell Skript soll Passwort sicher erfragen

  • Ersteller Ersteller Benutzer 62153
  • Erstellt am Erstellt am

Benutzer 62153

Gast
Ich habe eine.app programmiert, die ein Shell-Skript ausführt. Da ich dort einige sudo Befehle habe, möchte ich gerne dass das Passwort vom Benutzer abgefragt wird.

Dabei ist es wichtig, dass das Passwort nicht in der Konsole oder sonstwo im Klartext erscheint.

Optimal wäre eine Abfrage wie man sie vom System kennt, wo der Benutzername schon ausgefüllt ist und nur das Admin Passwort verlangt wird. Wer kann mir weiterhelfen?
 
Ich habe jetzt versucht den Befehl einfach zu starten, aber das Programm führt ihn nicht aus.

Code:
#!/bin/bash

sudo BEFEHLKETTE
sudo ...

Im Terminal erhalte ich eine Eingabemaske, aber wenn ich es über die .app laufen lasse kann ich natürlich nichts angeben.
 
Was genau meinst du mit app? Und wie führst du das script aus? Erklär mal genauer was du machst?
 
Ich habe einen Ordner namens Programm.app und dann die übliche Struktur erstellt. Ein Doppelklick startet /MacOS/Script, was ich mit chmod +x ausführbar gemacht habe. Ich weiss nicht genau wie ich das nennen soll. ;)
 
Äh das ist nicht dein ernst, oder? Ein Ordner namens Programm.app? Jedes Programm ist ein Ordner! Bist du sicher das du unbedingt selber programmieren willst? ... Was ich meinte ist, ist es in C, C++, Java, ... bzw. in welche Sprache programmierst du? Wie sieht der Code aus, wo das Script aufgerufen wird? Schau mal in die Apple Developer Dokus, dort wird sehr gut erklärt, wie man sowas lösst.
 
Die wohl einfachste Weise ein Shellskript mit einem GUI-Dialog das Adminkennwort abfragen zu lassen ist die Einkapselung in ein AppleSkript.
Das bietet sich besonders bei nur einzelnen Befehlen oder sehr kurzen, simplen Skripten an. Im AppleSkript-Editor sieht das so aus:
Code:
try
    do shell script "
            [COLOR="#a0522d"]Shell-Befehle;
            ...;
            Shell-Befehle;[/COLOR]
    " with administrator privileges 
end try
Aufgemerkt: KEIN 'sudo' verwenden, diese Funktion übernimmt die entsprechende AppleSkript-Anweisung.
Doppelte Anführungszeichen und Backslashes innerhalb der Shellbefehle müssen jeweils durch einen vorangestellten Backslash maskiert werden, sonst werden sie von AppleSkript missverstanden. (Beachte die Gänsefüsschen, die den gesamten Skripttext kapseln.)
Ausgeführt wird das ganze mit der Shell /bin/sh im Posix-Modus, einige Bash-Features stehen also nicht zur Verfügung (also genau so wie ein normales Shellskript, das mit dem Shebang '#!/bin/sh' eingeleitet wird.)
Das Shellskript wird von root ausgeführt, Arbeitsverzeichnis ist /
Textausgaben des Skripts werden an AppleSkript zurückgegeben und können dort in eine Variable eingelesen werden falls gewünscht.
Ein reales Skript könnte also folgendermassen aussehen:
Code:
property ausgabetext : string
try
    set ausgabetext to do shell script "
        [COLOR="DarkGreen"]echo Ein\\ doofer\\ Ordner:
        echo
        ls -1 \"/System/Library/User Template\"
        echo
        echo
        echo \"Noch einer:\"
        echo
        ls -1 \"/private/var/root\"[/COLOR]
    " with administrator privileges
    display dialog "Ausgabe ist:" & return & return & ausgabetext buttons "OK" with title "Skriptausgabe" with icon note default button 1 giving up after 10
end try
Eine ganz andere Methode wäre die Verwendung von /usr/libexec/authopen - aber das eignet sich nur zum Zugriff auf einzelne Dateien, um das in einem Skript sinnvoll verwenden zu können ist etwas weiterreichende Erfahrung nötig.
 
Zuletzt bearbeitet:
Jo, wenn sein Programm.app ein AppleScript ist ;-)
 
Äh das ist nicht dein ernst, oder? Ein Ordner namens Programm.app? Jedes Programm ist ein Ordner! Bist du sicher das du unbedingt selber programmieren willst? ... Was ich meinte ist, ist es in C, C++, Java, ... bzw. in welche Sprache programmierst du? Wie sieht der Code aus, wo das Script aufgerufen wird? Schau mal in die Apple Developer Dokus, dort wird sehr gut erklärt, wie man sowas lösst.
Ich bin zwar kein Apple Developer, aber ich weiss schon was ich tue. Die Notation mag jetzt nicht perfekt sein, aber ich denke das sagt schon welche Sprache ich verwenden werde: "Ich habe eine.app programmiert, die ein Shell-Skript ausführt."


...
Aufgemerkt: KEIN 'sudo' verwenden, diese Funktion übernimmt die entsprechende AppleSkript-Anweisung.
Doppelte Anführungszeichen und Backslashes innerhalb der Shellbefehle müssen jeweils durch einen vorangestellten Backslash maskiert werden, sonst werden sie von AppleSkript missverstanden. (Beachte die Gänsefüsschen, die den gesamten Skripttext kapseln.)
Ausgeführt wird das ganze mit der Shell /bin/sh im Posix-Modus, einige Bash-Features stehen also nicht zur Verfügung (also genau so wie ein normales Shellskript, das mit dem Shebang '#!/bin/sh' eingeleitet wird.) ...

Vielen Dank das ist genau das was ich gesucht habe. Ich hatte bei meinen Versuchen immer sudo verwendet und dadurch hat diese Methode nicht funktioniert.
Zum Test habe ich mit osacscript -e '' ein shellscript, in einem applescript, in einem shellscript ausgeführt und es hat soweit funktioniert. ;) Ich bin da etwas unerfahren, kann ich irgendwo definieren, dass mein Script ein AS ist? Mit dem Befehl osascript im shellscript will OS X Rosetta installieren.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleExecutable</key>
	<string>script</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0</string>
	<key>LSUIElement</key>
	<string>1</string>
</dict>
</plist>
 
Ich bin zwar kein Apple Developer, aber ich weiss schon was ich tue. Die Notation mag jetzt nicht perfekt sein, aber ich denke das sagt schon welche Sprache ich verwenden werde: "Ich habe eine.app programmiert, die ein Shell-Skript ausführt."
Also ist eine .app ein Shell-Skript? Man kann Java/Cocoa/AppleScript/...-Apps programmieren und dort können auch shell-skripte aufgerufen werden :-/ Wenn du nicht weiter erklären willst, dann eben nicht ... viel spaß weiterhin :p
 
Also ist eine .app ein Shell-Skript? Man kann Java/Cocoa/AppleScript/...-Apps programmieren und dort können auch shell-skripte aufgerufen werden :-/ Wenn du nicht weiter erklären willst, dann eben nicht ... viel spaß weiterhin :p

Wie gesagt, dass ist das was es macht. Ich bin kein Programmierer, sondern möchte nur ein Shell-Skript ausführen. Genaus das funktioniert mit meinem Programm.

Die Frage ist wie kann ich von Shell auf AS umschalten? Ich nehme an es ist ein Eintrag in der info.plist nötig.
 
Also ist eine .app ein Shell-Skript? Man kann Java/Cocoa/AppleScript/...-Apps programmieren und dort können auch shell-skripte aufgerufen werden :-/ Wenn du nicht weiter erklären willst, dann eben nicht ... viel spaß weiterhin :p

Öhhm, mir war schon beim ersten mal lesen klar was er gemacht hat. Ich weiß nicht was du hast, viell. hilft einfach nochmal seine Antwort durchlesen..

Die Frage ist wie kann ich von Shell auf AS umschalten? Ich nehme an es ist ein Eintrag in der info.plist nötig.

Soweit ich weiß kannst du das nicht direkt "umstellen".
Du kannst evt. als auszuführende Datei osascript nehmen und dann entsprechende Argumente anhängen (weiß allerdings im Moment nicht wie die Syntax in der plist ist). Oder du machst den osascript -e Aufruf halt in deinem in der plist angegebenen (Haupt)Script.
 
kann ich irgendwo definieren, dass mein Script ein AS ist?
Ohne lang auszuschweifen wie das zu handhaben ist: Du kannst ganz einfach direkt aus dem AppleSkript-Editor dein Projekt als fix und fertiges Programm-Bundle speichern. Bei Bedarf änderst du dann nur noch den Bundle-Identifier, Versionsnummern, das Programmicon usw und fügst ggf noch weitere Resourcen hinzu ..... na, eine korrekte "Info.plist" zusammenzudengeln dürfte dir ja im Grunde schon bekannt sein.
Kein Mensch wird dann mehr bemerken, dass da ein AS drinsteckt und kein Mach-O Binary. Eine ganze Menge von Mac-Apps wurden so gebaut, wenn auch die meisten nicht mit dem primitiven "Editor"-Zwerg, sondern mit der deutlich mächtigeren Luxus-Werkzeugkiste "AppleSkript Studio".
Programm-Bundles kannst du mit fast allem bauen was du an Interpretersprachen installiert hast: Bourneshell, OsaScript (aka AppleSkript), Perl, Python, Ruby, wenn du zB eine speziell konfigurierte (sicherheitsgelockerte) Ghostscript-Version verwendest kannst du sogar aus Postscript eine App basteln, genügend Leidensfähigkeit und Spieltrieb mal vorausgesetzt. :-)

Warum AS in manchen Situationen nach Rosetta schreit?
Weils mit ziemlicher Sicherheit irgendeine AS-Erweiterung ("Scripting Addition", ein sog. "OSAX") bei dir im System hat die noch aus PPC-Code ist. OSAscript ist zwar sehr "extensibel", aber leider nicht besonders intelligent, und performant schon gar nicht. Das ist im Grunde ein Interpreter in einem Interpreter, der in einem Interpreter einen Interpreter interpretiert, während er mit anderen Interpretern kommunizieren kann. Etwas übertrieben formuliert. :-)

Wie schon erwähnt, AS ist eine plumpe Wildsau und die Methode bietet sich deshalb nur für kleine eingebettete Skripten an.
V.a. auch weil hier die Resource-Limits für ein Shellskript sehr viel knapper bemessen sind als bei nativer Ausführung. Gegenüber der Shell im Kernel natürlich erst recht. Skripte dürfen nur ein paar kB lang sein und auch die max Länge von übergebenen Argumenten ist sehr viel kleiner als "normal", AFAIR sinds nur 16 kB statt der üblichen 256. Sei also etwas vorsichtig beim FileNameGlobbing etc., arbeite lieber mit find/xargs Konstrukten oder zB den etwas dämlichen "echo $x|while read; do..." Schleifen wenn du grössere Objektmengen oder Textmonster abarbeiten willst.

Und TESTE DEIN SKRIPT IMMER SEHR SORGFÄLTIG OHNE ADMINPRIVILEGIEN AUS bevor du den Modifier für die Privilegien ergänzt und ihn erstmals benutzt. Es ist SEHR GEFÄHRLICH ein Skript als root rennen zu lassen, das aufgrund solcher Textmengenbeschränkungen vollkommen unerwartet nur zur Hälfte an die Shell übergeben wird und dadurch verstümmelte, d.h. fehlerhafte Befehle enthält. WAS IM TERMINAL FEHLERFREI FUNKTIONIERT TUT ES HIER NICHT AUTOMATISCH AUCH!!!
Ich schreib das nur so fett weil ich es selber auch schon geschafft hab damit ganz "auf blöd" eine wahre Nemesis zu erleben. Ein Löschbefehl der eigentlich über "/Volumes/irgend/was/viel/zu/langes" laufen soillte hat es nur noch bis zum "/Volumes" geschafft, der Rest der Zeile und alles danach wurde abgeschnitten. Kannst du dir wohl denken was dann passiert ist... :-c :-c :-c :-c :angry:

Wenn du richtig "massive" Dinge bauen willst die in einem Interpreter laufen sollen und du brauchst Admin-Privilegien, solttest du dich tiefer einlesen in die Funktionsweise von "launchd", und in die ausführlichen Beschreibungen auf Apples Developersite zum Thema "Authentication, Authorization and Privileges".
Wenn du das alles schön befolgst wird es dir gelingen eine App zu basteln, bei der man nur genau ein einziges mal bei der ersten Inbetriebnahme nach der Installation ein Kennwort anzugeben hat, und danach nie wieder. Ich nehme mal an du kennst schon irgendwelche Programme die dich in dieser Situation darum bitten, eine "Sicherheitskomponente" aktivieren zu dürfen. Wunderschön gut gemachte Anschauungsbeispiele hierfür sind die Systemtools von Marcel Bresink (u.a. "TinkerTool System") oder die Editoren "TextWrangler" oder "BBEdit" von BareBones. Falls du also mal nach den Sternen greifst: Join this train, lass den Rest ohne dich losfahren.
 
Zuletzt bearbeitet:
Danke euch!

Gut zu wissen, dass es da Beschränkungen gibt. Bin zwar erst bei 5 kB, aber ich werde mir diese Grenze merken. Das Programm hab ich jetzt mit dem Apple-Script-Editor erstellt und es funktioniert bestens.

Ich hoffe der AS-Editor kennt seine Grenzen und würde es nicht zulassen ein zu grosses Script zu erstellen.

Gruss dawiinci
 
Ich hoffe der AS-Editor kennt seine Grenzen
Nein, tut er nicht. Die Grenzen kommen nämlich nicht vom Editor, sondern von der durch ihn aufgerufenen Funktion, von ganz woanders also.
Vielleicht ist das hier hülfreiche Lektüre für dich...? (Lies es oder ... Windows sei mit dir! :-) )
Nimm aber die dort genannten Zahlen nicht für voll - das galt bei Tiger noch, mit Leopard sind die Werte leider deutlich geschrumpft. Nicht alles wird besser wenns neuer wird... leider.
 
Alles klar, ich bin zwar noch "relativ" neu bei Apple, aber wieder zurück zu Windows kann ich mir nicht vorstellen. ;)

Overrunning the limit will cause do shell script to return an error of type 255. Most people who hit the limit are trying to feed inline data to their command. Consider writing the data to a file and reading it from there instead.

Danke nochmals.
 
Du kannst ein AS bspw so in ein shell script einbinden:

Code:
#!/bin/bash

osa_script_result="$(/usr/bin/osascript 2>/dev/null <<-AS_CONTENT
	set homeHFS to (path to home folder) as string
	tell app "finder" 
		activate
		display dialog homeHFS
	end
	return homeHFS
AS_CONTENT
)"


echo "HFS Pfad von $HOME: $osa_script_result"


Schlauer wäre es evtl. ein AS im ASeditor zu schreiben, dieses als App zu speichern und die Shell Skripte in Resources reinzulegen.

Folgender Screenshot sollte alles sagen:
attachment.php


Inhalt von test.sh:
Code:
#!/bin/bash

date +%F\ %T



Und das könnte dich auch interessieren.



Ich bin zwar kein Apple Developer, aber ich weiss schon was ich tue.
Dude, dann hättest du das nicht erfragen müssen... ^^
 

Anhänge

  • 2011-01-27_1245.png
    2011-01-27_1245.png
    75,3 KB · Aufrufe: 232
Du kannst ein AS bspw so in ein shell script einbinden:

Code:
#!/bin/bash

osa_script_result="$(/usr/bin/osascript 2>/dev/null <<-AS_CONTENT
	set homeHFS to (path to home folder) as string
	tell app "finder" 
		activate
		display dialog homeHFS
	end
	return homeHFS
AS_CONTENT
)"


echo "HFS Pfad von $HOME: $osa_script_result"


Schlauer wäre es evtl. ein AS im ASeditor zu schreiben, dieses als App zu speichern und die Shell Skripte in Resources reinzulegen.

...

Dude, dann hättest du das nicht erfragen müssen... ^^
In dem Zusammenhang sollte das heissen: Ich weiss schon was ich tun möchte. ;)

Danke für deinen Tipp.