Jak automatycznie dodać konto użytkownika ORAZ hasło za pomocą skryptu Bash?

200

Muszę mieć możliwość tworzenia kont użytkowników w moim systemie Linux (Fedora 10) i automatycznego przypisywania hasła za pomocą skryptu bash (lub w razie potrzeby w inny sposób).

Łatwo jest utworzyć użytkownika za pomocą Bash, np .:

[whoever@server ]#  /usr/sbin/useradd newuser

Czy można przypisać hasło w Bash, coś funkcjonalnie podobnego do tego, ale automatycznie:

[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[whoever@server ]#
ModernCarpentry
źródło
11
Dlaczego to jest nie na temat?
OrangeTux,
16
Myślę, że to pytanie dotyczy tematu. Jednym z najsilniejszych trendów jest obecnie podejście DevOps do „konfiguracji jako kodu”, tzn., Że platforma jest tworzona przez „programowanie” sekwencji kroków administracyjnych, które uruchamiają platformę. Zarządzanie użytkownikami w trybie skryptowym jest zdecydowanie częścią tego programowania.
Dan Bergh Johnsson
2
Jako DevOps myślę, że jest to przydatne pytanie (z przydatnymi odpowiedziami), ale to z moim kapeluszem SysAdmin. Bardziej sensowne może być przeniesienie tego do SuperUser.
Anthony Geoghegan
1
Podobne pytanie: askubuntu.com/q/94060/250556
ThorSummoner
Można to również rozwiązać za pomocą expectskryptu.
Yaron

Odpowiedzi:

122

Możesz uruchomić polecenie passwd i wysłać dane wejściowe w potoku. Więc zrób coś takiego:

echo thePassword | passwd theUsername --stdin
Tralemonkey
źródło
3
Premia tej metody polega na tym, że jest bezpieczna (zakłada się, że echojest wbudowana w używaną powłokę, co zwykle jest), przynajmniej niepokojąca /proc/.
Marian
8
Musiałem zrobić w echo -e "password\npassword\n" | passwddniu 13.04
d0c_s4vage
31
--stdin jest przestarzałe w nowszych systemach Linux. Zamiast tego użyj chpasswd.
wuxb,
16
@ MarkusOrreilly działa, ale nie podczas korzystania z narzędzia do obsługi administracyjnej, takiego jak Ansible. Jak stwierdził @Nybble, powinieneś używać chpasswd. Więc tutaj jest to, co działa: echo 'myuser:mypass' | chpasswd. Mam nadzieję, że to pomaga.
Amir Rustamzadeh
czy mogę to umieścić w pliku dokera? Myślę, że powinien być jadalny dla dokerów.
qubsup
201

Możesz także użyć chpasswd :

echo username:new_password | chpasswd

więc zmieniasz hasło użytkownika usernamena new_password.

SilverDaemon
źródło
5
+1, To jest właściwe narzędzie do pracy: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K
To również działa z busybox, podczas passwdgdy nie (nie ma --stdinopcji).
Timmmm
83

Zadawałem sobie to samo i nie chciałem polegać na skrypcie Python.

Oto linia, w której użytkownik ma zdefiniowane hasło w jednym wierszu bash:

useradd -p $(openssl passwd -1 $PASS) $USER
Damien
źródło
25
useradd -p $(openssl passwd -1 $PASS) $USERjest bardziej nowoczesny, ponieważ tyknięcia wsteczne są przestarzałe i $()jest zalecany.
Bryson
Problem z tym miałem: stworzyłem mojego użytkownika za pomocą powłoki zsh, nie zdając sobie sprawy, że w tym momencie zsh nie został zainstalowany. Jeśli to zrobisz, logowanie przy użyciu hasła nie powiedzie się, więc zanim przyjmiesz, że to nie działa (na pewno zadziała w dzisiejszym Archu i Debianie 7), możesz to sprawdzić w nowej instalacji.
Bryson
2
useradd -m -p <password> -s /bin/bash <user>, -m katalog domowy Crates, -s określa defualt shell, zastępuje passwordi userdla twoich potrzeb.
ThorSummoner,
2
Można też sól hasło: useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). Myślę, że jest to wymagane w późniejszych Ubuntu.
craigmj
55

