Cómo agregar un usuario unix / linux en un script bash

9

Aquí está mi script de prueba bash. No puedo hacer que funcione. Estoy viendo dos errores:

  1. Use of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
  2. Use of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.

Aquí está mi guión:

#!/bin/bash
sudo adduser myuser << ENDX
password
password
First Last




Y
ENDX
exit 0

Aquí está la salida:

me@mycomputer$ ./adduser.sh 
Adding user `myuser' ...
Adding new group `myuser' (1001) ...
Adding new user `myuser' (1001) with group `myuser' ...
Creating home directory `/home/myuser' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Changing the user information for myuser
Enter the new value, or press ENTER for the default
        Full Name []:   Room Number []:         Work Phone []:  Home Phone []:  Other []: Use of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
Use of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
Is the information correct? [Y/n] me@mycomputer$

Esto está en Kubuntu 12.04 LTS

$ bash --version
bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

Aquí están las líneas de adduser (secuencia de comandos del sistema, sin modificar por mí) con anotaciones de los dos números de línea relevantes:

for (;;) {
       my $chfn = &which('chfn');
    &systemcall($chfn, $new_name);
    # Translators: [y/N] has to be replaced by values defined in your
    # locale.  You can see by running "locale yesexpr" which regular
    # expression will be checked to find positive answer.
    print (gtx("Is the information correct? [Y/n] "));
    chop (my $answer=<STDIN>);        <-- LINE 589
    last if ($answer !~ m/$noexpr/o); <-- LINE 590
}
MountainX
fuente

Respuestas:

30

Simplemente use los parámetros de la línea de comandos en lugar de stdin, y use chpasswd para la contraseña.

Por ejemplo:

sudo adduser myuser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
echo "myuser:password" | sudo chpasswd
jelle foks
fuente
2

adduserllama al programa externo chfnpara leer el nombre completo y otra información del usuario. chfnlee un búfer de entrada, que incluye no solo lo que necesita sino la última Ylínea. Cuando se addusersolicita confirmación después, la Ylínea ha sido leída (pero ignorada) por chfnlo que adduserve un final de archivo en su entrada. Se $answerespera que la variable contenga una línea de entrada, pero como no había entrada para leer, no está definida.

Como está escribiendo un script, pase los datos (excepto la contraseña) en la línea de comando .

Gilles 'SO- deja de ser malvado'
fuente