buat direktori home setelah membuat pengguna

68

Saya membuat beberapa pengguna dengan:

$ useradd john

dan saya lupa menentukan parameter -muntuk membuat direktori home dan memiliki file kerangka disalin ke setiap pengguna. sekarang saya ingin melakukan itu, dan saya tidak ingin membuat ulang semua pengguna (pasti ada cara yang lebih mudah). jadi, apakah ada cara untuk membuat direktori pengguna dan menyalin file kerangka?

Saya berpikir tentang membuat direktori, mengunyahnya ke pengguna yang sesuai, menyalin semua file kerangka dan mengunyahnya ke pengguna yang sesuai. tetapi jika ada perintah seperti useradd -mitu tidak membuat pengguna lagi, tetapi membuat direktori, itu akan lebih baik.

cd1
sumber
Apakah ini terjadi pada daftar besar pengguna?
David Rickman
Saya memiliki sekitar 10 pengguna dengan masalah ini.
cd1
Saya merasa Rahul memiliki jawaban terbaik untuk pertanyaan Anda. Mungkin Anda harus meninjau kembali jawaban yang Anda terima?

Jawaban:

17

Ini mungkin terdengar seperti ide yang konyol, tetapi jika pengguna tidak benar-benar melakukan apa pun, Anda dapat melakukan:

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

Kemudian edit /tmp/users.list untuk hanya berisi pengguna yang Anda inginkan. Kemudian lakukan:


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

Namun, banyak distribusi berbasis Redhat akan membuat Anda direktori home baru ketika Anda pertama kali login, asalkan ditentukan di / etc / passwd di mana direktori seharusnya berada.

Untuk mengujinya, lakukan "su -" dan lihat apakah itu "hal yang benar". Jika tidak, skrip di atas akan berfungsi dengan baik, saya pikir.

dotwaffle
sumber
1
ya, itu berhasil, meskipun itu menciptakan UID dan GID baru (tapi itu bukan masalah). tapi saya lupa untuk membuat cadangan kata sandi dari / etc / shadow, sekarang pengguna harus mengatur kata sandi mereka lagi = /
cd1
Jika ia menciptakan mereka baru-baru ini, ia mungkin dapat melakukannya: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Itu seharusnya hanya mengambil UID pengguna yang valid, dan bukan pengguna sistem.
David Rickman
Bagaimana dengan kata sandi, apakah tetap sama? Saya takut tidak!
matematika
for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil
mengapa menggunakan grep atau dipotong dengan kucing dan dengan pipa, mengapa tidak langsung dengan cara ini? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r
97

Anda juga bisa menggunakannya mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]
Rahul Patil
sumber
13
Ini adalah satu-satunya jawaban yang benar-benar menjawab pertanyaan tanpa beberapa skrip 10 baris.
Brendan Byrd
Ini dan jawaban pam adalah yang terbaik di sini, terima kasih. Jangan pernah mengacaukan file-file itu dengan tangan jika Anda bisa menghindarinya.
h4unt3r
1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: Tidak ada file atau direktori seperti itu
Dimitri Kopriwa
@ DimitriKopriwa sudahkah Anda mencobanya sebagai root misalnya sudo /sbin/mkhomedir_helper dka? yang /homedirektori milik rootpengguna, dan jadi saya akan membayangkan salah satu harus menjadi root untuk membuat subdirektori daripadanya.
Jonathan
15

Anda harus membuat direktori pengguna secara manual. Ini membutuhkan tiga langkah:

  1. Buat direktori sesuai dengan /etc/passwd, biasanya sudah ada entri / home / login.
  2. Salin file awal dari / etc / skel
  3. Dan akhirnya mengatur hak akses:

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

BTW: Saya selalu melewatkan -mopsi untuk useradd juga. Setidaknya sistem berbasis Debian harus memiliki adduserperintah, yang saya sarankan di atas useradd. Jika Anda melewatkan -mopsi itu mungkin juga layak dipertimbangkan deluserdan kemudian menciptakan kembali pengguna dengan opsi yang tepat.

Sunting: Ditambahkan -runtuk menyalin juga direktori.

matematika
sumber
Apakah itu: usernameh = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
Aki
Secara pribadi saya tidak suka chmod 755, karena memungkinkan pengguna untuk memata-matai rumah pengguna lain. Saya pikir setiap pengguna harus secara eksplisit memberikan akses kepada orang lain. Sebagai public_htmlkebutuhan setidaknya xset bit, saya akan merekomendasikan chmod 0711pada setiap rumah, public_htmldan direktori yang sama sebagai default.
matematika
juga, gunakan cp -r untuk skel, karena selain itu tidak akan menyalin direktori (.ssh).
Aki
Pada sistem saya (Arch Linux on ARM) cp -r /etc/skel/.*kambuh kembali ke / etc / dan salin semua data dari sini (/etc/skel/.* cocok dengan / etc / skel / .. Saya harapkan). Solusi dari superuser.com/a/61619/22153 tampaknya berhasil: cp -r / etc / skel / home / user (/ home / user tidak boleh ada sebelum menjalankan perintah)
zpon
Saya kira Anda shell globbing mengembang *dengan .(dot). Jadi ..cocok. Apakah saya benar? Banyak shell menonaktifkan ini per default, karena perilaku tersebut. Shell mana yang Anda gunakan?
matematika
14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

