วิธีเพิ่มผู้ใช้ unix / linux ในสคริปต์ทุบตี


9

นี่คือสคริปต์ทุบตีทดสอบของฉัน ฉันไม่สามารถทำงานได้ ฉันเห็นข้อผิดพลาดสองข้อ:

  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.

นี่คือสคริปต์ของฉัน:

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




Y
ENDX
exit 0

นี่คือผลลัพธ์:

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$

นี่คือ Kubuntu 12.04 LTS

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

นี่คือบรรทัดจาก adduser (สคริปต์ระบบ - ไม่ได้แก้ไขโดยฉัน) พร้อมเครื่องหมายของหมายเลขบรรทัดที่เกี่ยวข้องสองรายการ:

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
}

คำตอบ:


31

เพียงใช้พารามิเตอร์บรรทัดคำสั่งแทน stdin และใช้ chpasswd สำหรับรหัสผ่าน

ตัวอย่างเช่น:

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

2

adduserเรียกใช้โปรแกรมภายนอกchfnเพื่ออ่านชื่อเต็มและข้อมูลผู้ใช้อื่น ๆ chfnอ่านบัฟเฟอร์ของอินพุตรวมถึงไม่เพียง แต่สิ่งที่ต้องการ แต่Yบรรทัดสุดท้าย เมื่อadduserถามเพื่อยืนยันหลังจากนั้นYบรรทัดถูกอ่าน (แต่ไม่สนใจ) โดยchfnดังนั้นadduserจะเห็นจุดสิ้นสุดของไฟล์บนอินพุต ตัวแปร$answerคาดว่าจะมีบรรทัดอินพุต แต่เนื่องจากไม่มีอินพุตที่จะอ่านจึงไม่ได้กำหนด

เนื่องจากคุณกำลังเขียนสคริปต์ส่งผ่านข้อมูล (ยกเว้นรหัสผ่าน) ในบรรทัดคำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.