สร้างโฮมไดเรกทอรีหลังจากสร้างผู้ใช้


68

ฉันสร้างผู้ใช้บางคนด้วย:

$ useradd john

และฉันลืมระบุพารามิเตอร์-mเพื่อสร้างโฮมไดเร็กทอรีและให้คัดลอกไฟล์ Skeleton ไปยังผู้ใช้แต่ละคน ตอนนี้ฉันต้องการทำเช่นนั้นและฉันไม่ต้องการสร้างผู้ใช้ใหม่อีกครั้ง (ต้องมีวิธีที่ง่ายกว่า) ดังนั้นมีวิธีการสร้างไดเรกทอรีผู้ใช้และคัดลอกไฟล์ Skeleton?

ฉันคิดเกี่ยวกับการสร้างไดเรกทอรี chowning พวกเขาไปยังผู้ใช้ที่เกี่ยวข้องคัดลอกไฟล์ Skeleton ทั้งหมดและ chowning พวกเขาไปยังผู้ใช้ที่เกี่ยวข้อง แต่ถ้ามีคำสั่งuseradd -mที่ไม่สร้างผู้ใช้อีกครั้ง แต่สร้างไดเรกทอรีมันจะดีกว่า


สิ่งนี้เกิดขึ้นกับผู้ใช้จำนวนมากหรือไม่?
David Rickman

ฉันมีผู้ใช้ประมาณ 10 คนที่มีปัญหานี้
cd1

ฉันอดไม่ได้ที่จะรู้สึกว่าราหุลมีคำตอบที่ดีที่สุดสำหรับคำถามของคุณ บางทีคุณควรทบทวนคำตอบที่คุณยอมรับอีกครั้ง

คำตอบ:


17

นี่อาจฟังดูเป็นเรื่องงี่เง่า แต่ถ้าผู้ใช้ไม่ได้ทำอะไรคุณสามารถทำได้:

cat /etc/passwd | cut -f 1 -d : >/tmp/users.list

จากนั้นแก้ไข /tmp/users.list เพื่อให้มีผู้ใช้ที่คุณต้องการเท่านั้น จากนั้นทำ:


for i in `cat /tmp/users.list`
do
    userdel $i
    useradd -m $i
done

อย่างไรก็ตามการแจกแจงตาม Redhat จำนวนมากจะสร้างโฮมไดเร็กตอรี่ใหม่ให้คุณเมื่อคุณเข้าสู่ระบบครั้งแรก, โดยระบุไว้ใน / etc / passwd โดยที่ควรจะเป็นไดเร็กตอรี่

ในการทดสอบให้ทำ "su -" แล้วดูว่าเป็น "สิ่งที่ถูกต้อง" หรือไม่ หากไม่เป็นเช่นนั้นสคริปต์ด้านบนจะใช้งานได้ดีฉันคิดว่า


1
ใช่มันใช้งานได้แม้ว่ามันจะสร้าง UID และ GID ใหม่ (แต่นั่นก็ไม่ใช่ปัญหา) แต่ฉันลืมที่จะสำรองรหัสผ่านจาก / etc / shadow ตอนนี้ผู้ใช้จะต้องตั้งรหัสผ่านอีกครั้ง = /
cd1

หากเขาสร้างพวกเขาเมื่อเร็ว ๆ นี้เขาอาจจะทำได้: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list นั่นควรคว้า UID ของผู้ใช้ที่ถูกต้องเท่านั้นไม่ใช่ผู้ใช้ระบบ
David Rickman

รหัสผ่านจะยังคงเหมือนเดิมหรือไม่ ฉันไม่กลัว!
คณิตศาสตร์

for i in $(awk -F: '{print $1 }' /etc/passwd)
ราหุลปาติล

ทำไมต้องใช้ grep หรือ cut กับ cat และกับ pip ทำไมไม่ทำแบบนี้โดยตรง cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r

97

นอกจากนี้คุณสามารถใช้ mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]

13
นี่เป็นคำตอบเดียวที่ตอบคำถามโดยไม่มีสคริปต์ 10 บรรทัด
เบรนแดนเบิร์ด

คำตอบนี้และคำตอบแพมดีที่สุดที่นี่ขอบคุณ อย่ายุ่งกับไฟล์เหล่านั้นด้วยมือหากคุณสามารถหลีกเลี่ยงได้
h4unt3r

1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Dimitri Kopriwa

@DimitriKopriwa คุณเคยลองใช้มันในฐานะ root sudo /sbin/mkhomedir_helper dkaหรือไม่? /homeไดเรกทอรีเป็นของrootผู้ใช้และดังนั้นฉันจะคิดหนึ่งจะต้องมีรากที่จะสร้างไดเรกทอรีย่อยดังกล่าว
Jonathan

