[bash]Dokończenie skryptu dodającego użytkowników z pliku.

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
JohnnyChrist
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 12 cze 2009, 17:16
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

[bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: JohnnyChrist »

Witajcie serdecznie. Mam za zadanie napisać skrypt który pobiera z pliku 3-kolumnowego imię, nazwisko i datę urodzenia, a następnie wg zdefiniowanych kryteriów tworzy użytkowników. Cały skrypt już mam, teraz tylko trzeba użyć funkcji adduser, a wcześniej zaszyfrować hasło. I z tym mam największy problem. Oto 2 ostatnie linie skryptu:

Kod: Zaznacz cały

pass= `openssl passwd -1 "$pass"`
useradd -p $pass $user
Jak już wspomniałem wcześniej zmienne $user i $pass są już zdefiniowane, wyświetla je poprawnie, jedyny problem to szyfrowanie. Koniecznie muszę użyć funkcji openssl. Użytkowników tworzy, ale nie można się zalogować poprzez prawidłowe hasło. Oprócz tego zamieniając ręcznie funkcją tr każdy znak z polskiego na zwykły wstawia przed nim literkę "l", nie mam pojęcia czemu:

Kod: Zaznacz cały

pass=`echo "$firstname""$firstlname""$date" | tr -s 'ą' 'a' | tr -s 'Ą' 'A' | tr -s 'ć' 'c' | tr -s 'Ć' 'C' |
 tr -s 'ę' 'e' | tr -s 'Ę' 'E' | tr -s 'ł' 'l' | tr -s 'Ł' 'L' | tr -s 'ń' 'n' |
 tr -s 'Ń' 'N' | tr -s 'ó' 'o' | tr -s 'Ó' 'O' | tr -s 'ś' 's' | tr -s 'Ś' 'S' |
 tr -s 'ź' 'z' | tr -s 'Ź' 'Z' | tr -s 'ż' 'z' |
 tr -s 'Ż' 'Z' | tr -s ' ' '_' | tr -s '-' '_' | tr [:upper:] [:lower:]`
Proszę o szybką odpowiedź i pozdrawiam :D
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: leon1313 »

Jeżeli planujesz to wdrożyć na "produkcje", to zainteresuj sie LDAP-em.
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: borzole »

Rzeczywiście tr dziwnie się zachowuje. Zawsze możesz zastąpić go sed'em

Kod: Zaznacz cały

sed '
	s/ą/a/g
	s/Ą/A/g
	s/ć/c/g
	s/Ć/C/g
	s/ę/e/g
	s/Ę/E/g
	# itd.
	s/ /_/g
' | tr -s [:upper:] [:lower:]
JohnnyChrist
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 12 cze 2009, 17:16
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: JohnnyChrist »

Jak kolega wyżej radził zastosowałem sed'a, jednakże teraz wyrzuca krzaczki. Wkleję cały kod, może ktoś będzie miał jakiś pomysł jak to rozwiązać:

Kod: Zaznacz cały

#!/bin/bash
echo "Podaj nazwę pliku z danymi"
read plik
count=`grep -v kszxyzxyz -c $plik` #tu liczy linie, wiem że zrobione żałośnie ale tak doraźnie jest
for((i=1;i<=$count;i++))
        do
        lname=`sed -n "$i"p $plik | awk '{ print $2 }'`
        firstname=`sed -n "$i"p $plik | cut -c1`
        firstlname=`echo $lname | cut -c1`
        date=`sed -n "$i"p $plik | awk '{ print $3 }'`
        date=`echo "$date" | awk -F. '{ print $1,$2,$3 }' | sed 's/ //g'`
        user=`echo "$firstname"."$lname" | sed '
s/ą/a/g 
s/Ą/A/g 
s/ć/c/g 
s/Ć/C/g 
s/ę/e/g 
s/Ę/E/g 
s/ł/l/g 
s/Ł/L/g 
s/ń/n/g 
s/Ń/N/g 
s/ó/o/g
s/Ó/O/g 
s/ś/s/g 
s/Ś/S/g 
s/ź/z/g 
s/Ź/Z/g 
s/ż/z/g 
s/Ż/Z/g 
s/ /_/g 
s/-/_/g 
' | tr -s [:upper:] [:lower:]`
        pass=`echo "$firstname""$firstlname""$date" | sed '
s/ą/a/g
s/Ą/A/g 
s/ć/c/g 
s/Ć/C/g 
s/ę/e/g 
s/Ę/E/g 
s/ł/l/g 
s/Ł/L/g 
s/ń/n/g 
s/Ń/N/g 
s/ó/o/g 
s/Ó/O/g 
s/ś/s/g 
s/Ś/S/g 
s/ź/z/g 
s/Ź/Z/g 
s/ż/z/g 
s/Ż/Z/g 
s/ /_/g 
s/-/_/g 
' | tr -s [:upper:] [:lower:]`
        echo "$user"_"$pass" # wyświetlam sobie usera i hasło żeby sprawdzić czy dobrze się wykonało
        pass= `openssl passwd -1 "$pass"` #szyfrowanie
        useradd --password $pass $user     # dodawanie użytkownika
        done
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: borzole »

Pokaż jak wygląda plik wejściowy, bo bez tego to chodzenie po omacku.

A póki co dwie uwagi.
* zamianę znaków zamknij w funkcji
* zamiast używać "read" do pobierania nazwy, lepiej niech to będzie parametr.

Kod: Zaznacz cały

#!/bin/bash

unpolish(){
	# czyta ze strumienia
	sed '
		s/ą/a/g ; s/Ą/A/g
		s/ć/c/g ; s/Ć/C/g
		s/ę/e/g ; s/Ę/E/g
		s/ł/l/g ; s/Ł/L/g
		s/ń/n/g ; s/Ń/N/g
		s/ó/o/g ; s/Ó/O/g
		s/ś/s/g ; s/Ś/S/g
		s/ź/z/g ; s/Ź/Z/g
		s/ż/z/g ; s/Ż/Z/g
		s/ /_/g
		s/-/_/g
	' | tr -s [:upper:] [:lower:]
}

if [[ -f $1 ]] ; then
	plik=$1
else
	echo "Podaj nazwę pliku z danymi jako parametr"
	exit 1
fi

count=`grep -v kszxyzxyz -c $plik`

for((i=1;i<=$count;i++)) ; do
	lname=`sed -n "$i"p $plik | awk '{ print $2 }'`
	firstname=`sed -n "$i"p $plik | cut -c1`
	firstlname=`echo $lname | cut -c1`
	date=`sed -n "$i"p $plik | awk '{ print $3 }'`
	date=`echo "$date" | awk -F. '{ print $1,$2,$3 }' | sed 's/ //g'`
	user=`echo "$firstname"."$lname" | unpolish`
	pass=`echo "$firstname""$firstlname""$date" | unpolish`
	echo "$user"_"$pass"
	pass=`openssl passwd -1 "$pass"`
	useradd --password $pass $user
done
[edit]
na końcu skryptu masz spację

Kod: Zaznacz cały

pass= `openssl ...
w bash to niedopuszczalne, parametr pass będzie pusty
JohnnyChrist
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 12 cze 2009, 17:16
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: JohnnyChrist »

Zrobiłem tak jak powiedziałeś, w załączniku plik z nazwiskami. Po uruchomieniu skryptu stworzyło użytkowników, nie mogę się na nich zalogować, powieliło moje konto systemowe i cały czas wywala mnie do ekranu logowania. Jednym słowem mówiąc bieda :D

P.S Krzaczki zamiast polskich liter dalej.
Załączniki
dane.txt
(138 Bajtów) Pobrany 45 razy
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [bash]Dokończenie skryptu dodającego użytkowników z pliku.

Post autor: borzole »

Zalogowałem się poprawnie używając:
user: a.git
password: ag19220514
skrypt działa.

Kod: Zaznacz cały

#!/bin/bash

unpolish(){
	# czyta ze strumienia
	sed '
		s/ą/a/g ; s/Ą/A/g
		s/ć/c/g ; s/Ć/C/g
		s/ę/e/g ; s/Ę/E/g
		s/ł/l/g ; s/Ł/L/g
		s/ń/n/g ; s/Ń/N/g
		s/ó/o/g ; s/Ó/O/g
		s/ś/s/g ; s/Ś/S/g
		s/ź/z/g ; s/Ź/Z/g
		s/ż/z/g ; s/Ż/Z/g
		s/ /_/g
		s/-/_/g
	' | tr -s [:upper:] [:lower:]
}

if [[ -f $1 ]] ; then
	plik=$1
else
	echo "Podaj nazwę pliku z danymi jako parametr"
	exit 1
fi

# zakładając, że separatorem pól jest tabulator,
# można wczytywać kilka parametrów na raz
cat "$plik" | while IFS=$'\t' read name lname ldate ; do
	firstname=`echo $name | cut -c1`
	firstlname=`echo $lname | cut -c1`
	date=`echo $ldate | sed 's/\.//g'`

	user=`echo "$firstname"."$lname" | unpolish`
	pass=`echo "$firstname""$firstlname""$date" | unpolish`
	# dla sprawdzenia poprawności
	echo -ne $user $pass '\t: '
	echo -ne $firstname $firstlname $date '\t: '
	echo -e  $name $lname $ldate

	pass=`openssl passwd -1 "$pass"`
	useradd --password "$pass" "$user"
done
* jedyna istotna zmiana to cudzysłów przy podawania parametrów
useradd --password "$pass" "$user"

* druga kosmetyczna: zamiast liczyć linie, używać for, a potem wydłubywać każdy parametr osobno, wystarczy nakazać poleceniu read czytać kilka parametrów na raz.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości