creare home directory dopo aver creato gli utenti


68

Ho creato alcuni utenti con:

$ useradd john

e ho dimenticato di specificare il parametro -mper creare la home directory e far copiare i file scheletro a ciascun utente. ora voglio farlo e non voglio ricreare tutti gli utenti (deve esserci un modo più semplice). quindi, c'è un modo per creare le directory degli utenti e copiare i file di scheletro?

Ho pensato di creare le directory, copiarle per l'utente corrispondente, copiare tutti i file di scheletro e copiarli per l'utente corrispondente. ma se c'è un comando del genere useradd -mnon crea di nuovo l'utente, ma crea le directory, sarebbe meglio.


È successo con un ampio elenco di utenti?
David Rickman,

Ho avuto circa 10 utenti con questo problema.
cd1,

Non posso fare a meno di pensare che Rahul abbia la migliore risposta alla tua domanda. Forse dovresti rivisitare la tua risposta accettata?

Risposte:


17

Potrebbe sembrare un'idea sciocca, ma se gli utenti non stanno effettivamente facendo nulla, potresti fare:

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

Quindi modifica /tmp/users.list per contenere solo gli utenti desiderati. Quindi fa:


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

Tuttavia, molte distribuzioni basate su Redhat creeranno una nuova directory home al primo accesso, a condizione che sia specificata in / etc / passwd dove dovrebbe trovarsi la directory.

Per provarlo, fai un "su -" e vedi se fa "la cosa giusta". In caso contrario, lo script sopra funzionerà abbastanza bene, penso.


1
sì, ha funzionato, sebbene abbia creato nuovi UID e GID (ma non è stato un problema). ma ho dimenticato di fare il backup delle password da / etc / shadow, ora gli utenti dovranno reimpostare le password = /
cd1

Se li ha creati di recente, potrebbe essere in grado di fare: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Questo dovrebbe solo afferrare l'UID degli utenti validi e non degli utenti di sistema.
David Rickman,

E le password, rimangono le stesse? Non temo!
matematica

for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil,

perché usare grep o tagliare con il gatto e con la pipa, perché non direttamente in questo modo? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r

97

Inoltre puoi usare mkhomedir_helper

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

13
Questa è l'unica risposta che risponde effettivamente alla domanda senza uno script di 10 righe.
Brendan Byrd,

Questa e la risposta sono le migliori qui, grazie. Non scherzare mai con quei file a mano se puoi evitarlo.
h4unt3r,

1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: nessun file o directory del genere
Dimitri Kopriwa

@DimitriKopriwa l'hai provato come root, ad esempio sudo /sbin/mkhomedir_helper dka? la /homedirectory appartiene rootall'utente e quindi immagino che uno dovrebbe essere root per crearne una sottodirectory.
Jonathan,

15

Sarà necessario creare manualmente la directory degli utenti. Ciò richiede tre passaggi:

  1. Crea directory in conformità a /etc/passwd, di solito ci sarà già una voce / home / login.
  2. Copia i file iniziali da / etc / skel
  3. E infine impostare le autorizzazioni giuste:

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

A proposito: mi manca sempre anche l' -mopzione per useradd. Almeno i sistemi basati su Debian dovrebbero avere un addusercomando, che consiglio su useradd. Se hai perso l' -mopzione, potrebbe anche valere la pena considerare delusere quindi ricreare l'utente con le opzioni appropriate.

Modifica: aggiunto -rper copiare anche le directory.


Fatto questo: usernameh = myusername; mkdir / home / $ nomeutenteh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ nomeutenteh: $ nomeutenteh / home / $ nomeutenteh; chmod -R 755 / home / $ nomeutenteh;
Aki,

Personalmente non mi piace il chmod 755, in quanto consente agli utenti di spiare in casa di altri utenti. Penso che ogni utente dovrebbe concedere esplicitamente l'accesso agli altri. Per quanto sia public_htmlnecessario almeno un xbit impostato, consiglierei chmod 0711su ogni home public_htmle directory simili come predefinite.
matematica,

usa anche cp -r per skel, altrimenti non copierà le directory (.ssh).
Aki,

