Sida 1 av 1

Shellscript med variabler istf inmatning [LÖST]

Postat: 09 sep 2008, 19:03
av Majo
Efter att ha lagt till drygt 100 användare på raken manuellt i Samba/Ubuntu Server har jag nu insett att det krävs bättre metoder om man ska stå ut. Därför har jag försökt mig på att scripta stegen och hämtar alla användaruppgifter från en textfil. Nu har jag stött på några problem. Scriptet ser ut så här:

Kod: Markera allt

#!/bin/bash
#
NEWUSERS="/home/anv.txt"
cat ${NEWUSERS} | \
while read FULLNAME USER GROUPS PASS ; do
	useradd -c ${FULLNAME} -g 1001 -G ${GROUPS} -m -d /home/users/${USER} -p ${PASS} ${USER}
	smbpasswd -a ${USER} -p ${PASS}
	chmod 700 /home/users/${USER}
done 

Problem:
1) Användarens fulla namn innehåller ju ett blanksteg som ställer till problem. Jag har försökt med alla varianter jag kan komma på, men inget fungerar. Jag trodde att fnuttar eller citattecken runt 'Förnamn Efternamn' skulle fungera.
2) Vid "smbpasswd" krävs ju att man matar in ett lösenord två gånger. Hur slipper jag inmatningen för att i stället ta lösenordet från textfilen med $PASS? Har testat ett par varianter utan framgång.
3) Textfilen med uppgifterna kommer från export ur en Excelfil i Windows. Hur löser jag problemet med radbrytningstecknen som är olika?

Något annat jag borde tänka på? Tex nån idé om hur man skulle kunna fånga upp fel, tex när användarnamnen redan är upptagna, utan att loopen avslutas?

Re: Shellscript med variabler istf inmatning

Postat: 09 sep 2008, 19:27
av Lars
1) Om du kör export IFS="," före read så används kommatecken som avskiljare istället för mellanslag.
3) Programmet dos2unix finns i paketet tofrodos.

Re: Shellscript med variabler istf inmatning

Postat: 09 sep 2008, 19:44
av Konservburk
Majo skrev:1) Användarens fulla namn innehåller ju ett blanksteg som ställer till problem. Jag har försökt med alla varianter jag kan komma på, men inget fungerar. Jag trodde att fnuttar eller citattecken runt 'Förnamn Efternamn' skulle fungera.
Det går inte att fnutta i filen som du läser in din data ifrån (om det nu var det du försökte göra). Exakt hur man bäst löser problemet beror helt på hur filen /home/anv.txt ser ut. Den biten måste du specificera bättre om du vill ha mer hjälp. Men man kan kan ju t.ex. göra som Lars föreslår om filen nu består av kommateckenseparerade fält. Lars kanske (till skillnad från mig) vet att det blir så när man exporterar från excelfiler.
Majo skrev:2) Vid "smbpasswd" krävs ju att man matar in ett lösenord två gånger. Hur slipper jag inmatningen för att i stället ta lösenordet från textfilen med $PASS? Har testat ett par varianter utan framgång.
Jag har aldrig använt smbpasswd, men när man vill automatisera program som stannar upp och frågar efter indata så brukar yes-kommdot kunna hjälpa:

Kod: Markera allt

yes "$PASS" | smbpasswd ...
Majo skrev:3) Textfilen med uppgifterna kommer från export ur en Excelfil i Windows. Hur löser jag problemet med radbrytningstecknen som är olika?
Det behöver du antagligen inte bry dig om. Men annars tycker jag inte att dos2unix tillför något när man lika gärna kan använda sed 's/\r$//' utan att behöva installera något extra paket.
Majo skrev:Något annat jag borde tänka på? Tex nån idé om hur man skulle kunna fånga upp fel, tex när användarnamnen redan är upptagna, utan att loopen avslutas?
Kör med continue istället för break när du hittar ett upptaget användarnamn.

Re: Shellscript med variabler istf inmatning

Postat: 09 sep 2008, 20:20
av Majo
Lars skrev:1) Om du kör export IFS="," före read så används kommatecken som avskiljare istället för mellanslag.
3) Programmet dos2unix finns i paketet tofrodos.
Tack. Kommatecken blir lite problem att använda, eftersom de kan förekomma i posterna, men det borde väl gå lika bra att med samma metod ange något annat tecken, tex semikolon?

Re: Shellscript med variabler istf inmatning

Postat: 09 sep 2008, 20:29
av Majo
Tack för svaren!
Konservburk skrev: Det går inte att fnutta i filen som du läser in din data ifrån (om det nu var det du försökte göra). Exakt hur man bäst löser problemet beror helt på hur filen /home/anv.txt ser ut. Den biten måste du specificera bättre om du vill ha mer hjälp. Men man kan kan ju t.ex. göra som Lars föreslår om filen nu består av kommateckenseparerade fält. Lars kanske (till skillnad från mig) vet att det blir så när man exporterar från excelfiler.
Det är en enkel textfil, där fälten åtskiljs av mellanslag och posterna/användarna av radbrytning. I tur och ordning namn, användare, grupper och lösenord:

Kod: Markera allt

Nils Karlsson nika 1004,1009 Zhid89sk
Bo Andersson boan 1002,1004 AKhdo98k
Konservburk skrev: Jag har aldrig använt smbpasswd, men när man vill automatisera program som stannar upp och frågar efter indata så brukar yes-kommdot kunna hjälpa:

