crear directorios de inicio después de crear usuarios


68

Creé algunos usuarios con:

$ useradd john

y olvidé especificar el parámetro -mpara crear el directorio de inicio y copiar los archivos de esqueleto a cada usuario. ahora quiero hacer eso, y no quiero recrear a todos los usuarios (debe haber una manera más fácil). Entonces, ¿hay alguna forma de crear los directorios de usuarios y copiar los archivos de esqueleto?

Pensé en crear los directorios, compartirlos con el usuario correspondiente, copiar todos los archivos de esqueleto y compartirlos con el usuario correspondiente. pero si hay un comando como useradd -mese no crea al usuario nuevamente, pero crea los directorios, sería mejor.


¿Pasó esto con una gran lista de usuarios?
David Rickman

Tenía alrededor de 10 usuarios con este problema.
cd1

No puedo evitar sentir que Rahul tiene la mejor respuesta a tu pregunta. ¿Quizás deberías volver a visitar tu respuesta aceptada?

Respuestas:


17

Esto puede sonar como una idea tonta, pero si los usuarios no están haciendo nada, puedes hacer lo siguiente:

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

Luego edite /tmp/users.list para contener solo los usuarios que desea. Entonces hazlo:


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

Sin embargo, muchas distribuciones basadas en Redhat le crearán un nuevo directorio de inicio cuando inicie sesión por primera vez, siempre que se especifique en / etc / passwd donde debería estar el directorio.

Para probar eso, haga un "su -" y vea si hace "lo correcto". Si no es así, creo que el script anterior funcionará bastante bien.


1
sí, funcionó, aunque creó nuevos UID y GID (pero eso no fue un problema). pero olvidé hacer una copia de seguridad de las contraseñas de / etc / shadow, ahora los usuarios tendrán que configurar sus contraseñas nuevamente = /
cd1

Si los creó recientemente, podría hacer: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Eso solo debería tomar UID de usuarios válidos, y no usuarios del sistema.
David Rickman

¿Qué pasa con las contraseñas, siguen siendo las mismas? ¡No temo!
Matemáticas

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

¿Por qué usar grep o cortar con cat y con pipa, por qué no directamente de esta manera? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r

97

También puedes usar mkhomedir_helper

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

13
Esta es la única respuesta que realmente responde la pregunta sin un script de 10 líneas.
Brendan Byrd

Esto y la respuesta de pam son los mejores aquí, gracias. Nunca te metas con esos archivos a mano si puedes evitarlo.
h4unt3r

1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: No existe tal archivo o directorio
Dimitri Kopriwa

@DimitriKopriwa, ¿lo has probado como root, por ejemplo sudo /sbin/mkhomedir_helper dka? el /homedirectorio pertenece al rootusuario, por lo que me imagino que uno tendría que ser root para crear un subdirectorio del mismo.
Jonathan

15

Deberá crear el directorio de usuarios manualmente. Esto requiere tres pasos:

  1. Cree un directorio de conformidad /etc/passwd, por lo general, ya habrá una entrada / home / login.
  2. Copie los archivos iniciales de / etc / skel
  3. Y finalmente establezca los permisos correctos:

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

Por cierto: siempre extraño la -mopción de useradd también. Al menos los sistemas basados ​​en Debian deberían tener un addusercomando, que recomiendo sobre useradd. Si perdió la -mopción, también podría valer la pena considerar delusery luego recrear al usuario con las opciones adecuadas.

Editar: agregado -rpara copiar también directorios.


Hizo eso: usernameh = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
Aki

Personalmente, no me gusta el chmod 755, ya que permite a los usuarios espiar a otros usuarios en casa. Creo que cada usuario debería otorgar explícitamente acceso a otros. Como public_htmlnecesita al menos un xbit establecido, recomendaría chmod 0711en cada inicio public_htmly directorios similares por defecto.
matemáticas

también, use cp -r para skel, ya que de lo contrario no copiará directorios (.ssh).
Aki

