useradd: unable to lock password file

weor

weor

Mitglied
hallo!
ich hab folgendes problem und wäre für jede hilfe dankbar
wie die überschrift schon sagt erhalte ich diese fehlermeldung wenn ich versuche über ein script einen user anzulegen

Code:
useradd: unable to lock password file
das script zum anlegen sieht so aus...

Code:
#!/bin/bash

#set -x

read line

AUTH=`echo $line | cut -d: -f1`
USR1=`echo $line | cut -d: -f2`
PASS=`echo $line | cut -d: -f3`
USR=`echo "$USR1" | tr -d ' =_$&][}{><▒▒▒▒▒▒\-%' | tr [A-Z] [a-z]`

if [ "$AUTH" != "password" ];

    then
    echo " Passwort Falsch! Vorgang wird abgebrochen"

elif [ "$USR" == "" ];

    then
    echo " kein Benutzername angegeben"

elif [ "$PASS" == "" ];

    then
    echo " kein Passwort angegeben"

elif [ "$USR" == "root" ];

    then
    echo " Was soll das??? root ist verboten und du darfst nicht alles"

elif [ "$USR" == "admin" ];  # name hauptbenutzer aendern

    then
    echo " Was soll das??? Du darfst nicht alles"

elif [ "$USR" == "`cat /etc/passwd | cut -d: -f1 | grep "$USR"`" ];

    then
    echo " Benutzer ist schon vorhanden"

    else
    useradd -G ftpuser -m -d /var/www/"$USR" -s /bin/false "$USR"
    echo "$USR":"$PASS" | chpasswd
    echo "$USR":"$PASS" >>/home/admin/list_ftp
fi

die ausgabe von useradd -D
Code:
GROUP=100
HOME=/var/www/
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

dazu muss ich sagen das dieses script über einen port angesprochen wird
also über eine webseite... mit fsockopen

eintrag in inetd.conf
Code:
addftp          stream  tcp     nowait  root    /usr/sbin/tcpd  /home/admin/./addftp

ok das wars erst mal zu den informationen...

kann mir jemand sagen woran das liegen könnte das diese meldung kommt wenn ich das script nutze aber nicht wenn ich den befehl einfach so eingebe?

besten dank
 
Ich würde mal stark vermuten, daß es an fehlenden Rechten liegt.
Wahrscheinlich wird das Script nicht als User root ausgeführt.

Bau doch einen kleinen Test in dein Script ein und lass in einem für alle schreibbaren Ordner ein File erstellen und dann prüfe dort Owner, Group und Perms.
 
Das Skript muss als root laufen oder mit sudo aufgerufen werden. Der Webserver wird ja wahrscheinlich (oder besser gesagt hoffentlich) nicht als root laufen.
 
ok, hab das ganze nochmal überprüft...
scheint wirklich ein problem mit den rechten zu sein...

aber jetzt stellt sich mir die frage warum...

das script wird ja nicht normal aufgerufen sondern als daemon ...
der eintrag in die /etc/services
Code:
addftp          9222/tcp                        # anlegen
das einzige wo jetzt der fehler liegen könnte wäre der eintrag in die
/etc/inetd.conf
der sieht jetzt so aus
Code:
addftp          stream  tcp     nowait  root    /usr/sbin/tcpd  /root/./addftp

um genauer zu werden was da eigentlich passiert...
das php-script auf der seite sendet 3 daten an den port 9222 auf dem rechner localhost

1. ein passwort welches der user eingeben und welches im script abgeglichen wird variable AUTH
2. den benutzernamen der in variable USR1
3. das passwort welches der anzulegende benutzer bekommt variable 3

verbindung mit telnet zu dem port geht auch...

ps: dateirechte des scritps
Code:
-rwx------  1 root root 1062 2006-07-28 16:57 addftp

vergessen... die meldung kommt nicht mehr... das script scheint durchzulaufen ohne wirklich was zu tun

im anhang ist die index.php als zip
 

Anhänge

  • index.zip
    1,5 KB · Aufrufe: 2
Zuletzt bearbeitet:
Du laesst ein Programm auf einem Server per inetd als root laufen? Hast du schonmal das Wort "Sicherheit" gehoert? Kein ueber das Netzwerk erreichbarer Daemon sollte als root laufen und erst recht nicht ueber inetd. Packe dir ein kleines PHP-Skript auf einen Webserver, sichere es durch eine htaccess- und eine htpasswd-Datei und starte das Skript aus PHP mit 'exec("sudo meinskript.sh")' (Webserver muss natuerlich fuer das Skript und die im Skript verwendeten Programme sudo-Rechte haben). Selbst das ist noch sicherer als irgendwas als root ueber inetd laufen zu lassen.
 
