So fügen Sie einen Unix / Linux-Benutzer in ein Bash-Skript ein

9

Hier ist mein Test-Bash-Skript. Ich kann es nicht zum Laufen bringen. Ich sehe zwei Fehler:

  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.

Hier ist mein Skript:

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




Y
ENDX
exit 0

Hier ist die Ausgabe:

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$

Dies ist auf Kubuntu 12.04 LTS

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

Hier sind die Zeilen von adduser (System-Skript - von mir nicht geändert) mit Notationen der beiden relevanten Zeilennummern:

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
quelle

Antworten:

29

Verwenden Sie einfach die Befehlszeilenparameter anstelle von stdin und verwenden Sie chpasswd als Kennwort.

Zum Beispiel:

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

adduserRuft das externe Programm chfnauf, um den vollständigen Namen und andere Benutzerinformationen zu lesen. chfnliest einen Puffer voller Eingaben, einschließlich nicht nur der benötigten Daten, sondern auch der letzten YZeile. Wenn Sie danach addusernach einer Bestätigung gefragt werden, wurde die YZeile von gelesen (aber ignoriert) chfn, sodass adduserbei der Eingabe ein Dateiende angezeigt wird. Es $answerwird erwartet, dass die Variable eine Eingabezeile enthält. Da jedoch keine Eingabe zum Lesen vorhanden war, ist sie undefiniert.

Da Sie ein Skript schreiben, übergeben Sie die Daten (außer dem Kennwort) in der Befehlszeile .

Gilles 'SO - hör auf böse zu sein'
quelle