En mi sistema (Arch Linux en ARM) cp -r /etc/skel/.*vuelvo a recurrir a / etc / y copia todos los datos desde aquí (/etc/skel/.* coincide / etc / skel / ... espero). La solución de superuser.com/a/61619/22153 parece funcionar: cp -r / etc / skel / home / user (/ home / user no debe existir antes de ejecutar el comando)
zpon

Supongo que tu globo de concha se expande *con .(punto). Entonces ..es igualado. Estoy en lo cierto? Muchos shells deshabilitan esto por defecto, debido a tal comportamiento. ¿Qué caparazón usas?
Matemáticas

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

Eso debería hacer el truco, creo


2
que dice: usermod: no changes. y el directorio no se crea. tampoco funciona con la -mopción.
cd1

1
Bien. Descubrí por qué eso no funcionó, useradd solía poner solo $ HOME_DIR en / home a menos que especifique lo contrario. Ahora parece ponerlo automáticamente en / home / $ USER en su lugar. Una forma económica podría ser usermod -d / home / john2 -m john y luego ejecutar usermod -d / home / john -m.
David Rickman

No importa eso tampoco funciona.
David Rickman

1
Bueno, al menos aprendiste algo nuevo.
David Rickman

1
Olvidó copiar el contenido de / etc / skel / + chown recursive para esos nuevos archivos. usermod no funcionaría ya que aquí el directorio se registró pero no se creó, usermod no hará nada.
Aki

9

Puede usar algo como pam_mkhomedir para evitar que esto sea un problema para los usuarios en el futuro. pam_mkhomedir es un módulo PAM que crea automáticamente el directorio de inicio de un usuario al iniciar sesión si no existe, y lo llena con archivos de / etc / skel (o cualquier directorio de skel que especifique).

Este también es un enfoque muy escalable porque continuará resolviendo este problema si alguna vez cambia su repositorio de usuario a un servicio de directorio como LDAP en el futuro.


4

En mi caso, el volumen de inicio se corrompió y decidí simplemente reconstruirlo desde cero, ya que no hay muchos datos involucrados, pero quiero mantener la información de inicio de sesión de los usuarios, así que recreé los directorios de inicio manualmente con este 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

Si editas /etc/login.defspara contener

CREATE_HOME yes

a continuación, los directorios de inicio se crean automáticamente para los usuarios futuros, a menos que usted le dice al sistema de no hacerlo.

Otra opción es usar PAM para inicios de sesión, y usar el módulo pam_mkhomedir para crear automáticamente el homedir en el primer inicio de sesión.


0

Mi primer paso después de hacer un useraddes su - <user>.

Crea los directorios de inicio, copia esqueletos, etc., al menos en el cuadro CentOS 4 lo hago con mayor frecuencia.


0

Inicie sesión con el usuario john y escriba desde un shell:

xdg-user-dirs-update

¡Eso es! No use sudo o su, no necesita acceso root para crear algunos directorios. Desde una cuenta raíz, puede usar:

sudo -u john xdg-user-dirs-update

De esa manera, ejecutará el comando como John, que puede ser útil si cometió el error con más de un usuario.


-1

Esto es exactamente lo que hace el mkhomedir_helper $USERNAMEcomando.


1
No se agrega valor repitiendo lo que otra respuesta ya explicó hace dos años.
kasperd

-2

Simplemente puede editar / etc / passwd. El segundo al último campo es el directorio de inicio del usuario.

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

Los usuarios ya fueron creados. Los directorios de inicio no se crearon porque olvidó un interruptor.
David Rickman

No quise cambiar el directorio de inicio del usuario, sino crear el directorio y copiar los archivos de esqueleto con los permisos apropiados después de que el usuario haya sido agregado.
cd1

-2
usermod -d /home/john john

o

usermod --home /home/john john

y leer

man usermod

;)


2
La pregunta es más compleja que eso, y ya tiene mejores respuestas.
Esa Jokinen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.