• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Bash Script: Benutzerdaten überprüfen

matmonst

Newbie
Hallo @ all.
Wir schreiben zZ in PHP, mysql an einem Teil unserer Schulwebseite und wollen einen bereich, in dem nur Schüler, die sich mit korrekten Netzwerkusername/Netzwerkpasswort eingelogged haben. das ganz läuft auf artkur - c't Komm. Server für Schulen. Niemand von uns hat AHnung von Bash bzw Linux. Wir haben dieses Bashscript rausgekramt, welches das NW Passwort eines User ändert:
Code:
#!/bin/bash
#
# change.cgi
#
# Copyright (C) 1997 Andreas Furbach <zene@afu.ping.de>
# Anpassungen an V3.0 von Reiner Klaproth <klaproth@online.de>
# Neues Lock-Schema Klaus Werner < kwerner@ash.ks.he.schule.de>

passchange ()
{
 local SU_ID=SuSuSuSu
 local OK_ID=OkOkOkOk
 local LCK_ID=LCKLCK
 test -z "${FORM_newpass}" && return 2
 local RESULT="$(echo "${FORM_oldpass}" | /bin/su -s /bin/bash -l -c \
 "(echo "${SU_ID}"; \
      { echo "${FORM_oldpass}" | \
        sudo /usr/sbin/passchange ${FORM_newpass} > /dev/null ; \
      erg="\$\?" ; }; \
      if   [ "\$erg" -eq "0" ]; then echo "${OK_ID}" ; \
      elif [ "\$erg" -eq "3" ]; then echo "${LCK_ID}" ; \
      fi ) " \
 ${FORM_uid} )"
 test -n "$(echo "${RESULT}" | grep "${LCK_ID}")" && return 3
 test -n "$(echo "${RESULT}" | grep "${OK_ID}")" && return 0
 test -n "$(echo "${RESULT}" | grep "${SU_ID}")" && return 1
 return 2
}

read QUERY_STRING
export QUERY_STRING
eval `cgiparse -form` 

cgiutils -ct text/html -expires now

cat << xxxxxEOFxxxxx
<html>
<head>
<title>Passwort Abfrage</title>
</head>
<body background="whttxtr2.jpg">
<h1 align=center>Passwort ändern</h1>
<hr>
<h3 align=center><font color="#FF0000">Schließen Sie den Browser, bevor
Sie den Arbeitsplatz verlassen!</font></h3>
<hr>
<CENTER><H3>
xxxxxEOFxxxxx

