staging.inyokaproject.org

problem bei benutzereingabe

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

shokifrend77

Avatar von shokifrend77

Anmeldungsdatum:
1. Dezember 2017

Beiträge: 14

ich habe ein Skript gebaut:

 #/bin/sh
 while true
 do
   est=$(zenity --entry --text="passwort:1235" --title="passwort")
   [ $est == 1235 ] && break
 done
 set wen=$(zenity --entry --text="eingeloggt enter" --title="passwort")
 exit
 

nur der Operator fungzioniert nicht. was soll ich jetzt machen 💡 ?

frohe Weinachten noch , und schomal danke im voraus 👍 .

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Der Operator für String-Vergleiche in einer POSIX-kompatiblen Shell lautet „=“, nicht „==“. Nur die bash, die Du ja nicht verwendest, kennt „==“ als Synonym für „=“.

Die Variable est solltest Du quoten, damit leere Eingaben oder Eingaben mit Leerzeichen keine Fehler erzeugen:

…
[ "$est" = 1235 ] && break
…

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

Ausserdem könntest du die Variable est mit einem Wert ungleich 1235 initialisieren, und die Auswertung beim While-Schleifenkopf machen:

1
2
3
4
5
6
est=-1

while [ "$est" != 1235 ]
do
  est=$(zenity --entry --text="passwort:1235" --title="passwort")
done

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Über das set in der vorletzten Zeile sollte man auch mal nachdenken — das macht keinen Sinn und ist potentiell gefährlich wenn man da einfach Benutzereingaben weiter gibt.

Da der zenity-Dialog neben der Schaltfläche zum Bestätigen auch eine zum Abbrechen anbietet, könnte man das vielleicht auch auswerten und dem Benutzer damit die Möglichkeit zum Abbruch des Programms geben. Ich würde mich als Benutzer nämlich ein bisschen veralbert vorkommen wenn man immer wieder auf Abbrechen klickt, aber trotzdem der gleiche Dialog wieder und wieder angezeigt wird. 😉


Edit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh

while true; do
    if ! password=$(zenity --entry --text='passwort:1235' --title='passwort')
    then
        echo 'Abbruch durch Benutzer.'
        exit
    fi
    [ "$password" = '1235' ] && break
done
echo 'Und hier geht es nach der Passwortprüfung weiter.'

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

apt-ghetto schrieb:

Ausserdem könntest du die Variable est mit einem Wert ungleich 1235 initialisieren, und die Auswertung beim While-Schleifenkopf machen:

Das ist gar nicht nötig: Man kann die richtige Zuweisung gleich in den Schleifenkopf verlegen:

1
2
3
while est=$(zenity --entry --text="passwort:1235" --title="passwort"); [ "$est" -ne 1235 ]; do
  echo "..."
done

Ich habe außerdem den Integervergleich gewählt, da es sich um eine Zahl zu handeln scheint. Man kann auch gleich noch den Rückgabewert von zenity auswerten; damit erledigt man dann auch den Fall, dass der Nutzer "Escape" oder "Cancel" drückt:

1
2
3
while est=$(zenity --entry --text="passwort:1235" --title="passwort") && [ "$est" -ne 1235 ]; do
  echo "..."
done

Der Sinn der ganzen Konstruktion ist mir allerdings nicht klar. Wieso zeigt man das Passwort an?

Wenn es darum geht, den Benutzer so lange Passwörter angeben zu lassen, bis er entweder abbricht oder das richtige eingegeben hat, dann würde ich das wohl so machen:

1
2
3
4
5
6
while est=$(zenity --entry --text="passwort:1235" --title="passwort"); do
  [ "$est" -ne 1235 ] && exit
done

echo 'Abbruch'
exit 1

Dann kann man das mit anderen Skripten so kombinieren:

1
login.sh && befehl-bei-eingeloggt

Das ganze ist natürlich überhaupt nicht sicher. Zum einen, weil das Passwort sichtbar im Skript steht, zum anderen, weil es halt ein Skript ist, dessen Logik offen sichtbar ist (oder sogar geändert werden kann).

Was also ist das Ziel der ganzen Veranstaltung?

shokifrend77

(Themenstarter)
Avatar von shokifrend77

Anmeldungsdatum:
1. Dezember 2017

Beiträge: 14

danke,danke 👍 werde es mal ausprobieren

(zwei min. später:) so sieht es aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh

while true; do
    if ! password=$(zenity --entry --text='passwort:1235' --title='passwort')
    then
        exit
    fi
    [ "$password" = '1235' ] && break
    zenity --error --text="falsches passwort" --title="passwort"
done
zenity --info --text="eingellogt" --title="passwort"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

shokifrend77 schrieb:

so sieht es aus:

Wie gesagt, das ist total unsicher, weil das Passwort im Klartext in der Datei steht. Den "Login" kannst Du Dir komplett sparen. Du solltest wenigstens das Passwort hashen und dann die Hashes vergleichen. Also, erst den Hash berechnen:

1
2
$ echo password | openssl sha256
(stdin)= 6b3a55e0261b0304143f805a24924d0c1c44524821305f31d9277843b8a10f4e

Dann packst Du den ins Skript und vergleichst damit:

1
2
3
4
5
6
7
while true; do
  password=$( ... ) || exit
  [ "$(echo "$password" | openssl sha256)" = '(stdin)= 6b3a55e0261b0304143f805a24924d0c1c44524821305f31d9277843b8a10f4e' ] && break
  zenity --error --text="falsches passwort" --title="passwort"
done

zenity --info --text="angemeldet" --title="passwort"

Das Skript muss natürlich schreibgeschützt sein, damit nicht jemand den Hash oder die Logik ändern kann.

Man könnte sogar Zeilen 2 und 3 durch das ersetzen:

1
2
  zenity --entry --text='passwort:1235' --title='passwort' \
  | fgrep -qx '(stdin)= 6b3a55e0261b0304143f805a24924d0c1c44524821305f31d9277843b8a10f4e' && exit

shokifrend77

(Themenstarter)
Avatar von shokifrend77

Anmeldungsdatum:
1. Dezember 2017

Beiträge: 14

kann man nicht einfach die berechtigungen aendern?:
schriben:nimand
sehen:nimand
ausfuehren:jeder
ich gucke jede zwei minuten nach einer antwort 😲 !
danke schomal jetzt 👍 .

Antworten |