ubuntuusers.de

Script mit Passwort starten

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Leubi

Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: Zähle...

Grüße,

Ich habe mir ein Script geschrieben das man nur mit einem Passwort starten kann.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
#ScriptName
ScriptN="test"
PWD=`head -n1 TEST.PWD | tail -n 1`
echo ""
read -p " Für Script start bitte Passwort eingeben : " A
if [ "$A" == "$(basename $0)" ];then
exit
fi
if [ "$A" == "$PWD" ];then
echo ""
echo " ...starte das Script *$ScriptN*"
echo ""
fi

Soweit geht es auch.

Das Passwort steht leider in der TEST.PWD in Klartext, wie müßte ich das Script ändern damit es z.B. in MD5 drinnen steht?

Bei der Passworteingabe sieht man leider das Passwort in Klartext, kann man das Script so ändern das man da nur ******* sieht?

Bei einer falschen eingabe wird das Scrip einfach beendet könnte mann da noch eine Info hinzugeben z.B. "Passwort leider falsch" diese Info sollte wenn möglich auch nur beim betätigen der Entetertase kommen.

Schon mal meinen Dank für eure Hilfe.

Lg

Leubi

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax!

unbuntuS12

Anmeldungsdatum:
2. Juni 2010

Beiträge: 1816

Hallo,

du unterliegst da einem fundamentalem Missverständnis. Wenn du ein Skript mit Passwort starten willst, dann muss das Skript eben im Klartext vorliegen. Punkt. Natürlich kannst du es bei jedem Aufruf hashen (wobei md5 die falsche Wahl wäre), aber um etwas zu hashen, muss es wiederum im Klartext vorliegen.

Bitte schildere mal deinen konkreten Anwendungsfall. Was ist das für ein Skript, was soll es tun? Davon abhängig können wir bessere Möglichkeiten empfehlen.

edit: Steht das Passwort nun in einer Datei? Daraus würde ich schließen, dass du das Passwort automatisiert übergeben willst. Oder willst du es interaktiv übergeben? Bitte erkläre wirklich mal, was du vorhast mit dem Skript.

Leubi

(Themenstarter)
Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: 36

Moin,

das Passwort würde in der Passwortdatei ja schon z.B. in MD5 Hash vorliegen.

Das Script selber soll nur verhindern das meine Kinder nicht einfach den Spieleserver starten können, also nix sicherheits relewantes, sondern nur eine kleine Sicherheit. Wenn Sie den Spieleserver starten möchten müssen sie eben fragen dann gebe ich das Passwort ein und er startet.

Dass das Passwort nicht mehr angezeigt wird habe ich jetzt mit stty -echo gelöst, jetzt sieh man garnix bei der eingabe.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash
#ScriptName
ScriptN="test"
PWD=`head -n1 /TEST.PWD | tail -n 1`
echo ""
stty -echo
echo " Für Script start bitte Passwort eingeben : "
read -p "" A
if [ "$A" == "$(basename $0)" ];then
exit
fi
if [ "$A" == "$PWD" ];then
echo ""
echo " ...starte das Script *$ScriptN*"
echo ""
fi

Daher ist es auch ausreichend wenn es nur ein MD5 Hash ist.

Bei dem start von dem Script werde ich nach dem Passwort gefragt, dieses Passwort liegt schon in der Passwortdatei vor und wird praktisch mit der eingabe überprüft.

Bearbeitet von rklm:

Syntax

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@Leubi: $PWD ist eine Shell-Variable die bereits eine Bedeutung hat. Die sollte man nicht überschreiben.

Die Namen sind auch nicht besonders gut gewählt, selbst wenn man mal von der Kollision absieht. Soll der Kommentar #ScriptName dem Leser mitteilen, dass $SriptN für ScriptName steht? Dann nenn doch die Variable einfach $ScriptName, dann braucht man den Kommentar nicht. Genauso bei $PWD — das hiesse besser $password. Und bei $A kann der Leser dann ja richtig anfangen zu raten wofür das steht.

Immer daran denken das der ”fremde” Leser auch Du selbst bist — wenn Du in den Quelltext in einem Jahr wieder rein schaust und nicht mehr frisch im Gedächtnis hast was Du geschrieben hast.

Zur besseren Lesbarkeit trägt auch eine sinnvolle Einrückung bei, welche die Programmstruktur verdeutlicht.

Kannst Du mal erklären was der Sinn dieser head und tail-Kombination sein soll?

Wo kommt $A her? Und warum wird $REPLY nicht verwendet?

Leubi

(Themenstarter)
Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: 36