Poniższy kod działał w Ubuntu 14.04. Wypróbuj, zanim użyjesz go w innych wersjach / wariantach systemu Linux.

# quietly add a user without password
adduser --quiet --disabled-password --shell /bin/bash --home /home/newuser --gecos "User" newuser

# set password
echo "newuser:newpassword" | chpasswd
Ying
źródło
3
nie rozumiem--gecos
Alban
11
en.wikipedia.org/wiki/Gecos_field Pole gecos lub pole GECOS to pozycja w pliku / etc / passwd w systemie Unix i podobnych systemach operacyjnych. Zwykle służy do rejestrowania ogólnych informacji o koncie lub jego użytkownikach, takich jak ich prawdziwe nazwisko i numer telefonu. GECOS oznacza kompleksowy system operacyjny General Electric, którego nazwę zmieniono na GCOS, gdy dział dużych systemów GE został sprzedany firmie Honeywell.
Ying
To była dla mnie odpowiednia odpowiedź na Debian 8, działała jak urok w moim skrypcie bash instalacyjnym serwera!
levelzwo
Pole GECOS jest w zasadzie polem opisu użytkownika. Napisz tam, gdzie chcesz.
Константин Ван
30

Podobało mi się podejście Tralemonkey, echo thePassword | passwd theUsername --stdinchoć nie napisało się dla mnie. To jednak działało dla mnie.

echo -e "$password\n$password\n" | sudo passwd $user

-erozpoznaje \njako nową linię.

sudo jest dostępem root do Ubuntu.

Podwójne cudzysłowy mają na celu rozpoznanie $i rozwinięcie zmiennych.

Powyższe polecenie przekazuje hasło i nowy wiersz dwa razy do passwd, co jest passwdwymagane.

Jeśli nie używam zmiennych, myślę, że to prawdopodobnie działa.

echo -e 'password\npassword\n' | sudo passwd username

Pojedyncze cytaty powinny tu wystarczyć.

Paul S.
źródło
2
Działa pięknie w bashu. Jednak jeśli działa w sh, to opcja -e nie działa. Dowiedziałem się na własnej skórze, że faktycznie wypisuje „-e”. Na szczęście opcja -e nie jest konieczna w sh, ucieczka jest tam domyślna. Wersja przenośna używa printf „hasło \ npassword \ n” | ... zamiast.
Dan Bergh Johnsson
Idealna odpowiedź na ubuntu.
Mashpy Rahman
23

Poniższe działa dla mnie i przetestowane na Ubuntu 14.04. Jest to jeden liniowiec, który nie wymaga wkładu użytkownika.

sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME

Zaczerpnięte z @Tralemonkey

cevaris
źródło
13

Możesz użyć opcji -p.

useradd -p encrypted_password newuser

Niestety wymaga to samodzielnego zaszyfrowania hasła (w przypadku, gdy robi to passwd). Niestety, wydaje się, że nie ma standardowego narzędzia do mieszania niektórych danych, więc musisz to napisać sam.

Oto mały skrypt w języku Python, który przygotowałem, aby wykonać dla Ciebie szyfrowanie. Zakładając, że nazwałeś to pcrypt, napiszesz powyższą linię poleceń do:

useradd -p $(pcrypt ${passwd}) newuser

Kilka ostrzeżeń, o których należy pamiętać.

  1. Podczas działania programu pcrypt tekst jawny będzie widoczny dla każdego użytkownika za pomocą polecenia ps.
  2. pcrypt korzysta ze starej funkcji szyfrowania - jeśli używasz czegoś bardziej nowoczesnego, takiego jak skrót MD5, musisz zmienić pcrypt.

a oto pcrypt:

#!/usr/bin/env python

import crypt
import sys
import random

saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

def salt():
    return random.choice(saltchars) + random.choice(saltchars)

def hash(plain):
    return crypt.crypt(arg, salt())

if __name__ == "__main__":
    random.seed()
    for arg in sys.argv[1:]:
        sys.stdout.write("%s\n" % (hash(arg),))
