Strona 1 z 1

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

: 18 gru 2010, 11:25
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

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

: 18 gru 2010, 17:58
autor: leon1313
Jeżeli planujesz to wdrożyć na "produkcje", to zainteresuj sie LDAP-em.

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

: 18 gru 2010, 18:18
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:]

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

: 19 gru 2010, 14:56
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

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

: 19 gru 2010, 18:19
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

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

: 19 gru 2010, 20:54
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.

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

: 19 gru 2010, 21:42
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.