15

คุณจะต้องสร้างไดเรกทอรีผู้ใช้ด้วยตนเอง สิ่งนี้ต้องการสามขั้นตอน:

  1. สร้างไดเรกทอรีตาม/etc/passwdปกติโดยปกติจะมีรายการ / home / login
  2. คัดลอกไฟล์เริ่มต้นจาก / etc / skel
  3. และสุดท้ายกำหนดสิทธิ์ที่ถูกต้อง:

    • mkdir /home/YOU
    • cd /home/YOU
    • cp -r /etc/skel/. .
    • chown -R YOU.YOURGROUP .
    • chmod -R go=u,go-w .
    • chmod go= .

BTW: ฉันมักจะพลาด-mตัวเลือกสำหรับ useradd เช่นกัน อย่างน้อยระบบที่ใช้ Debian ควรมีadduserคำสั่งซึ่งฉันแนะนำให้มากกว่า useradd หากคุณพลาด-mตัวเลือกมันอาจคุ้มค่าที่จะพิจารณาdeluserและสร้างผู้ใช้ใหม่ด้วยตัวเลือกที่เหมาะสม

แก้ไข: เพิ่ม-rสำหรับการคัดลอกยังไดเรกทอรี


ทำอย่างนั้น: ชื่อผู้ใช้ = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ ชื่อผู้ใช้;
Aki

โดยส่วนตัวแล้วฉันไม่ชอบ 755 chmod เพราะมันช่วยให้ผู้ใช้สอดแนมในบ้านของผู้ใช้รายอื่น ฉันคิดว่าผู้ใช้แต่ละคนควรให้สิทธิ์การเข้าถึงแก่ผู้อื่นอย่างชัดเจน ตามpublic_htmlความต้องการอย่างน้อยxตั้งฉันจะแนะนำchmod 0711ในแต่ละบ้านpublic_htmlและไดเรกทอรีที่คล้ายกันเป็นค่าเริ่มต้น
คณิตศาสตร์

นอกจากนี้ให้ใช้ cp -r สำหรับ skel มิฉะนั้นจะไม่คัดลอกไดเรกทอรี (.ssh)
Aki

ในระบบของฉัน (Arch Linux บน ARM) cp -r /etc/skel/.*คืนค่าเข้าสู่ / etc / และคัดลอกข้อมูลทั้งหมดจากที่นี่ (/etc/skel/.* ตรงกัน / etc / skel / .. ฉันคาดหวัง) วิธีแก้ปัญหาจากsuperuser.com/a/61619/22153ดูเหมือนจะใช้งานได้: cp -r / etc / skel / home / user (/ home / user ต้องไม่มีอยู่ก่อนที่จะรันคำสั่ง)
zpon

ฉันเดาว่าคุณกำลังจะขยายวง*ด้วย.(dot) ดังนั้นจึง..เข้าคู่กัน ฉันถูกไหม? เชลล์จำนวนมากปิดการใช้งานนี้ต่อค่าเริ่มต้นเนื่องจากพฤติกรรมดังกล่าว คุณใช้เปลือกไหน
คณิตศาสตร์

14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

นั่นควรทำเคล็ดลับที่ฉันเชื่อ


2
มันบอกว่า: usermod: no changes. และไดเรกทอรีจะไม่ถูกสร้างขึ้น มันไม่ทำงานด้วย-mตัวเลือก
cd1

1
Alright ฉันหาสาเหตุที่ใช้งานไม่ได้ useradd เคยใส่ $ HOME_DIR ใน / home เว้นแต่คุณจะระบุเป็นอย่างอื่น ดูเหมือนว่าตอนนี้จะใส่ไว้ใน / home / $ USER โดยอัตโนมัติแทน วิธีที่ถูกอาจเป็น usermod -d / home / john2 -m john จากนั้นเรียกใช้ usermod -d / home / john -m
David Rickman

ไม่เป็นไรที่ไม่ทำงานเช่นกัน
David Rickman

1
อย่างน้อยคุณก็ได้เรียนรู้สิ่งใหม่
David Rickman

1
คุณลืมที่จะคัดลอกเนื้อหาของ / etc / skel / + chown ซ้ำสำหรับไฟล์ใหม่เหล่านั้น usermod จะไม่ทำงานเนื่องจากที่นี่มีการลงทะเบียนไดเรกทอรี แต่ไม่ได้สร้างขึ้น usermod จะไม่ทำอะไรเลย
Aki