R Samuel Klatchko
źródło
Dzięki R Klatchko, To powinno działać. Nie mogę uwierzyć, że nie wiedziałem o opcji -p. Mogę sama się zająć haszowaniem :)
ModernCarpentry
5
perl -e 'print crypt ($ ARGV [0], „hasło”) ”„ mojehasło ”
mikewaters
Czy możesz wyjaśnić trochę, w jaki sposób będę mógł później użyć hasła, a nie hasła zakodowanego?
answerSeeker
12

Pojedyncza linijka do stworzenia użytkownika sudo z katalogiem domowym i hasłem.

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
Sandeep
źródło
Niesamowite. Działa dobrze w skrypcie wdrażania
TheRealChx101
7

--stdinnie działa na Debianie. To mówi:

`passwd: unrecognized option '--stdin'`

To działało dla mnie:

#useradd $USER
#echo "$USER:$SENHA" | chpasswd

Tutaj możemy znaleźć inne dobre sposoby:

zrozumiałem
źródło
Jest to właściwy sposób na zrobienie tego i jedyny sposób oficjalnie obsługiwany przez opiekunów pakietu shadow. Zobacz ten raport o błędach .
yardena
6

Możesz użyć expect w skrypcie bash.

Od http://www.seanodonnell.com/code/?id=21

#!/usr/bin/expect 
######################################### 
#$ file: htpasswd.sh 
#$ desc: Automated htpasswd shell script 
######################################### 
#$ 
#$ usage example: 
#$ 
#$ ./htpasswd.sh passwdpath username userpass 
#$ 
###################################### 

set htpasswdpath [lindex $argv 0] 
set username [lindex $argv 1] 
set userpass [lindex $argv 2] 

# spawn the htpasswd command process 
spawn htpasswd $htpasswdpath $username 

# Automate the 'New password' Procedure 
expect "New password:" 
send "$userpass\r" 

expect "Re-type new password:" 
send "$userpass\r"
Carlos Tasada
źródło
5

Wiem, że przyjdę o te lata później, ale nie mogę uwierzyć, że nikt nie sugerował trybu użytkownika.

usermod --password `perl -e "print crypt('password','sa');"` root

Do diabła, na wypadek, gdyby ktoś chciał to zrobić na starszym HPUX, którego możesz użyć usermod.sam.

/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username

Opcja -F jest potrzebna tylko wtedy, gdy osoba wykonująca skrypt jest bieżącym użytkownikiem. Oczywiście nie musisz używać Perla do tworzenia skrótu. Zamiast tego możesz użyć openssl lub wielu innych poleceń.

Jeight
źródło
3

Oto skrypt, który zrobi to za Ciebie .....

Możesz dodać listę użytkowników (lub tylko jednego użytkownika), jeśli chcesz, wszyscy za jednym razem i każdy będzie miał inne hasło. Jako bonus otrzymasz na końcu skryptu listę wszystkich haseł użytkowników. .... Jeśli chcesz, możesz dodać opcje konserwacji użytkownika

lubić:

chage -m 18 $user
chage -M 28 $user

do skryptu, który ustawi wiek hasła i tak dalej.

=======

#!/bin/bash

# Checks if you have the right privileges
if [ "$USER" = "root" ]
then

