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

[solved] Skript -- Problem bei der Ausgabe

Hi @all,

ich hab folgendes kleine Skript:
Code:
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:
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:
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
 
A

Anonymous

Gast
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:
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
Code:
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:~>
 
Hi,

danke für die hilfe ... das hat mich schon ziemlich weit gebracht, ich hab das ein bisschen geändert
Code:
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:
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:
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:
groupadd -g 700 grouptest



@poiin2000
Kannst du mir mal bitte diese Zeile näher erklären, ich hab das nicht so ganz verstanden:
Code:
awk -F: '$4 !~ (/^$/) && $0 !~ (/nobody/){print $1}' /etc/passwd
 
A

Anonymous

Gast
Code:
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:
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
 
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 :?:
 
A

Anonymous

Gast
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
 
A

Anonymous

Gast
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
 
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
geist_der_foren schrieb:
Kannst du mir mal bitte diese Zeile näher erklären, ich hab das nicht so ganz verstanden:
Code:
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
 
A

Anonymous

Gast
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
 
genius667 schrieb:
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
 
Hallo noch mal, gestern habe ich ja noch folgendes geschrieben:
geist_der_foren schrieb:
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:
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:
#!/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
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
 
poiin2000 schrieb:
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
 
Oben