Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell für sehr viele Benutzer ändern
Hallo zusammen,
wie der Titel schon vermuten lässt, möchte ich die Shell für circa 3000 Benutzer ändern.
Eine Datei mit den Usernamen existiert nicht; daher muss ich diese wohl aus der passwd extrahieren.
Da ich mich mit der Bash-Programmierung kaum auskenne, hoffe ich hier einen kleinen Ansatz zu bekommen. Prinzipiell muss ich ja immer nur bis zum ersten Doppelpunkt auslesen um den Usernamen zu haben. Diesen könnte man dann ja mit einer for-Schleife auslesen und dann jedes mal per:
usermod -s shell $username
die Shell ändern.
sed s/'\(.*\):.*$'/'\1:\/bin\/foo'/ /etc/passwd > passwd.new
Wäre dann für ALLE user, weiss net ob du das willst?
Hi,
ich habe es so gelöst um mir alle Benutzer ausgeben zu lassen:
awk -F: '{print $1}' /etc/passwd >usernamen
Das ist für mich erstmal einfacher un erfüllt genauso seinen Zweck - trotzdem danke für die Mühe aber diese Zeichenverkettung mit sed verstehe ich noch nicht, um mir fehlt die Zeit, um mich da im Moment einzuarbeiten, da die Shellumstellung eine dringende Angelegenheit ist.
Wie dem auch sei: Nun habe ich alle Usernamen in der Datei usernamen drin stehen; ich werde dann manuell die paar User entfernen, die als Shell /bin/bash oder /bin/false bekommen sollen.
Was ich nun bräuchte ist eine for-Schleife die mir immer eine Zeile (ein Benutzer) in eine Variable liest, so dass ich dann per usermod die Shell ändern kann. Ich weiß, dass das eine einfache Anfängerfrage ist; bei Zeiten werde ich mich auch mal mit der bash-Programmierung bzw. dessen Grundlagen auseinander setzen.
Wie wärs mit
for name in $(cat datei); do
# wasauchimmer
done
Ungetestet, aber so sollt's gehen.
In der if-Abfrage die UID eingeben, bei der bei deinem System die User beginnen. Wenn du einen Raum zwischen UID X und Y erschließen willst, machst du halt 2 if-Abfragen (größer als X, kleiner als Y).
#!/bin/bash
for ZEILE in `cat /etc/passwd`; do
CUR_USER=`echo $ZEILE | cut -d: -f1`
CUR_UID=`echo $ZEILE | cut -d: -f3`
if [ $CUR_UID -ge 1000 ]; then
usermod -s "/deine/shell" $CUR_USER
fi
done
Edit: -ge = greater equals, -le = lower equals, falls du eben nur Zahlen zwischen X und Y haben willst.
Wunderbar; es funktioniert jetzt.
Danke euch beiden. Mit den Bereichen von UID kann ich leider nicht viel anfangen, da die passwd und die IDs etwas durcheinander sind.
Wunderbar; es funktioniert jetzt.
Danke euch beiden. Bitte, gerne.
Mit den Bereichen von UID kann ich leider nicht viel anfangen, da die passwd und die IDs etwas durcheinander sind.
Entweder halt mehere Bereiche eingrenzen, also größer a, kleiner b, und größer c, kleiner d oder
`man sort` falls wirklich nur die passwd durcheinander ist (was aber glaub ich gar nicht möglich ist und in dem Skript auch gar nicht von Relevanz ist).
;)
Ich kann es nicht nach IDs filtern, da Systembenutzer und normale User durcheinander stehen; d.h. mal wurde ein neuer Sytembenutzer für einen Dämon erstellt; dann kam ein User hinzu etc.
Mein Problem nun:
Ich möchte gerne den Inhalt der passwd in eine andere Datei umleiten und alle Userzeilen entfernen, die als Shell /bin/false eingetragen haben - sind doch einige und manuell dauert das zu lange.
#!/bin/bash #Interpreter-Shell
for ZEILE in `cat passwd`; do #Beginn der for-Schleife; speichert jede Zeile von passwd in die Variable ZEILE und macht dann der Reihe nach für jede Zeile folgendes
LALA=`echo $ZEILE | grep "/bin/false" | wc -l`; #wenn die Zeile das Wort "false" enhält, ist die ausgabe von echo genau 1 Zeile lang. wc (word count) zählt das und gibt also 1 aus. Der Wert kommt in die Variable LALA.
if [ $LALA -ne 1 ]; then # -ne heißt not-equals, also jede Zeile, in der nicht false vorkam
echo $ZEILE >> neue_passwd
fi
done
Solang kein User "/bin/false" heißt, ist sollte es funktionieren :D .
Es gibt bestimmt schönere Arten, zB könnte man gleich einen String-Vergleich machen, als zu sehen ob "false" vorkommt und dann daraus 0 oder 1 zu generieren, aber ich weiß nicht wie das geht und so helfe ich mir immer :ugly:
Oder komplizierter:
grep -v ":/bin/false" passwd > neue_passwd
Danke für eure Hilfe - hab jetzt alle soweit gefiltert, so dass ich die Shells umstellen kann.
Oder komplizierter:
grep -v ":/bin/false" passwd > neue_passwd
Rofl, danke Ixot. Manchmal ist es wohl doch besser, neu anzufangen zu denken, als Bestehendes umzumodeln. :D
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.