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.

cd1
fuente
¿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.

dotwaffle
fuente
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>]]
Rahul Patil
fuente
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.

matemáticas
fuente
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

David Rickman
fuente
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.

jgoldschrafe
fuente
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
SP Arif Sahari Wibowo
fuente
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.

Jenny D dice Reinstate Monica
fuente
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.

madriguera
fuente
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.

Plaza Pedro José Piquero
fuente
-1

Esto es exactamente lo que hace el mkhomedir_helper $USERNAMEcomando.

Rory
fuente
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
Greeblesnort
fuente
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

;)

usuario280139
fuente
2
La pregunta es más compleja que eso, y ya tiene mejores respuestas.
Esa Jokinen