Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

[solved] Skript -- Problem bei der Ausgabe

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

[solved] Skript -- Problem bei der Ausgabe

Beitrag von geist_der_foren »

Hi @all,

ich hab folgendes kleine Skript:

Code: Alles auswählen

GROUP_PFAD=/etc/group
i=700

for USER in `awk -F: '{print $1}' /etc/passwd`
 do
   GROUP=`grep $USER $GROUP_PFAD | awk -F: '$3>=100 {print $1}'`
   echo "groupadd -g $i $GROUP"
   i=`expr $i + 1`
 done
Wie man sehen kann, holt sich das Skript die user aus der /etc/passwd und gibt mir dann die grouppen aus, in denen sich einer mindest einer dieser user befindet.
Dann generiert er mir ein groupadd befehl.
Jetzt habe ich 2 Probleme.

1. Er gibt mir ein paar Gruppen aus, in denen keine User sind (siehe unten)

2. Es kommt folgende ausgabe:

Code: Alles auswählen

groupadd -g 700
groupadd -g 701
groupadd -g 702
groupadd -g 703
groupadd -g 704
groupadd -g 705
groupadd -g 706
groupadd -g 707
groupadd -g 708
groupadd -g 709
groupadd -g 710
groupadd -g 711
groupadd -g 712
groupadd -g 713 nobody ---> Hier sind keine USER drin 
nogroup ------------------------> Warum bring er das auch raus ?
groupadd -g 714
groupadd -g 715
groupadd -g 716
groupadd -g 717
groupadd -g 718
groupadd -g 719 radiusd  ---> Hier sind keine USER drin 
groupadd -g 720
groupadd -g 721 privoxy  ---> Hier sind keine USER drin 
groupadd -g 722
groupadd -g 723
groupadd -g 724 grouptest
An sich sollte er mir nur folgendes ausgeben:

Code: Alles auswählen

groupadd -g 700 grouptest
Den grouptest ist die einzigste gruppe die einen User auf der passwd hat und deren gID größer 100 ist.

Kann mir jemand weiter helfen ? Blick das nicht so ganz
genius667

Beitrag von genius667 »

Wegen der for Schleife macht er dir die Ausgabe für jeden User, so wie du das willst, musst du noch prüfen, ob $GROUP leer is, das geschiet mit einem if statement.

ich hab das folgendermaßen gelöst:

Code: Alles auswählen

GROUP_PFAD=/etc/group
i=700

for USER in `awk -F: '{print $1}' /etc/passwd`
 do
   GROUP=`grep $USER $GROUP_PFAD | awk -F: '$3>=100 {print $1}'`
   if [ $GROUP ]
   then
   echo "groupadd -g $i $GROUP"
   fi
   i=`expr $i + 1`
 done
Damit prüft er, ob $GROUP gesetzt ist und nur dann gibt er das echo zurück.

mfg

Andy

PS: ich hasse bash Programmierung, also keine Gewähr g
poiin2000
Member
Member
Beiträge: 55
Registriert: 29. Jan 2004, 17:04
Wohnort: Pforzheim
Kontaktdaten:

Beitrag von poiin2000 »

Code: Alles auswählen

poiin2000@server:~> cat gruppe.sh
#!/bin/bash
GROUP_PFAD=/etc/group
i=700

for USER in `awk -F: '$4 !~ (/^$/) && $0 !~ (/nobody/){print $1}' /etc/passwd`
 do
   GROUP=`grep $USER $GROUP_PFAD | awk -F: '$3>=100 {print $1}'`
   if  [ "$GROUP" != "" ]
   then
   echo "groupadd -g $i $GROUP"
   fi
   i=`expr $i + 1`
 done


poiin2000@server:~>
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

Hi,

danke für die hilfe ... das hat mich schon ziemlich weit gebracht, ich hab das ein bisschen geändert

Code: Alles auswählen

GROUP_PFAD=/etc/group
i=700

for USER in `awk -F: '{print $1}' /etc/passwd`
 do
   GROUP=`grep $USER $GROUP_PFAD | awk -F: '$3>=100 {print $1}'`
   if [[ $GROUP ]]
    then
     echo "groupadd -g $i $GROUP"
     i=`expr $i + 1`
   fi
 done
Aber das funkt immer noch nicht so wirklich ? Er bringt mir folgende Ausgabe:

Code: Alles auswählen

groupadd -g 718 radiusd --> keine USER in der Gruppe
groupadd -g 720 privoxy --> keine USER in der Gruppe
groupadd -g 767 grouptest --> keine USER in der Gruppe
test2 --> in dieser Gruppe ist ein user aus der Passwd, aber es wird kein 
           groupaddbefehl geneiert ?
