Próbuję masowo ustawić kilka haseł do kont użytkowników chpasswd
. Hasła powinny być generowane losowo i drukowane na stdout
(muszę je zapisać lub umieścić w magazynie haseł), a także przekazywane do chpasswd
.
Naiwnie zrobiłbym to w ten sposób
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
Jednak martwię się o przekazanie nowego hasła jako argumentu wiersza poleceń echo
, ponieważ argumenty są zwykle widoczne dla innych użytkowników w ps -aux
(chociaż nigdy nie widziałem, aby echo
pojawiał się w nim jakikolwiek wiersz ps
).
Czy istnieje alternatywny sposób przygotowania wartości do mojego zwróconego hasła, a następnie przekazania go do chpasswd
?
echo
jest wbudowaną powłoką. Nie pojawi się w tabeli procesów.Odpowiedzi:
Twój kod powinien być bezpieczny, ponieważ
echo
nie pojawi się w tabeli procesów, ponieważ jest wbudowany w powłokę.Oto alternatywne rozwiązanie:
Spowoduje to utworzenie twoich nazwisk uczniów i haseł,
n
bez przekazywania żadnych haseł w dowolnym wierszu polecenia dowolnego polecenia.Te
paste
kleje użytkowych razem kilka plików jak kolumny i wkładki separatora między nimi. In Tutaj używamy:
jako separatora i dajemy mu dwa „pliki” (podstawienia procesu). Pierwszy zawiera dane wyjścioweseq
polecenia, które tworzy 20 nazw użytkowników, a drugi zawiera dane wyjściowe potoku, który tworzy 20 losowych ciągów o długości 13.Jeśli masz plik z już wygenerowanymi nazwami użytkowników:
Spowodują to zapisanie haseł i nazw użytkowników w pliku
secret.txt
zamiast wyświetlania wygenerowanych haseł w terminalu.źródło
echo
aniprintf
jednak kod jest nieco niewygodne do rozszyfrowaniaecho
wbudowanej powłoce. Tak jest w większości pocisków, ale absolutnie nie ma takiego wymagania.tee secret.txt > >(chpasswd)
itee secret.txt | chpasswd
? Ta ostatnia wydaje się o wiele bardziej powszechna, więc zastanawiam się, dlaczego zdecydowałeś się na zastąpienie procesu zamiast zwykłej rurytee
). Teraz, gdy już to zauważyłeś, myślę, że rzeczywiście to zmienię (wygląda lepiej). Dzięki.echo
najprawdopodobniej jest wbudowany w powłokę, więc nie pojawi sięps
jako osobny proces.Ale nie musisz używać podstawiania poleceń, możesz po prostu otrzymać dane wyjściowe z potoku bezpośrednio do
chpasswd
:Jeśli chcesz zmienić wiele haseł za jednym razem
chpasswd
, powtórzenie niezbędnych części powinno być łatwe. Lub przekształć go w funkcję:Na marginesie:
head /dev/urandom
to trochę dziwne, ponieważurandom
nie jest zorientowane liniowo. Może odczytać z niego nadmierną ilość bajtów, co wpłynie na pojęcie dostępnej entropii przez jądro, co z kolei może prowadzić do/dev/random
blokowania. Lepiej byłoby po prostu odczytać określoną ilość danych i użyć czegoś takiego jakbase64
konwersja losowych bajtów na znaki drukowalne (zamiast po prostu odrzucić około 3/4 bajtów, które otrzymujesz).Coś takiego dałoby ci ok. 16 znaków i cyfr:
(to znaczy 16 mniej liczby
+
i/
znaków na wyjściubase64
. Szansa na jedno z nich wynosi 1/32 na postać, więc jeśli dobrze zrozumiem kombinatorykę, daje to około 99% szansy na pozostawienie co najmniej 14 znaków, i 99,99% szans na odejście co najmniej 12.)źródło
printf
rozwiązanie nie robi tego, co robi mój oryginalny kod: zwraca wiele wierszy dla wielu nazw użytkowników, ale doceniam twoje uwagi na temathead urandom
head -c 10 | base64
rurociąg czy Nilsahead | tr
? 10 „linii” losowych bajtów najprawdopodobniej będzie mieć setki bajtów (biorąc pod uwagę, że tylko 1 na 256 to znaki nowej linii), chociaż teoretycznie może to być dokładnie 10 bajtów, ale szanse na to są całkowicie znikome. Podobnie przy użyciubase64
, jeśli przypadkowe bajty są powiedzmy po prostu\xff
, to base64 będzie tylko ciągiem ukośników, ale to również mało prawdopodobne. Jeśli cię to obchodzi, możesz odczytać więcej niż 10 bajtów, zmniejszyć prawdopodobieństwo tego, a następnie skrócić długość wynikowego wyniku./dev/urandom
, ale ryzyko nie wynosi 0%.