PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell für sehr viele Benutzer ändern



Cerox
06.08.06, 19:40
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.

delmonico
06.08.06, 19:45
sed s/'\(.*\):.*$'/'\1:\/bin\/foo'/ /etc/passwd > passwd.new
Wäre dann für ALLE user, weiss net ob du das willst?

Cerox
06.08.06, 21:35
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.

Ixot
06.08.06, 22:30
Wie wärs mit


for name in $(cat datei); do
# wasauchimmer
done

Flummi
06.08.06, 22:43
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.

Cerox
06.08.06, 23:05
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.

Flummi
06.08.06, 23:12
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).
;)

Cerox
07.08.06, 00:02
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.

Flummi
07.08.06, 00:16
#!/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:

Ixot
07.08.06, 09:54
Oder komplizierter:

grep -v ":/bin/false" passwd > neue_passwd

Cerox
07.08.06, 13:18
Danke für eure Hilfe - hab jetzt alle soweit gefiltert, so dass ich die Shells umstellen kann.

Flummi
07.08.06, 14:15
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