Come aggiungere automaticamente account utente e password con uno script Bash?


200

Devo avere la possibilità di creare account utente sul mio Linux (Fedora 10) e assegnare automaticamente una password tramite uno script bash (o altrimenti, se necessario).

È facile creare l'utente tramite Bash, ad esempio:

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

È possibile assegnare una password in Bash, qualcosa di funzionalmente simile a questo, ma automaticamente:

[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[whoever@server ]#

11
Perché questo è offtopico?
OrangeTux,

16
Penso che questa domanda sia in tema. Una delle tendenze più forti ora è l'atteggiamento DevOps di "configurazione come codice", ovvero che la piattaforma viene creata "programmando" una sequenza di passaggi di amministrazione che avviano l'avvio della piattaforma. Fare la gestione degli utenti in modalità script fa sicuramente parte di questa programmazione.
Dan Bergh Johnsson,

2
Come DevOps, penso che questa sia una domanda utile (con risposte utili) ma è con il mio cappello SysAdmin. Potrebbe avere più senso spostarlo su SuperUser.
Anthony Geoghegan,


Questo può anche essere risolto con uno expectscript.
Yaron,

Risposte:


122

È possibile eseguire il comando passwd e inviarlo input convogliato. Quindi, fai qualcosa del tipo:

echo thePassword | passwd theUsername --stdin

3
Il vantaggio di questo metodo è che è sicuro (si presume che echosia incorporato nella shell usata, cosa che è comunemente), almeno per quanto riguarda /proc/.
Marian,

8
Ho dovuto fare echo -e "password\npassword\n" | passwdil 13.04
d0c_s4vage il

31
--stdin è stato deprecato nei nuovi sistemi Linux. Si prega di usare chpasswd invece.
wuxb,

16
@MarkusOrreilly funziona, ma non quando si utilizza uno strumento di provisioning come Ansible. Come affermato da @Nybble, dovresti usare chpasswd. Così qui è quello che funziona: echo 'myuser:mypass' | chpasswd. Spero che aiuti.
Amir Rustamzadeh,

posso metterlo in un file docker? Penso che dovrebbe essere commestibile per la finestra mobile.
qubsup

201

Puoi anche usare chpasswd :

echo username:new_password | chpasswd

così, si cambia la password per l'utente usernamea new_password.


5
+1, Questo è lo strumento giusto per il lavoro: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K,

Funziona anche con busybox, mentre passwdnon lo fa (non c'è --stdinopzione).
Timmmm,

83

Mi stavo chiedendo la stessa cosa e non volevo fare affidamento su uno script Python.

Questa è la riga per aggiungere un utente con una password definita in una riga bash:

useradd -p $(openssl passwd -1 $PASS) $USER

25
useradd -p $(openssl passwd -1 $PASS) $USERè più moderno, poiché i tick posteriori sono obsoleti ed $()è consigliato.
Bryson,

Un problema che avevo con questo: avevo creato il mio utente con una shell di zsh, senza rendermi conto che a quel punto zsh non era stato installato. L'accesso con password non riuscirà se lo fai, quindi prima di presumere che non funzioni (funzionerà sicuramente su Arch di oggi e su Debian 7) potresti verificarlo su una nuova installazione.
Bryson,

2
useradd -m -p <password> -s /bin/bash <user>, -m Crates home directory, -s specifica la shell predefinita dell'utente, il sostituto passworde userper le tue esigenze.
ThorSummoner,

2
È inoltre possibile salare la password: useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). Penso che ciò sia necessario in seguito su Ubuntu.
Craigmj,

55

Il codice seguente ha funzionato in Ubuntu 14.04. Prova prima di usarlo in altre versioni / varianti di 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

3
non capisco--gecos
Alban,

11
it.wikipedia.org/wiki/Gecos_field Il campo gecos o GECOS è una voce nel file / etc / passwd su Unix e sistemi operativi simili. In genere viene utilizzato per registrare informazioni generali sull'account o sui suoi utenti come il loro vero nome e numero di telefono. GECOS significa sistema operativo completo elettrico generale, che è stato rinominato GCOS quando la grande divisione di sistemi di GE è stata venduta a Honeywell.
Ying

Questa è stata la risposta giusta per me su Debian 8, ha funzionato come un incantesimo sullo script bash del mio server!
levelzwo

Il campo GECOS è fondamentalmente un campo di descrizione dell'utente. Scrivi quello che vuoi laggiù.
Константин Ван,

30

Mi è piaciuto l'approccio di Tralemonkey echo thePassword | passwd theUsername --stdinanche se non ha funzionato abbastanza per me come scritto. Questo comunque ha funzionato per me.

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

-eè riconoscere \ncome nuova linea.

sudo è l'accesso root per Ubuntu.

Le doppie virgolette devono riconoscere $ed espandere le variabili.

Il comando sopra passa la password e una nuova riga, due volte, a passwd, che è ciò che passwdrichiede.

Se non si usano le variabili, penso che questo probabilmente funzioni.

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

Le virgolette singole dovrebbero essere sufficienti qui.


2
Funziona magnificamente in bash. Tuttavia, se eseguito in sh, l'opzione -e non funziona. Ho scoperto nel modo più duro che effettivamente genera "-e". Fortunatamente, l'opzione -e non è necessaria in sh, la fuga è predefinita lì. La versione portatile utilizza printf "password \ npassword \ n" | ... anziché.
Dan Bergh Johnsson,

Risposta perfetta per Ubuntu.
Mashpy Rahman,

23

Quanto segue funziona per me e testato su Ubuntu 14.04. È un liner che non richiede alcun input da parte dell'utente.

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

Tratto da @Tralemonkey


13

Puoi usare l'opzione -p.

useradd -p encrypted_password newuser

Sfortunatamente, questo richiede che tu abbia l'hash della password (dove passwd lo fa per te). Sfortunatamente, non sembra esserci un'utilità standard per eseguire l'hashing di alcuni dati, quindi dovrai scriverli tu stesso.

Ecco un piccolo script Python che ho preparato per eseguire la crittografia per te. Supponendo che tu l'abbia chiamato pcrypt, dovresti scrivere la tua riga di comando sopra per:

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

Un paio di avvertenze da tenere presente.

  1. Mentre pcrypt è in esecuzione, il testo in chiaro sarà visibile a qualsiasi utente tramite il comando ps.
  2. pcrypt usa la funzione crypt vecchio stile - se stai usando qualcosa di più moderno come un hash MD5, dovrai cambiare pcrypt.

ed ecco 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),))