# CHANGE THIS PARAMETERS FOR A PARTICULAR USE
PERS_HOME="/home/"
PERS_SH="/bin/bash"

   # Checks if there is an argument
   [ $# -eq 0 ] && { echo >&2 ERROR: You may enter as an argument a text file containing users, one per line. ; exit 1; }
   # checks if there a regular file
   [ -f "$1" ] || { echo >&2 ERROR: The input file does not exists. ; exit 1; }
   TMPIN=$(mktemp)
   # Remove blank lines and delete duplicates 
   sed '/^$/d' "$1"| sort -g | uniq > "$TMPIN"

   NOW=$(date +"%Y-%m-%d-%X")
   LOGFILE="AMU-log-$NOW.log"

   for user in $(more "$TMPIN"); do
      # Checks if the user already exists.
      cut -d: -f1 /etc/passwd | grep "$user" > /dev/null
      OUT=$?
      if [ $OUT -eq 0 ];then
         echo >&2 "ERROR: User account: \"$user\" already exists."
         echo >&2 "ERROR: User account: \"$user\" already exists." >> "$LOGFILE"
      else
         # Create a new user
         /usr/sbin/useradd -d "$PERS_HOME""$user" -s "$PERS_SH" -m "$user"
         # passwdgen must be installed
         pass=$(passwdgen -paq --length 8)
         echo $pass | passwd --stdin $user
         # save user and password in a file
         echo -e $user"\t"$pass >> "$LOGFILE"
         echo "The user \"$user\" has been created and has the password: $pass"
      fi
   done
   rm -f "$TMPIN"
   exit 0
else
   echo >&2 "ERROR: You must be a root user to execute this script."
   exit 1
fi

===========

Mam nadzieję że to pomoże.

Pozdrawiam, Carel

Carel Lubbe
źródło
2

Testowałem we własnym skrypcie powłoki.

  • $new_username oznacza nowo utworzonego użytkownika
  • $new_password oznacza nowe hasło

Dla CentOS

echo "$new_password" | passwd --stdin "$new_username"

Dla Debiana / Ubuntu

echo "$new_username:$new_password" | chpasswd

Dla OpenSUSE

echo -e "$new_password\n$new_password" | passwd "$new_username"

źródło
1

Rozwiązanie Tralemonkey również prawie dla mnie zadziałało ... ale nie całkiem. Skończyło się to tak:

echo -n '$#@password@#$' | passwd myusername --stdin

2 kluczowe szczegóły, których jego rozwiązanie nie zawierało, -nutrzymuje echo przed dodaniem \ndo szyfrowanego hasła, a pojedyncze cudzysłowy chronią zawartość przed interpretacją przez powłokę (bash) w moim przypadku.

BTW Uruchomiłem to polecenie jako root w systemie CentOS 5.6 na wypadek, gdyby ktoś się zastanawiał.

slm
źródło
dobry haczyk, nie jestem pewien, jak innym udało się sprawić, by działał z nową wersją.
M03
1

Rozwiązanie, które działa zarówno na Debianie, jak i na Red Hat. Zależy od perla, używa skrótów sha-512:

cat userpassadd
    #!/usr/bin/env bash

    salt=$(cat /dev/urandom | tr -dc A-Za-z0-9/_- | head -c16)
    useradd -p $(perl -e "print crypt('$2', '\$6\$' . '$salt' . '\$')") $1

Stosowanie:

userpassadd jim jimslongpassword

Można go skutecznie wykorzystać jako jedno-liniowy, ale musisz samodzielnie podać hasło, sól i nazwę użytkownika:

useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username
golem
źródło
1

Z IBM ( https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm ):

Utwórz plik tekstowy, powiedz text.txt i wypełnij go użytkownikiem: hasło paruje w następujący sposób:

user1:password1
user2:password2
...
usern:passwordn

Zapisz plik text.txt i uruchom

cat text.txt | chpassword

Otóż ​​to. Rozwiązanie jest (a) skalowalne i (b) nie wymaga drukowania haseł w wierszu poleceń.

Wietnam Phuvan
źródło
0
{ echo $password; echo $password; } | passwd $username 
edacval
źródło
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi.
Werner,
0

Dla RedHat / CentOS oto kod, który tworzy użytkownika, dodaje hasła i czyni go sudoer:

#!/bin/sh
echo -n "Enter username: "
read uname

echo -n "Enter password: "
read -s passwd

adduser "$uname"
echo $uname:$passwd | sudo chpasswd

gpasswd wheel -a $uname
Lefty G. Balogh
źródło
0

stosowanie: ./my_add_user.sh USER PASSWD

kod:

#!/bin/bash
# my_add_user.sh

if [ "$#" -lt 2 ] 
 then
       echo "$0 username passwd"
       exit
fi

user=$1
passwd=$2

useradd $user -d /data/home/$user  -m  ;
echo $passwd | passwd $user --stdin;
hustljian
źródło