Muszę ręcznie edytować, /etc/shadow
aby zmienić hasło roota w obrazie maszyny wirtualnej.
Czy istnieje narzędzie wiersza polecenia, które pobiera hasło i generuje /etc/shadow
zgodny skrót hasła przy standardowym wyjściu?
Muszę ręcznie edytować, /etc/shadow
aby zmienić hasło roota w obrazie maszyny wirtualnej.
Czy istnieje narzędzie wiersza polecenia, które pobiera hasło i generuje /etc/shadow
zgodny skrót hasła przy standardowym wyjściu?
Odpowiedzi:
Do tego samego możesz użyć następujących poleceń:
openssl passwd -6 -salt xyz yourpass
Uwaga: przekazanie -1
wygeneruje hasło MD5, -5
SHA256 i -6
SHA512 (zalecane)
mkpasswd --method=SHA-512 --stdin
Metody przyjmuje md5
, sha-256
isha-512
Zgodnie z sugestią @tink możemy zaktualizować hasło za chpasswd
pomocą:
echo "username:password" | chpasswd
Lub możesz użyć zaszyfrowanego hasła za pomocą chpasswd
. Najpierw wygeneruj za pomocą:
perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'
Następnie możesz użyć wygenerowanego hasła do aktualizacji:
echo "username:encryptedPassWd" | chpasswd -e
To zaszyfrowane hasło możemy wykorzystać do utworzenia nowego użytkownika z hasłem, na przykład:
useradd -p 'encryptedPassWd' username
openssl passwd -1
które 1) tam się nie kończy, a 2) generuje dla ciebie losową sól (która również nie trafia do historii muszli).
openssl passwd
dokumentacja dla każdego, kto próbuje dowiedzieć się, co -1
robi opcja.
python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'
- z powiązanego pytania
W Ubuntu 12.04 jest mkpasswd (z pakietu whois): Nadmierny interfejs użytkownika do crypt (3)
mkpasswd -m sha-512 -S saltsalt -s <<< YourPass
Gdzie:
-m
= Oblicz hasło przy użyciu metody TYPE. Jeśli TYPE jest pomocne, drukowane są dostępne metody.-S
= użyta sól.Na przykład
$ mkpasswd -m help
-s = Read password from stdin
To rozwiązanie ma następujące zalety:
Ponownie wyświetla monit o podanie hasła, aby uniknąć błędów.
$ python3 -c "from getpass import getpass; from crypt import *; \
p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
Dla osób bez systemów opartych na Debianie. Python3 działa równie dobrze.
python3 -c 'import crypt; print(crypt.crypt("test"))'
UWAGA: Ciąg „test” to hasło, które generujemy jako zaszyfrowany ciąg.
crypt.mksalt
nie działa podczas generowania haseł /etc/shadow
. Ale metoda @ Alex131089 działa!
openssl
jest dość uniwersalnym narzędziem.
Żadna z obecnych metod nie jest dla mnie do zaakceptowania - albo przekazują hasło w wierszu poleceń (co kończy się w historii mojej powłoki), wymagają instalacji dodatkowych narzędzi ( python3
, makepasswd
), używają zakodowanych soli lub starych technik mieszania.
Ta metoda generowałaby skróty SHA-512 po wyświetleniu zapytania o hasło i używałaby losowej soli.
Metoda wykorzystująca Python 2 bez żadnych niestandardowych bibliotek:
python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'
Aby to zrobić bez pytania: (Zostawi to twoje hasło w historii poleceń)
python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
ps
ułamku sekundy nadal działałoby. (Najbezpieczniejsze pozostaje użycie wersji, która wymaga podania hasła)
I openssl
i chpasswd -e
para nie działały w moim przypadku w RHEL6. Łączenie openssl passwd
i usermod -p
dowodzenie wykonało pracę.
Wygeneruj wartość skrótu hasła wraz z wartością soli:
$ openssl passwd -1 -salt 5RPVAd clear-text-passwd43
$1$5RPVAd$vgsoSANybLDepv2ETcUH7.
Następnie skopiuj zaszyfrowany ciąg do usermod. Pamiętaj, aby owinąć go pojedynczymi cudzysłowami.
$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root
Sprawdź to w pliku cienia.
$ grep root /etc/shadow
root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Jeszcze inną metodą generowania haseł jest użycie tego openssl
narzędzia.
Wygeneruj hasła MD5
openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/
Wygeneruj hasła DES
openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Rozwijając nieco krytykę u150825 i Gert van den Berg, odkryłem, że potrzebuję czegoś stosunkowo elastycznego w różnych sytuacjach z różnymi systemami automatyki. Postanowiłem dodać do mojej małej biblioteki przydatnych skryptów i napisać to. Używa tylko rodzimych bibliotek z Python 2.7+ i działa równie dobrze na Python3.
Możesz go tutaj odebrać, jeśli chcesz. Równie łatwo jest upuścić to w swoim środowisku, jeśli potrzebujesz go często używać, hostowanego HTTP lub cokolwiek innego, i możesz uruchomić go na dowolnej platformie, używając dowolnego domyślnego interpretera Pythona, jaki masz, całkiem ładny niezawodnie liczę na to, że zadziała.
Domyślnie monituje za pomocą getpass z monitami na stderr (umożliwiając łatwe przechwytywanie standardowego wyjścia), ale jeśli podłączysz do niego łańcuch, zacznie on zbierać ze standardowego wejścia. W zależności od tego, jak sobie z tym poradzisz, może również nie pojawiać się w historii poleceń, więc bądź świadomy tego, nad czym pracujesz. Lubię mieć elastyczne narzędzie, które będzie się zachowywało w oczekiwany sposób, zamiast polegać na pakietach lub pytaniu w jednej linii na drodze do zwycięstwa na 10 różnych sposobów.
chpasswd
?
chpasswd -e
pamiętaj, aby używać pojedynczych cudzysłowów w ciąguecho
; w przeciwnym razie, jeśli istnieją$
lub inne znaki specjalne, nie zostaną potraktowane dosłownie.