Kod: Markera allt

yes "$PASS" | smbpasswd ...
Precis vad jag letade efter. Skall provas i morgon.
Konservburk skrev: Det behöver du antagligen inte bry dig om. Men annars tycker jag inte att dos2unix tillför något när man lika gärna kan använda sed 's/\r$//' utan att behöva installera något extra paket.
Hur använder jag det? Jag hänger inte med riktigt...
Konservburk skrev: Kör med continue istället för break när du hittar ett upptaget användarnamn.
Du menar med en konditionell sats? Nåt förslag på hur en sån skulle kunna se ut, med mitt script som utgångspunkt?

Re: Shellscript med variabler istf inmatning

Postat: 09 sep 2008, 21:07
av Konservburk
Majo skrev:Det är en enkel textfil, där fälten åtskiljs av mellanslag och posterna/användarna av radbrytning. I tur och ordning namn, användare, grupper och lösenord:

Kod: Markera allt

Nils Karlsson nika 1004,1009 Zhid89sk
Bo Andersson boan 1002,1004 AKhdo98k
Jag antar att det kan finnas fler än ett mellanrum i namnen? Annars skulle du ju kunnat ha en variabel till förnamnet och en annan till efternamnent: while read FIRSTNAME LASTNAME USER ..., och sedan alltid använda dem tillsammans: useradd -c "$FIRSTNAME $LASTNAME" ...
Majo skrev:
Konservburk skrev:Det behöver du antagligen inte bry dig om. Men annars tycker jag inte att dos2unix tillför något när man lika gärna kan använda sed 's/\r$//' utan att behöva installera något extra paket.
Hur använder jag det? Jag hänger inte med riktigt...
Du kan t.ex byta ut cat mot sed när du pipe:ar till while read:

Kod: Markera allt

sed 's/\r$//' "$NEWUSERS" | while read
Majo skrev:
Konservburk skrev: Kör med continue istället för break när du hittar ett upptaget användarnamn.
Du menar med en konditionell sats? Nåt förslag på hur en sån skulle kunna se ut, med mitt script som utgångspunkt?

Kod: Markera allt

grep -q "^$USER:" /etc/passwd && continue

Re: Shellscript med variabler istf inmatning

Postat: 10 sep 2008, 00:01
av Lars
Om nu filen nödvändigtvis måste se ut på just det sättet så kan man göra så här:

Kod: Markera allt

#!/bin/bash
#
NEWUSERS="/home/anv.txt"
cat $NEWUSERS | \
while read line; do
    eval $(echo $line | awk '{namn=""; for(i = 1; i < NF-3; i++) namn = namn $i " "; namn = namn $(NF-3); print "FULLNAME=\"" namn "\";"; print "USER="$(NF-2) ";"; print "GROUP="$(NF-1) ";"; print "PASS="$NF}')
    useradd -c ${FULLNAME} -g 1001 -G ${GROUPS} -m -d /home/users/${USER} -p ${PASS} ${USER}
    smbpasswd -a ${USER} -p ${PASS}
    chmod 700 /home/users/${USER}
done

Re: Shellscript med variabler istf inmatning

Postat: 10 sep 2008, 21:33
av Majo
Tack båda två för svar som ledde mig framåt. Jag har nu fått till scriptet i ett första steg och det fungerar bra. Jag tänkte visa hur det blev i fall någon annan till äventyrs skulle söka efter en liknande lösning på forumet:

Kod: Markera allt

#!/bin/bash
# 
NEW_USERS="/home/anv.txt"
cat ${NEW_USERS} | \
while
export IFS=","
 read FULLNAME USER GROUPS PASS ; do
	useradd -c ${FULLNAME} -g 1001 -G ${GROUPS} -m -d /home/users/${USER} -p ${PASS} ${USER}
	(echo ${PASS}; echo ${PASS}) | smbpasswd -as  ${USER}
	chmod 700 /home/users/${USER}
done 
Textfilen "anv.txt" som används är en kommaseparerad textfil exporterad från Excel där raderna ser ut så här:

Kod: Markera allt

Magnus Karlsson, maka,102,Zhjgsu98
Anna Nilsson,anni,102,KLO98yU
Alltså namnet, användarnamn, gruppid, lösenord i tur och ordning.
Fungerar klockrent så långt. Men jag funderar på att automatisera ytterligare och kanske nån har lust att hjälpa mig? Till exempel:

1) Att skapa användarnamnet automatiskt till namnvariabeln genom att hämta de två första bokstäverna ur för- och efternamn (blir kanske komplicerat om man vill ha endast gemener i användarnamnet...?)
2) Om användarnamnet redan är upptaget (dvs redan som Unix-användare), i stället testa med att lägga till en tvåa (om anni är upptaget testa med anni2, om det också är upptaget testa med anni3 etc)
3) Att slumpgenerera ett lösenord på åtta tecken till lösenordsvariabeln
4) Att lista upp alla uppgifter på en lista till en textfil som sparas

Nån som orkar ge det ett försök? Tänk på att jag är nybörjare inom bashscriptning och gärna vill hänga med i svängarna så att jag lär mig nåt. Jag är otroligt tacksam för all hjälp jag kan få.

Re: Shellscript med variabler istf inmatning

Postat: 11 sep 2008, 06:45
av Lars
För att slumpa fram lösenord kan man använda pwgen.