theton schrieb:
Du laesst ein Programm auf einem Server per inetd als root laufen? Hast du schonmal das Wort "Sicherheit" gehoert? Kein ueber das Netzwerk erreichbarer Daemon sollte als root laufen und erst recht nicht ueber inetd. Packe dir ein kleines PHP-Skript auf einen Webserver, sichere es durch eine htaccess- und eine htpasswd-Datei und starte das Skript aus PHP mit 'exec("sudo meinskript.sh")' (Webserver muss natuerlich fuer das Skript und die im Skript verwendeten Programme sudo-Rechte haben). Selbst das ist noch sicherer als irgendwas als root ueber inetd laufen zu lassen.
ja, lasse ich so laufen wie du gesagt hast..

/ironie an/ ja, von sicherheit hab ich schon gehört... soll ja auch verdammt wichtig sein.../ironie aus/

der server steht in einem netzwerk was KEINE verbindung nach draußen hat und ist allein für solche experimente gedacht...
also ist es erst mal halb so wild das er nicht so sicher ist.

aber zum schluss das wichtigste... es läuft jetzt alles so wie es soll...
hab die inetd.conf nochmal neu geladen, inetd neu gestartet und es ging immer noch nicht... aber!! nach nem neustart... who knows...

also danke für die hilfe...
 
weor schrieb:
der server steht in einem netzwerk was KEINE verbindung nach draußen hat und ist allein für solche experimente gedacht...
also ist es erst mal halb so wild das er nicht so sicher ist.
Ok, dann ist das was anderes. In einem abgeschlossenen LAN kann man sowas natuerlich machen.
 
um das ganze jetzt mal zusammen zu fassen für den fall das das jemand mal braucht oder es weiter antwickeln will...
mir fallen da schon die verschiedensten dinge ein...
also hier die zusammenfassung...

das script zum anlegen von benutzern
addftp
Code:
#!/bin/bash

#set -x

read line

AUTH=`echo $line | cut -d: -f1`
USR1=`echo $line | cut -d: -f2`
PASS=`echo $line | cut -d: -f3`
USR=`echo "$USR1" | tr -d ' =_$&][}{><\-%' | tr [A-Z] [a-z]`

if [ "$AUTH" != "password" ];

    then
    echo " Passwort Falsch! Vorgang wird abgebrochen"

elif [ "$USR" == "" ];

    then
    echo " kein Benutzername angegeben"

elif [ "$PASS" == "" ];

    then
    echo " kein Passwort angegeben"

elif [ "$USR" == "root" ];

    then
    echo " Was soll das??? root ist verboten und du darfst nicht alles"

elif [ "$USR" == "mein benutzername" ];  # name hauptbenutzer aendern

    then
    echo " Was soll das??? Du darfst nicht alles"

elif [ "$USR" == "`cat /etc/passwd | cut -d: -f1 | grep "$USR"`" ];

    then
    echo " Benutzer ist schon vorhanden"

    else
    useradd -G ftpuser -m -d /home/ftp/"$USR" -s /bin/false "$USR"
    echo "$USR":"$PASS" | chpasswd
    echo "$USR":"$PASS" >>/root/list_ftp
fi
das script zum userlöschen...
delftp
Code:
#!/bin/bash

#set -x

read line

AUTH=`echo $line | cut -d: -f1`
USR1=`echo $line | cut -d: -f2`
USR=`echo "$USR1" | tr -d ' =_$%&][}{><\-!' | tr [A-Z] [a-z]`
PAS=`echo $line | cut -d: -f3`
ALL=`echo ""$USR":"$PAS""`

if [ "$AUTH" != "password" ];

    then
    echo " Passwort falsch! Vorgang wird abgebrochen"

elif [ "$USR" == "" ];

    then
    echo " kein Benutzername angegeben"

elif [ "$USR" == "root" ];

    then
    echo " Was soll das??? root ist verboten"

elif [ "$USR" == "mein benutzername" ];

    then
    echo " Was soll das??? Benutzer andre ist verboten"  # in hauptbenutzernamen aendern

elif [ "$ALL" == "`cat /root/list_ftp | grep "$ALL"`" ];

    then
    userdel "$USR"
    rm -r -f /home/ftp/"$USR"
    `sed -i -e "/$ALL/d" /root/list_ftp`
    echo " Beutzer "$USR" geloescht"

    else
    echo " Benutzer "$USR" nicht vorhanden "

fi

dann eine datei erzeugen mit dem namen list_ftp

addftp und delftp in inetd.conf eintragen...
Code:
addftp          stream  tcp     nowait  root    /usr/sbin/tcpd  /root/./addftp
delftp          stream  tcp     nowait  root    /usr/sbin/tcpd  /root/./delftp

eintrag in /etc/services
Code:
addftp          9222/tcp                        # anlegen
delftp          9223/tcp                        # loeschen

proftpd installieren
gruppe ftpuser anlegen
eintrag in proftpd.conf
Code:
User                            ftp
Group                           ftpuser
<Global>
defaultroot ~ ftpuser
</Global>
telnet installieren

index.php siehe anderes posting...

so, kann zu anregungen und diskussionen dienen...
weil für verbesserungen bin ich immer zu haben und so weiter