Itu harus melakukan trik saya percaya

David Rickman
sumber
2
ia mengatakan: usermod: no changes. dan direktori tidak dibuat. itu tidak berfungsi baik dengan -mopsi.
cd1
1
Baik. Saya tahu mengapa itu tidak berhasil, useradd dulu hanya menaruh $ HOME_DIR di / home kecuali Anda menentukan sebaliknya. Sekarang tampaknya secara otomatis memasukkannya ke / home / $ USER. Cara yang murah mungkin untuk usermod -d / home / john2 -m john kemudian jalankan usermod -d / home / john -m.
David Rickman
Nevermind itu tidak berhasil juga.
David Rickman
1
Setidaknya Anda mempelajari sesuatu yang baru.
David Rickman
1
Anda lupa menyalin isi / etc / skel / + chown rekursif untuk file-file baru tersebut. usermod tidak akan berfungsi karena di sini direktori telah terdaftar tetapi tidak dibuat, usermod tidak akan melakukan apa-apa.
Aki
9

Anda dapat menggunakan sesuatu seperti pam_mkhomedir untuk mencegah hal ini menjadi masalah dengan pengguna mana pun di masa mendatang. pam_mkhomedir adalah modul PAM yang secara otomatis membuat direktori home pengguna saat login jika tidak ada, dan mengisinya dengan file dari / etc / skel (atau direktori skel apa pun yang Anda tentukan).

Ini juga merupakan pendekatan yang dapat diskalakan karena akan terus menyelesaikan masalah ini jika Anda pernah mengalihkan repositori pengguna Anda ke layanan direktori seperti LDAP di masa mendatang.

jgoldschrafe
sumber
4

Dalam kasus saya, volume rumah rusak dan saya memutuskan untuk membangun kembali dari awal karena tidak banyak data yang terlibat tetapi saya ingin menyimpan informasi login pengguna, jadi saya membuat kembali direktori home secara manual dengan skrip ini:

#!/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
SP Arif Sahari Wibowo
sumber
2

Jika Anda mengedit /etc/login.defsmengandung

CREATE_HOME yes

maka direktori home akan secara otomatis dibuat untuk setiap pengguna di masa depan, kecuali jika Anda memberi tahu sistem untuk tidak melakukannya.

Opsi lain adalah menggunakan PAM untuk login, dan menggunakan modul pam_mkhomedir untuk secara otomatis membuat homedir pada login pertama.

Jenny D kata Reinstate Monica
sumber
0

Langkah pertama saya setelah melakukan useraddadalah untuk su - <user>.

Membuat direktori home, menyalin kerangka, dll - setidaknya pada kotak CentOS 4 saya paling sering melakukannya.

warren
sumber
0

Login dengan john pengguna dan tulis dari shell:

xdg-user-dirs-update

Itu dia! Jangan gunakan sudo atau su, Anda tidak perlu akses root untuk membuat beberapa direktori. Dari akun root, Anda dapat menggunakan:

sudo -u john xdg-user-dirs-update

Dengan begitu, Anda akan menjalankan perintah sebagai john, yang dapat berguna jika Anda melakukan kesalahan dengan lebih dari satu pengguna.

Pedro José Piquero Plaza
sumber
-1

Inilah yang dilakukan mkhomedir_helper $USERNAMEperintah.

Rory
sumber
1
Tidak ada nilai yang ditambahkan dengan mengulangi apa yang sudah dijawab jawaban lain dua tahun lalu.
kasperd
-2

Anda cukup mengedit / etc / passwd. Bidang kedua ke terakhir adalah direktori home pengguna.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash
Greeblesnort
sumber
Mereka pengguna sudah dibuat. Direktori rumah tidak dibuat karena dia lupa sakelar.
David Rickman
Saya tidak bermaksud mengubah direktori home pengguna, saya bermaksud membuat direktori dan menyalin file kerangka ke dalamnya dengan izin yang sesuai setelah pengguna telah ditambahkan.
cd1
-2
usermod -d /home/john john

atau

usermod --home /home/john john

dan baca

man usermod

;)

pengguna280139
sumber
2
Pertanyaannya lebih kompleks dari itu - dan sudah memiliki jawaban yang lebih baik.
Esa Jokinen