Moin, so Script geändert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
#ScriptName
ScriptName="test"
Passwortdatei=`head -n1 /TEST.PWD | tail -n 1`
echo ""
stty -echo
echo " Zum starten von dem Script *$ScriptName* bitte Passwort eingeben."
read -p " Passwort: " password
echo ""
if [ "$password" == "$(basename $0)" ];then
exit
fi
if [ "$password" == "$Passwortdatei" ];then
echo ""
echo " ...starte das Script *$ScriptName*"
echo ""
fi

War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir.

So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

Leubi schrieb:

so Script geändert.

Und immer noch keine Einrückung und Leerzeilen, die der Strukturierung helfen... Bedenke, dass die Maschine beliebige syntaktisch korrekte Programme ausführen kann, aber ein menschlicher Leser sich unterschiedlich schwer tut mit dem Verständnis.

War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir.

So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.

Ja, aber es ist total witzlos, denn der tail extrahiert die letzte Zeile einer sowieso einzeiligen Eingabe.

Wie andere bereits angemerkt haben: der ganze Ansatz ist fragwürdig. Wenn Du ein Skript hast, das eine Passwortabfrage enthält, dann ist es ein leichtes, dieses Skript zu kopieren, die Passwortabfrage zu entfernen und es dann auszuführen. In Deinem Fall ist es sogar noch einfacher, denn Du hast zwei Skripte: Du musst einfach nur das Skript in $ScriptName ausführen und musst nicht mal kopieren und editieren.

unbuntuS12

Anmeldungsdatum:
2. Juni 2010

Beiträge: 1816

Jetzt habe ich endlich verstanden, was du willst! Du willst das Passwort nicht aus der Datei auslesen und dann verwenden (auch das tun Leute häufig), sondern du willst es mit einem hinterlegten Passwort vergleichen!

So nett solche Fingerübungen sind: Erstelle eine neue Gruppe "gameserver", übereigne das Skript dieser Gruppe und verteile/entziehe das Execute-Bit nach Belieben.

Du müsstest ja auch in deinem Beispiel das Passwort jedes Mal ändern, wenn du wieder willst, dass deine Kinder den Server nicht starten können.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Die Ausgabe kannst du mit read -s unterdrücken.

$ read -s -p 'Passwort: ' password
Passwort: [keksgesicht] # wird nicht ausgegeben
$ echo $password
keksgesicht

Hashen kannst du es dann beliebig. Beispiel:

$ (printf "%s" keksgesicht ; head -c 512M /dev/zero) | sha1sum > password.sha1sum
$ cat password.sha1sum
51139d0fd97ed138fdc864fbcd23ec0fe5826400  -

Hash prüfen:

$ (printf "%s" "$password" ; head -c 512M /dev/zero) | sha1sum -c password.sha1sum 

# wenn $password = keksgesicht war
-: OK

# wenn $password = husteguzel anderes war
-: FAILED
sha1sum: WARNING: 1 computed checksum did NOT match

Das head -c 512M /dev/zero kann man weglassen, es dient dazu, den Hash langsamer zu machen. Das ist dann so ähnlich wie bei LUKS, eben mehr Rechenaufwand als Brute-Force-Schutz.

Was ggü. LUKS fehlt ist das zufällige Salz. Kann man natürlich auch noch machen, wird aber hier wohl wirklich keine Rolle spielen. 😉


Das Hauptproblem an der Idee ist eigentlich was anderes, nämlich: Was hindert irgendwen daran, das Script zu kopieren und dann einfach ohne Passwortabfrage auszuführen.

Das macht also nur in Verbindung mit einem anderen Schutzmechanismus Sinn, der dafür sorgt daß das Script nicht verändert und nicht anders ausgeführt werden kann, z.B. SSH-Key mit erzwungenem Befehl - und ein Script das so gestaltet ist, daß es keine Shell droppen kann.

Andererseits wärs in dem Fall auch egal, daß das Passwort im Klartext steht, denn lesen könnte das ja denn auch niemand.

Leubi

(Themenstarter)
Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: 36

Moin,

rklm schrieb:

Leubi schrieb:

so Script geändert.

Und immer noch keine Einrückung und Leerzeilen, die der Strukturierung helfen... Bedenke, dass die Maschine beliebige syntaktisch korrekte Programme ausführen kann, aber ein menschlicher Leser sich unterschiedlich schwer tut mit dem Verständnis.

War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir.

So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.

Ja, aber es ist total witzlos, denn der tail extrahiert die letzte Zeile einer sowieso einzeiligen Eingabe.