9

คุณสามารถใช้บางอย่างเช่นpam_mkhomedirเพื่อป้องกันไม่ให้เกิดปัญหากับผู้ใช้ในอนาคต pam_mkhomedir เป็นโมดูล PAM ที่จะสร้างโฮมไดเร็กตอรี่ของผู้ใช้ในการเข้าสู่ระบบโดยอัตโนมัติหากไม่มีอยู่, และใส่ข้อมูลลงในไฟล์จาก / etc / skel (หรือไดเรกทอรีที่คุณระบุ)

นี่เป็นวิธีที่ปรับขนาดได้อย่างดีเพราะจะแก้ปัญหานี้ต่อไปหากคุณเปลี่ยนที่เก็บผู้ใช้ของคุณไปเป็นบริการไดเรกทอรีเช่น LDAP ในอนาคต


4

ในกรณีของฉันวอลุ่มในบ้านเสียหายและฉันตัดสินใจสร้างใหม่ตั้งแต่ต้นเนื่องจากมีข้อมูลไม่มากนัก แต่ฉันต้องการเก็บข้อมูลการเข้าสู่ระบบของผู้ใช้ดังนั้นฉันจึงสร้างโฮมไดเร็กตอรี่ด้วยตนเองด้วยสคริปต์นี้:

#!/bin/bash
cat /etc/passwd | while IFS=: read n x i g c d r
do
  # my system has uid started at 1000, but has nfsnobody at 65534:
  if [[ "$i" -ge 1000 && "$i" -le 65000 && ! -x "$d" ]]
  then
    cp -av /etc/skel "$d"
    chown -R "$i:$g" "$d"
    # may needed in SELinux system:
    restorecon -R "$d"
    # add your chmod as your need:
    chmod -R o-rw "$d"
  fi
done

2

หากคุณแก้ไข/etc/login.defsให้มี

CREATE_HOME yes

จากนั้นโฮมไดเร็กตอรี่จะถูกสร้างขึ้นโดยอัตโนมัติสำหรับผู้ใช้ในอนาคต, เว้นแต่คุณจะบอกให้ระบบไม่ทำเช่นนั้น

อีกตัวเลือกหนึ่งคือใช้ PAM สำหรับการเข้าสู่ระบบและใช้โมดูล pam_mkhomedir เพื่อสร้าง homedir โดยอัตโนมัติในการเข้าสู่ระบบครั้งแรก


0

ขั้นตอนแรกของผมหลังจากทำคือการuseraddsu - <user>

สร้างโฮมไดเร็กตอรี่, คัดลอกโครงกระดูก, และอื่น ๆ - อย่างน้อยในกล่อง CentOS 4 ที่ฉันทำบ่อยที่สุด.


0

เข้าสู่ระบบด้วยผู้ใช้ john และเขียนจากเปลือก:

xdg-user-dirs-update

แค่นั้นแหละ! อย่าใช้ sudo หรือ su คุณไม่จำเป็นต้องเข้าถึงรูทเพื่อสร้างบางไดเรกทอรี จากบัญชีรูทคุณสามารถใช้:

sudo -u john xdg-user-dirs-update

ด้วยวิธีนี้คุณจะดำเนินการคำสั่งเป็น john ซึ่งจะมีประโยชน์หากคุณทำผิดพลาดกับผู้ใช้มากกว่าหนึ่งราย


-1

นี่คือสิ่งที่mkhomedir_helper $USERNAMEคำสั่งทำ


1
ไม่มีการเพิ่มมูลค่าโดยการทำซ้ำสิ่งที่คำตอบอื่นได้อธิบายไปแล้วเมื่อสองปีก่อน
kasperd

-2

คุณสามารถแก้ไข / etc / passwd ได้ ฟิลด์ที่สองถึงฟิลด์สุดท้ายคือโฮมไดเร็กตอรี่ของผู้ใช้

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash

ผู้ใช้ถูกสร้างขึ้นแล้ว โฮมไดเรกทอรีไม่ได้ถูกสร้างขึ้นเพราะเขาลืมสวิตช์
David Rickman

ฉันไม่ได้ตั้งใจจะเปลี่ยนไดเรกทอรีบ้านของผู้ใช้ฉันหมายถึงการสร้างไดเรกทอรีและคัดลอกไฟล์โครงกระดูกไปยังสิทธิ์ที่เหมาะสมหลังจากผู้ใช้ถูกเพิ่ม
cd1

-2
usermod -d /home/john john

หรือ

usermod --home /home/john john

และอ่าน

man usermod

;)


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