Shellscript med variabler istf inmatning [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Shellscript med variabler istf inmatning [LÖST]

Inlägg 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?
Senast redigerad av 1 Majo, redigerad totalt 23 gånger.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Shellscript med variabler istf inmatning

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Shellscript med variabler istf inmatning

Inlägg 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.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Shellscript med variabler istf inmatning

Inlägg 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?
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Shellscript med variabler istf inmatning

Inlägg 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?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Shellscript med variabler istf inmatning

Inlägg 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
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Shellscript med variabler istf inmatning

Inlägg 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
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Shellscript med variabler istf inmatning

Inlägg 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å.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Shellscript med variabler istf inmatning

Inlägg av Lars »

För att slumpa fram lösenord kan man använda pwgen.
Skriv svar

Återgå till "Terminalforum"