Wie andere bereits angemerkt haben: der ganze Ansatz ist fragwürdig. Wenn Du ein Skript hast, das eine Passwortabfrage enthält, dann ist es ein leichtes, dieses Skript zu kopieren, die Passwortabfrage zu entfernen und es dann auszuführen. In Deinem Fall ist es sogar noch einfacher, denn Du hast zwei Skripte: Du musst einfach nur das Skript in $ScriptName ausführen und musst nicht mal kopieren und editieren.

wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher.

https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/

unbuntuS12 schrieb:

Jetzt habe ich endlich verstanden, was du willst! Du willst das Passwort nicht aus der Datei auslesen und dann verwenden (auch das tun Leute häufig), sondern du willst es mit einem hinterlegten Passwort vergleichen!

Sorry, das ich das nicht gleich so geschildert hatte.

So nett solche Fingerübungen sind: Erstelle eine neue Gruppe "gameserver", übereigne das Skript dieser Gruppe und verteile/entziehe das Execute-Bit nach Belieben.

Das könnte ich machen.

Aber jetzt geht es mir einfach nur darum ob man es machen kann so wie ich mir das vorgestellt habe. Und wenn ja wie?

Du müsstest ja auch in deinem Beispiel das Passwort jedes Mal ändern, wenn du wieder willst, dass deine Kinder den Server nicht starten können.

Da das Passwort bei der Eingabe nicht mehr angezeig wird, brauch ich es ja nicht so offt ändern, da ich es ja nur eingebe.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@Leubi: stty -echo sollte man nach der Eingabe auch wieder rückgängig machen, sonst flucht der Benutzer. ☺ Besser wäre es die -s-Option von read dafür zu verwenden.

Wenn der Backslash im Passwort vorkommt, hast Du ohne die -r-Option von read ein Problem.

„Whitespace“-Zeichen können auch problematisch sein, denn read betreibt „word splitting“ und entfernt „whitespace“-Zeichen am Anfang und am Ende der Eingabe. Es sei denn man setzt $IFS auf die leere Zeichenkette.

Bei dem basename-Aufruf ist es sicherer das Argument in doppelte Anführungszeichen einzufassen, sonst gibt es Probleme wenn das Skript in einem Pfad liegt der beispielsweise Leerzeichen enthält oder selbst Leerzeichen im Dateinamen hat.

Man könnte das statt mit if mit && etwas kürzer formulieren.

Ungetestet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

readonly script_name=test
readonly password_file=/TEST.PWD
echo
echo 'Für Scriptstart bitte Passwort eingeben: '
IFS='' read -r -s answer
[ "$answer" = "$(basename "$0")" ] && exit
if [ "$(head -n1 "$password_file")" = "$(echo "$answer" | md5sum)" ]; then
    echo
    echo " ...starte das Script *$script_name*"
    echo
fi

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Leubi schrieb:

wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher.

https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/

Eine Google Suche später und du hast das Originalscript wieder. ( z.B. https://stackoverflow.com/a/3408731/2876682 )

Gibts auch als fertiges Script (unshc)

Leubi

(Themenstarter)
Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: 36

frostschutz schrieb:

Leubi schrieb:

wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher.

https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/

Eine Google Suche später und du hast das Originalscript wieder. ( z.B. https://stackoverflow.com/a/3408731/2876682 )

Gibts auch als fertiges Script (unshc)

😊

Meine Kinder sind 9 und 11, ich will ja nicht das Internet löschen 🤣 jetzt geht es mir einfach um die Machbarkeit...

Leubi

(Themenstarter)
Avatar von Leubi

Anmeldungsdatum:
23. April 2017

Beiträge: 36

Marc_BlackJack_Rintsch schrieb:

Ungetestet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

readonly script_name=test
readonly password_file=/TEST.PWD
echo
echo 'Für Scriptstart bitte Passwort eingeben: '
IFS='' read -r -s answer
[ "$answer" = "$(basename "$0")" ] && exit
if [ "$(head -n1 "$password_file")" = "$(echo "$answer" | md5sum)" ]; then
    echo
    echo " ...starte das Script *$script_name*"
    echo
fi

Ich habe es getestet und es geht leider so nicht, wenn ich das Passwort eingebe wird das Script denoch beendet.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Nimm einfach den Exit-Code, ungefähr so:

frage_passwort() {
    read -s -p 'Passwort: ' password
}

pruefe_passwort() {
    echo "$password" | md5sum -c password.md5sum &> /dev/null
}

while ! pruefe_passwort
do
    frage_passwort
done

Wie man die Hash Datei anlegt hab ich weiter oben geschrieben... dort mit sha1sum, hier wäre es

echo "holla die waldfee" | md5sum > password.md5sum

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@Leubi: Was steht denn in /TEST.PWD? Da muss der Hash drinstehen, und nicht das Passwort selbst.

Antworten |