Czy mogę zmienić hasło użytkownika w systemie Linux z wiersza poleceń bez interakcji?

15

Mam konkretny przypadek użycia, w którym naprawdę chciałbym móc zmienić hasło użytkownika za pomocą jednego polecenia bez interakcji. Odbywa się to w bezpieczny sposób (przez SSH i w systemie, w którym zalogowany może być tylko jeden użytkownik), więc w wierszu poleceń można udostępnić nowe hasło (a nawet stare, jeśli to konieczne). FWIW, to system Ubuntu.

Chcę tylko uniknąć dodawania czegoś podobnego do tego systemu dla tego jednego zadania.

Paul Hoffman
źródło
3
Dla tych, którzy chcą to zrobić na FreeBSD:echo "newpassword" | pw usermod theusername -h 0
Paul Hoffman,

Odpowiedzi:

5

Możesz użyć usermodz -popcją zapewnienia skrótu hasła (nie rzeczywistego hasła). Możesz wygenerować skrót hasła za pomocą czegoś takiego jak mkpasswd -m sha-256lubmkpasswd -m md5

gulasz
źródło
1
... Ale mój system AIX nie ma usermod: '(- Naprawię tagi w pytaniu.
voretaq7
3

Pewnie.

  1. Hash hasło w systemie lokalnym.
  2. Połącz się ze zdalnym komputerem (gdzie chcesz zmienić hasło)
  3. Nakarm hashed hasło i login do twórczego sedskrypt, który aktualizuje plik haseł Twojego systemu ( /etc/shadow, /etc/master.passwd, co zdarza się).
voretaq7
źródło
1

passwdNarzędzie ma --stdin opcję, która stwierdza:

Ta opcja służy do wskazania, że ​​hasło powinno czytać nowe hasło ze standardowego wejścia, którym może być potok.

Składnia:

echo "newpass" | passwd --stdin user1

Mimo że wspomniałeś, że cię to nie obchodzi, możesz umieścić hasło w pliku tekstowym, a następnie zrobić to cat pass.txtzamiast polecenia echo, w ten sposób nie pojawi się ono w historii bash.

Safado
źródło
To jest to. echo VerySecret | passwd --stdin username
MadHatter
5
Mój system Ubuntu nie ma --stdinopcji dla passwd.
Jeff Ferland
Masz rację, nie ma. Sprawdziłem zarówno na systemie CentOS, jak i na Macu i mają one opcję --stdin, więc usunięcie jej musi być kwestią Ubuntu.
Safado
1
@RyanM. FreeBSD (i AFAIK NetBSD i OpenBSD, AIX, HP-UX i Solaris ostatnio sprawdzam) też nie obsługują --stdin- głównie dlatego, że czeka na to wielka luka bezpieczeństwa :-)
voretaq7
1
@quanta: Lub rozpocznij echo "newpass" | passwd --stdin user1wiersz spacją; w ten sposób w ogóle nie przejdzie do historii bashów.
Janne Pikkarainen
1

Jeśli --stdinopcja nie działa, możemy w zasadzie użyć dwóch opcji:

  1. Albo użyj innego narzędzia zwanego chpaswdw twoim skrypcie.
  2. Albo użyj echo "current_password\nnew_password\nnew_password" | passwd user_name
Sanjay s.
źródło