if [ "${FORM_newpass}" = "${FORM_newpass1}" ]; then
	FEHLER=0
	# Stufe 1: Gibts den User?
	x=`grep "^${FORM_uid}:" /etc/passwd`
	if [ -z $x ]; then
		echo "<P><FONT COLOR=\"#800000\">Zugriff abgelehnt!</FONT><BR>"
		FEHLER=1
	    elif [ `echo $x | cut -d: -f3` -lt 1000 ]; then
		echo "<P><FONT COLOR=\"#800000\">Zugriff abgelehnt!</FONT><BR>"
		FEHLER=1
	fi
	# Zweite Stufe: Ist das Passwort brauchbar?
	lpass=${#FORM_newpass}
	if [ $lpass -lt 5 ]; then
	         echo "<P><FONT COLOR=\"#800000\">Das neue Passwort war zu kurz!</FONT><BR>"
		 FEHLER=1
	fi
	echo "${FORM_newpass}" | grep -q -v -E "[^A-Za-z0-9_-]"
	if [ $? != 0 ] ; then
		echo "<P><FONT COLOR=\"#800000\">Das neue Passwort enthielt ungültige Zeichen! </FONT><BR>"
		FEHLER=1
	fi
	# letzter Test: funzt das alte Passwort?
	echo "${FORM_oldpass}" | grep -q -v -E "[^A-Za-z0-9_-]"
	if [ $? != 0 -o ${#FORM_oldpass} -lt 3 ] ; then
	         echo "<P><FONT COLOR=\"#A00000\">Das alte Passwort war ungültig!</FONT><BR>"
		 FEHLER=1
	fi
	if [ $FEHLER = 0 ]; then
	       passchange  
	       RESULT="${?}"
	       if [ "${RESULT}" = "0" ]; then
	               echo "<P><FONT COLOR=\"#008000\">Passwort geändert!</FONT>"
        	 elif [ "${RESULT}" = "3" ]; then 
        	       echo "<P><FONT COLOR=\"#800000\">Interface-Anforderung in Bearbeitung</FONT><BR>"
		       FEHLER=1
	         else
	               echo "<P><FONT COLOR=\"#800000\">Zugriff abgelehnt!</FONT><BR>"
	               if test -s /tmp/passchange ; then
	                  cat /tmp/passchange
			  rm -f /tmp/passchange
	               fi 
	               FEHLER=1
	         fi
	     fi
	else
	     echo "<p>Sie haben sich bei der Eingabe des neuen Passworts vertippt!</p>"
	     FEHLER=1
fi

if [ $FEHLER = 1 ]; then
     echo "<p>Das Passwort wurde nicht geändert!</p>"
     echo "<p><a href=\"pass.htm\"><img src=\"redarrow.gif\" align=bottom border=0 width=25 height=13>Versuchen Sie es noch einmal! </a></p>"
fi

cat << xxxxxEOFxxxxx
</H3></CENTER>
<hr>
© Klaus Werner, Reiner Klaproth, 01.10.1999
</body>
</html>
xxxxxEOFxxxxx
es wäre wirklich eine rieseig Hilfe, wenn einer von Euch Linuxpros dieses Script so umschreiben könnte, dass es bei korrekten oldpass / username einfach nur true zurück gibt und bei falschem halt false.
VIelen Vielen, Seeeeeeehr Vielen Dank!!!!!!!
Natürlich ist es auch eine Hilfe wenn jemand sagen könnte falls es mit einem einzigen linux befehl möglich ist (hab aber beim googln nix gefunden) username / passwort zu überprüfen!
MfG
 

regexer

Advanced Hacker
matmonst schrieb:
Natürlich ist es auch eine Hilfe wenn jemand sagen könnte falls es mit einem einzigen linux befehl möglich ist
Du kannst es doch mit der selben Methode machen, wie sie in deinem geposteten script verwendet wird:
Code:
echo $passwort | su $user > /dev/null 2>&1
if [ $? = 0 ]
then
  echo erfolgreich
else
  echo nicht erfolgreich
fi
Die Umleitung nach /dev/null ist zu empfehlen, damit die Ausgaben von su nicht auf dem Bildschirm erscheinen. Die echos kannst du natürlich durch anderen Code ersetzen. Wenn du eine function schreiben willst, wäre vielleicht "return" angebracht.
 

oc2pus

Ultimate Guru
ich glaube nicht, das man mit echo ein Passwort an su übergeben kann....

evtl ist sudo hier die bessere Variante.
 

oc2pus

Ultimate Guru
notoxp schrieb:
oc2pus schrieb:
ich glaube nicht, das man mit echo ein Passwort an su übergeben kann....
Doch! Geht! Getestet unter SuSE 7 und 8.

ok, mein Test war verkehrt. Es klappte nicht weil ich im root Home-Verz stand und auf einen user "su-en" wollte ...


Ich habe so ein ähnliches Problem, aber noch keine Lösung dafür.

rpm -ba --sign xxx.spec fragt mein GPG-Mantra ab um ein rpm zu signieren. Und ich habe noch keine Möglichkeit gefunden das GPG-Mantra irgendwie per commandline zu übergeben... und es mürbt wenn man viele RPMs erstellt und signiert immer wieder sein Mantra einzutippen....
 

regexer

Advanced Hacker
oc2pus schrieb:
rpm -ba --sign xxx.spec fragt mein GPG-Mantra ab um ein rpm zu signieren. Und ich habe noch keine Möglichkeit gefunden das GPG-Mantra irgendwie per commandline zu übergeben... und es mürbt wenn man viele RPMs erstellt und signiert immer wieder sein Mantra einzutippen....
Hmmm. Habe jetzt auf die Schnelle auch keine Lösung gefunden. Manchmal ist man anscheinend auf verlorenem Posten. Es gibt anscheinend binaries die sich hartnäckig weigern, von der Standardeingabe zu lesen. Ein Problem von mir: Die Korn-Shell sowohl unter TRU64 als auch unter SCO UnixWare akzeptiert das folgende Kontrukt:
Code:
echo 1 2 3 | read a b c
echo $b
SuSE ignoriert den echo ganz einfach...
 
Oben