Die /etc/group sieht folgendermasen aus:

Code: Alles auswählen

root:x:0:
bin:x:1:daemon
daemon:x:2:
sys:x:3:
tty:x:5:
disk:x:6:
lp:x:7:
www:x:8:
kmem:x:9:
wheel:x:10:
mail:x:12:
news:x:13:
uucp:x:14:sag10c0, grouptest_user
shadow:x:15:
floppy:x:19:
cdrom:x:20:
console:x:21:
utmp:x:22:
at:x:25:
public:x:32:
video:x:33:sag10c0
games:x:40:
xok:x:41:
trusted:x:42:
modem:x:43:
ftp:x:49:
man:x:62:
sshd:x:65:
nobody:x:65533:
nogroup:x:65534:
users:x:100:
postfix:x:51:
maildrop:x:59:
ntadmin:x:71:
ldap:x:70:
named:x:44:
radiusd:x:101:
privoxy:x:102:
mailman:x:67:
localham:x:56:
grouptest:x:600:grouptest_user
test:x:1000:
test2:x:1001:grouptest_user
Wie gesagt, eigentlich sollte er mir jetzt nur folgendes ausgeben

Code: Alles auswählen

groupadd -g 700 grouptest


@poiin2000
Kannst du mir mal bitte diese Zeile näher erklären, ich hab das nicht so ganz verstanden:

Code: Alles auswählen

awk -F: '$4 !~ (/^$/) && $0 !~ (/nobody/){print $1}' /etc/passwd
genius667

Beitrag von genius667 »

Code: Alles auswählen

grep $USER $GROUP_PFAD
is das Problem, wenn ein User nur in einer Gruppe is, funktioniert das wie es soll, aber sobald ein User in mehreren Gruppen is, liefert ja grep mehrere Zeilen zurück, awk bearbeitet aber nur die erste Zeile und die anderen werden unbearbeitet zurückgegeben.

Code: Alles auswählen

GROUP_PFAD=./group
i=700

for USER in `awk -F: '{print $1}' /etc/passwd`
 do
   for USERB in `grep :$USER $GROUP_PFAD`
    do
     GROUP=`echo $USERB | awk -F: '$3>=100 {print $1}'`
     if [[ $GROUP ]]
     then
      echo "groupadd -g $i $GROUP"
      i=`expr $i + 1`
     fi
    done
 done
sollte zumindest dieses Prob lösen :) und der : vor $USER auch dein Prob, dass in manchen Gruppen keine User drin sind, diese aber dennoch bei deinem Script auftauchen. Das Prob is halt, dass es user gibt und nochmal ne Gruppe mit dem selben Namen.

mfg

Andy
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

Es funkt ... Danke .... :D

Was ich nicht ganz versanden habe, was :$USER heisen soll ?

EDIT:
Jetzt Blick ich das mit dem :$USER und was mache ich wenn ich aber mehere user habe, dann funkt das skript nicht mehr, oder :?:
genius667

Beitrag von genius667 »

doch, er added dann sogar nur einmal die Gruppe, nämlich bei dem ersten user, der bei der gruppe steht, also einen : davor hat, beim zweiten nicht mehr, was ja der Sinn ist, oder?

mfg

Andy
genius667

Beitrag von genius667 »

Es ist auch immer Sinnvoll am Anfang bei solchen Fragen, kurz zu erläutern, was du überhaupt genau mit dem Script machen willst usw, das erleichtert die Hilfe :)

mfg

Andy
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

Ja du hast recht Der soll ja die Gruppe nur einmal anlegen. Hab das ein bisschen verpeil, sorry

Ich möchte es noch weiter ausbauen, und zwar, dass er als nächstes Schritt auch noch die user, der jeweiligen gruppen rauspickt und dann mit gpasswd -a USERNAME die user anlegt... Muss ich aber noch austesten ...

Aber danke noch mals für den genialen CODE ... :D

EDIT:

Am Schluss möchte ich eine kleines skript haben, der mir die Gruppen ab ID 100 raus holt und ein groupadd befehl generiert und dann auch noch die User zu den zugehörigen Gruppen rauspick und dann ein gpasswd -a Username GRUPPE generiert...
poiin2000
Member
Member
Beiträge: 55
Registriert: 29. Jan 2004, 17:04
Wohnort: Pforzheim
Kontaktdaten:

Beitrag von poiin2000 »

geist_der_foren hat geschrieben: Kannst du mir mal bitte diese Zeile näher erklären, ich hab das nicht so ganz verstanden:

