Bash - zmienna $? i używanie crypt()

Potrzebujesz pomocy z C, C++, perl, python, itp.
krystiann
Posty: 1
Rejestracja: 24 marca 2013, 14:11

Bash - zmienna $? i używanie crypt()

Post autor: krystiann »

Witam, to mój pierwszy post.

Niestety internet i poradniki mi nie pomogły (tak- szukałem), a jak coś było, to nie do zrozumienia dla kogoś kto zaczyna z zabawą, a na zagłębianie się przez pół roku przez kolejne hasła brak mi ochoty, sił i czasu.

Chcę stworzyć skrypt umożliwiający dodawanie nowych użytkowników z katalogiem domowym z pliku gdzie są w dwóch kolumnach login i hasło.

Tutaj: http://forums.devshed.com/scripts-94/sh ... 81336.html
trafiłem na następujący kod:

Kod: Zaznacz cały

#!/bin/bash
# Script to add a user to Linux system
if [ $(id -u) -eq 0 ]; then
    read -p "Enter username : " username
    read -s -p "Enter password : " password
    egrep "^$username" /etc/passwd >/dev/null
    if [ $? -eq 0 ]; then
        echo "$username exists!"
        exit 1
    else
        pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
        useradd -m -p $pass $username
        [ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
    fi
else
    echo "Only root may add a user to the system"
    exit 2
fi
I próbuję to rozszyfrować i mam dwa pytania, na które nie potrafię znaleźć odpowiedzi:
  1. Co to za zmienna $? Coś kojarzy mi się z wynikiem egrep który jest wyżej, bo o to chodzi w tym if-ie, żeby sprawdzić, czy user istnieje a grep zwróci pasującą linijkę? Tylko że nigdzie nie zapisujemy do żadnego $? a nawet wynik grepa wywalamy do

    Kod: Zaznacz cały

    /dev/null
    Więc o co chodzi?
  2. Czym jest pierwszy argument w crypt()? w sensie rozumiem, ze trzeba zakodować hasło do useradd, ale nie wiem czemu ARGV[0]? Bo z tego co testowałem to chyba jest to klucz do kodowania, ale co i jak dalej, jaki to klucz jest? Nie kminie...
Z góry dziękuję za jakieś podpowiedzi.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Zmienna $? zawiera kod powrotu ostatniego wykonanego polecenia, w tym przypadku:

Kod: Zaznacz cały

egrep "^$username" /etc/passwd >/dev/null
Więcej w:

Kod: Zaznacz cały

man egrep
Co do linii

Kod: Zaznacz cały

pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
W perlu przez $ARGV[0] odczytuje się parametry przekazane w linii komend. W tym przypadku wyrażenie $ARGV[0] zostanie zastąpione tym co kryje się w zmiennej $password. Drugi parametr w funkcji crypt (w tym przypadku to napis "password") to sól: http://pl.wikipedia.org/wiki/Sól_(kryptografia) .
ODPOWIEDZ