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

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ę
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
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.