ps: und wer fehler findet sollte diese posten...
ach, und was ich nicht will ist ne grundsatzdiskusion
 
Ich wuerde den Spass ja wenigstens noch mit einem Login versehen, denn so ist es ja nur in einem LAN einsetzbar und dort hat man ja die Rechner eh meist vor Ort, so dass ein Skript in diesem Umfeld wenig Sinn macht. Dann kann man ja gleich zum entsprechenden Rechner gehen und die User anlegen.
 
ja... ist ja auch so gedacht...
nur war ich zu faul beim testen jedes mal das passwort einzugeben
welches mit der variablen $AUTH übergeben und am anfang das scripts verglichen wird...
zu meiner schande muss ich eingestehen das ich das feld welches für die übergabe der variablen zuständig ist (in der index.php) nicht erstellt hab, ich had das passwort gleich ins script geschrieben...
gut, das muss ich noch ändern...

um zu dem rechner zu gehen bin ich zu faul... :D
gut, man könnte die datei noch in die htaccess verschieben...
je nach dem wie sicher man das im netzwerk braucht...
 
Wenn man es sicher im Netzwerk braucht, nimmt man kein inetd. Da wird deine Loesung nicht wirklich weiter helfen. So sind z.B. keine Ueberpruefungen der String-Laengen drin u.ae., was die Sache natuerlich sehr DOS-anfaellig macht. Und inetd gilt allgemein nicht unbedingt als sicher.
 
Ich verwende folgenden Code zum Erstellen von Lehrern


Code:
#!/bin/bash

function lehreradd()
{
clear;										
echo "Bereits vorhandene Lehrer:"
echo;
echo `ls /home/Lehrer`
echo;
echo "Bitte zum Abbruch 'e' (end) eingeben!"
echo;
    u=									
    echo -e "Bitte den neuen Lehrer eingeben : \c   "				
    read u									
						
	if [ -z $u ]									
	then	
        $function lehreradd								
	    elif [ "$u" = "e" ]
    	    then
	    clear;
    	    $function ausgang    
fi

if [ -d /home/Lehrer/$u ]							
	then									
	echo "Ein Lehrer mit dem Namen '$u' existiert bereits! "		
	$funktion ausgang
	else
	    useradd -m -d /home/Lehrer/$u -s /bin/false -m -g lehrer -G schueler -c Lehrer $u
	    chmod +700 /home/Lehrer/$u
	    passwd $u
	    smbpasswd $u
	    clear;
		echo;
		echo "Der Lehrer $u wurde wurde angelegt!"
fi;
}

Das ist nur eine Auskopplung und muß entsprechend angepasst werden.
Des weiteren Administriere ich den gesammten Server mittels "Putty" und innerhalb eines LAN´s.

Ebenso ist eine Prüfung im Script nötig die es nur dem Root ermöglicht User anzulegen.
aber die ist ja schnell geschrieben....

Ich bitte nachzusehen, das für die "alten Hasen" dieser Code vielleicht zu umständlich ist.
Aber für meine Zwecke ist das voll ausreichend und erfüllt seine Funktion. :brav:

Gruß Lumpi
 
Lumpi30 schrieb:
Ebenso ist eine Prüfung im Script nötig die es nur dem Root ermöglicht User anzulegen.
aber die ist ja schnell geschrieben....
Nein ist es nicht, da useradd nur durch root genutzt werden kann und (normalerweise) auch nur root Schreibrechte fuer die /etc/passwd hat. Laeuft sowas allerdings als Daemon ueber inetd (was man nicht tun sollte), muss eine solche Pruefung (idealerweise ein richtiger Login) eingefuegt werden. Und dann kann man ja gleich SSH nutzen. *find*
 
theton schrieb:
Nein ist es nicht, da useradd nur durch root genutzt werden kann und (normalerweise) auch nur root Schreibrechte fuer die /etc/passwd hat.

Natürlich hast du recht, aber ich bin der Ansicht, das Script sollte mir schon anzeigen, was los ist. Ich bevorzuge ein "sauberes" Ende *GRINS*

Dazu muss ich noch erklären, dass das ganze Script auch beispielsweise die Verlinkung von den entsprechenden Klassensätzen auf die default-User der einzelnen Medienräume verwaltet.

Dieses darf auch durch ausgesuchte Lehrer mit Zugriffsrechten auf den Server geschehen.

Ich könnte zwar die ganzen Funktionen in einzelne Scripte splitten, aber bei der Menge von Passwörtern (78 PC´s, davon etliche mit wechselnden Passwörtern) und dann den Scripten brauche ich ein Kopf wie ein Pferd.
Aber soviele Haare habe ich dann nicht zur Verfügung. 8)

Gruß Lumpi
 
Nun, du sprachst lediglich von einer Ueberpruefung, die es nur root ermoeglicht User anzulegen und diese ist nunmal nicht notwendig.
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Shellskript - Fehler in Cron

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Samba 4.1.11 Domänen anbindung funktioniert nicht !!!

Zurück
Oben