Grazie R Klatchko, dovrebbe funzionare. Non riesco a credere di non sapere dell'opzione -p. Posso occuparmi di hashing da solo :)
ModernCarpentry il

5
perl -e 'print crypt ($ ARGV [0], "password")' '
mypassword

Puoi spiegarci un po 'come potrei usare la password e non la password con hash in seguito?
answerSeeker,

12

Liner singolo per creare un utente sudo con home directory e password.

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}

Eccezionale. Funziona bene nello script di distribuzione
TheRealChx101,


6

Puoi usare aspettarti nel tuo script bash.

Da 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"

5

So che arriverò a questi anni dopo, ma non posso credere che nessuno abbia suggerito usermod.

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

Al diavolo, nel caso qualcuno volesse farlo su un vecchio HPUX che puoi usare usermod.sam.

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

-F è necessario solo se la persona che esegue lo script è l'utente corrente. Ovviamente non è necessario utilizzare Perl per creare l'hash. È possibile utilizzare openssl o molti altri comandi al suo posto.


3

Ecco uno script che lo farà per te .....

Puoi aggiungere un elenco di utenti (o solo un utente) se vuoi, tutto in una volta e ognuno avrà una password diversa. Come bonus ti viene presentato alla fine dello script con un elenco di ogni password utente. .... Se vuoi puoi aggiungere alcune opzioni di manutenzione dell'utente

piace:

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

allo script che imposterà la durata della password e così via.

=======

#!/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

===========

Spero che questo ti aiuti.

Saluti, Carel


2

Ho testato nel mio script di shell.

  • $new_username significa utente appena creato
  • $new_password significa nuova password

Per CentOS

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

Per Debian / Ubuntu

echo "$new_username:$new_password" | chpasswd

Per OpenSUSE

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

1

La soluzione di Tralemonkey ha funzionato quasi anche per me ... ma non del tutto. Ho finito per farlo in questo modo:

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

2 dettagli chiave che la sua soluzione non includeva, -nmantiene l'eco dall'aggiunta di a\n password che viene crittografata e le virgolette singole proteggono il contenuto dall'interpretazione della shell (bash) nel mio caso.

A proposito, ho eseguito questo comando come root su un sistema CentOS 5.6 nel caso qualcuno si stia chiedendo.


buona cattura, non sono sicuro di come gli altri sono riusciti a farlo funzionare con la cosa newline.
M03,

1

La soluzione che funziona su Debian e Red Hat. Dipende da perl, usa hash 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

Uso:

userpassadd jim jimslongpassword

Può essere effettivamente utilizzato come one-liner, ma dovrai specificare tu stesso password, salt e username nei posti giusti:

useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username


0
{ echo $password; echo $password; } | passwd $username 

Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta.
Werner,

0

Per RedHat / CentOS ecco il codice che crea un utente, aggiunge le password e rende l'utente un 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

0

utilizzo: ./my_add_user.sh USER PASSWD

codice:

#!/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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.