Sul mio sistema (Arch Linux su ARM) cp -r /etc/skel/.*ricerco in / etc / e copia tutti i dati da qui (/etc/skel/.* corrisponde a / etc / skel / .. mi aspetto). La soluzione di superuser.com/a/61619/22153 sembra funzionare: cp -r / etc / skel / home / user (/ home / user non deve esistere prima di eseguire il comando)
zpon

Immagino che il globbing della shell si espanda *con .(punto). Quindi ..è abbinato. Ho ragione? Molte shell lo disabilitano per impostazione predefinita, a causa di tale comportamento. Quale shell usi?
matematica

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

Questo dovrebbe fare il trucco, credo


2
dice: usermod: no changes. e la directory non è stata creata. non funziona neanche con l' -mopzione.
cd1,

1
Tutto a posto. Ho capito perché non ha funzionato, useradd ha usato solo $ HOME_DIR in / home se non diversamente specificato. Ora sembra invece inserirlo automaticamente in / home / $ USER. Un modo economico potrebbe essere usermod -d / home / john2 -m john quindi eseguire usermod -d / home / john -m.
David Rickman,

Non importa che neanche questo funzioni.
David Rickman,

1
Beh, almeno hai imparato qualcosa di nuovo.
David Rickman,

1
Hai dimenticato di copiare il contenuto di / etc / skel / + chown ricorsivo per quei nuovi file. usermod non funzionerebbe poiché qui la directory è stata registrata ma non creata, usermod non farà nulla.
Aki,

9

Puoi usare qualcosa come pam_mkhomedir per evitare che questo possa mai rappresentare un problema per gli utenti in futuro. pam_mkhomedir è un modulo PAM che crea automaticamente la home directory di un utente all'accesso se non esiste, e lo popola con i file da / etc / skel (o qualunque altra directory skel specificata).

Questo è anche un approccio ben scalabile perché continuerà a risolvere questo problema se in futuro dovessi passare il tuo repository utente a un servizio di directory come LDAP.


4

Nel mio caso, il volume home è stato danneggiato e ho deciso di ricostruirlo da zero poiché non sono presenti molti dati, ma voglio conservare le informazioni di accesso degli utenti, quindi ho ricreato manualmente le home directory con questo script:

#!/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

Se si modifica /etc/login.defsper contenere

CREATE_HOME yes

quindi le home directory verranno create automaticamente per tutti gli utenti futuri, a meno che non si dica al sistema di non farlo.

Un'altra opzione è utilizzare PAM per gli accessi e utilizzare il modulo pam_mkhomedir per creare automagicamente l'omedir al primo accesso.


0

Il mio primo passo dopo aver fatto un useraddè quello di su - <user>.

Crea le home directory, copia scheletri, ecc. - Almeno nella casella CentOS 4 lo faccio più frequentemente.


0

Accedi con l'utente john e scrivi da una shell:

xdg-user-dirs-update

Questo è tutto! Non usare sudo o su, non è necessario l'accesso root per creare alcune directory. Da un account root, puoi usare:

sudo -u john xdg-user-dirs-update

In questo modo, eseguirai il comando come john, che può essere utile se hai fatto l'errore con più di un utente.


-1

Questo è esattamente ciò che fa il mkhomedir_helper $USERNAMEcomando.


1
Nessun valore viene aggiunto ripetendo ciò che un'altra risposta ha già spiegato due anni fa.
Kasperd,

-2

Potresti semplicemente modificare / etc / passwd. Il secondo all'ultimo campo è la home directory dell'utente.

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

Loro utenti erano già stati creati. Le home directory non sono state create perché ha dimenticato un passaggio.
David Rickman,

Non intendevo cambiare la home directory dell'utente, intendevo creare la directory e copiarvi i file scheletro con le autorizzazioni appropriate dopo che l'utente è stato aggiunto.
cd1,

-2
usermod -d /home/john john

o

usermod --home /home/john john

e leggi

man usermod

;)


2
La domanda è più complessa di così - e ha già risposte migliori.
Esa Jokinen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.