Code: Alles auswählen

awk -F: '$4 !~ (/^$/) && $0 !~ (/nobody/){print $1}' /etc/passwd
awk ist folgermassen aufgebaut

awk '/SUCHE/{ausführen ...}'

Ist Feld 4 $4 ungleich !~ ^$ und ist Feld $0 ungleich !~ nobody dann gehe weiter zu print $1

^ = Anfang der Zeile
$ = Ende der Zeile
^$ = Nichts ... kein Inhalt


mfg p2k
genius667

Beitrag von genius667 »

Dann scripte mal schön :)

Ich hab mich mit bash Programmierung noch nie so richtig beschäftigt, ich mag lieber Scriptsprachen mit C Syntax :)

mfg

Andy
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

genius667 hat geschrieben:Dann scripte mal schön :)

Ich hab mich mit bash Programmierung noch nie so richtig beschäftigt, ich mag lieber Scriptsprachen mit C Syntax :)

mfg

Andy
Achso z.B. cshell oder tcshell ? So weit ich weiß kann die bash das alles ... aber das ist denke ich geschmack sache...
Ich danke dir Trotzdem für die Hilfe und auch allen anderen ...

@poiin2000
Jetzt verstehe ich ... THX
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

Hallo noch mal, gestern habe ich ja noch folgendes geschrieben:
geist_der_foren hat geschrieben:Am Schluss möchte ich eine kleines skript haben, der mir die Gruppen ab ID 100 raus holt und ein groupadd befehl generiert und dann auch noch die User zu den zugehörigen Gruppen rauspick und dann ein gpasswd -a Username GRUPPE generiert...
Ich hab das jetzt erweitert und möchte es einfach mal posten, vielleicht kann das jemand mal gebrauchen.
Danke noch mal an allen beteiligten für die hilfe bedanken!

Erläuterung:
Diese Kleine Skrpript, holt sich die gruppen (ab GID 100) und die dazugehörigen user raus und generiert ein groupadd und gpasswdbefehl.

Layout:

Code: Alles auswählen

groupadd -g 700 testgruppe2
gpasswd -a sag10c0
groupadd -g 701 grouptest
gpasswd -a grouptest_user ssh_copy_user1 ssh_copy_user2 ssh_copy_user4 ssh_copy_user3
groupadd -g 702 test2
gpasswd -a grouptest_user
SKRIPT

Code: Alles auswählen

#!/bin/bash

GROUP_PFAD=/etc/group
i=700

for USER in `awk -F: '{print $1}' /etc/passwd`
 do
   for USERB in `grep :$USER $GROUP_PFAD`
    do
     GROUP=`echo $USERB | awk -F: '$3>=100 {print $1}'`
     GROUP_USER=`echo $USERB | awk -F: '$3>=100 {print $4}' | sed 's/,/ /g'`
     if [[ $GROUP && $GROUP_USER ]]
     then
      echo "groupadd -g $i $GROUP"
      echo "gpasswd -a $GROUP_USER"
      i=`expr $i + 1`
     fi
    done
 done
poiin2000
Member
Member
Beiträge: 55
Registriert: 29. Jan 2004, 17:04
Wohnort: Pforzheim
Kontaktdaten:

Beitrag von poiin2000 »

Ich würde mich persönlich freuen wenn du das Script genauer Beschreiben würdest.

Was genau es machen soll hast du schon erklärt.

Aber wo liegt der Nutzen?

p2k
geist_der_foren
Newbie
Newbie
Beiträge: 39
Registriert: 15. Dez 2003, 11:44

Beitrag von geist_der_foren »

poiin2000 hat geschrieben:Ich würde mich persönlich freuen wenn du das Script genauer Beschreiben würdest.

Was genau es machen soll hast du schon erklärt.

Aber wo liegt der Nutzen?

p2k


Also wir haben öfters den fall, dass wird HP-UX Maschinen auf SuSE Maschinen migriren müssen. Die User und die Gruppen, müssen auch übernommen werden. Bisher habe ich das immer händisch gemacht, biss ich dann ein Skript geschrieben habe, der mir die User auf des Passwd mit Passwort, Kommentar u.s.w. raus holt und mir ein useradd generiert. Jetzt ist mir dann auch eingefallen, dass die gruppen übernohmen werden müssen, bis her waren es auch nur 3 oder 4 Gruppen mit ein paar Usersen, aber dem nächst soll etwas größeres kommen und da machst sich so ein skript ganz nützlich. Ich hoffe ich hab es verständlich erklärt, falls noch Fragen sind einfach bescheid sagen
Antworten