Cách thêm người dùng unix / linux vào tập lệnh bash


9

Đây là kịch bản bash thử nghiệm của tôi. Tôi không thể làm cho nó hoạt động. Tôi đang thấy hai lỗi:

  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.

Đây là kịch bản của tôi:

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




Y
ENDX
exit 0

Đây là đầu ra:

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$

Đây là trên Kubfox 12.04 LTS

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

Dưới đây là các dòng từ adduser (tập lệnh hệ thống - không được sửa đổi bởi tôi) với các ký hiệu của hai số dòng có liên quan:

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
}

Câu trả lời:


30

Chỉ cần sử dụng các tham số dòng lệnh thay vì stdin và sử dụng chpasswd cho mật khẩu.

Ví dụ:

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

2

addusergọi chương trình bên ngoài chfnđể đọc tên đầy đủ và thông tin người dùng khác. chfnđọc một bộ đệm đầu vào, bao gồm không chỉ những gì nó cần mà cả Ydòng cuối cùng . Khi adduseryêu cầu xác nhận sau đó, Ydòng đã được đọc (nhưng bị bỏ qua) bởi chfnvì vậy addusersẽ thấy phần cuối của tệp trên đầu vào của nó. Biến $answernày dự kiến ​​sẽ chứa một dòng đầu vào, nhưng vì không có đầu vào để đọc nên nó không được xác định.

Vì bạn đang viết một tập lệnh, hãy truyền dữ liệu (ngoại trừ mật khẩu) trên dòng lệnh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.