Hola a todos.
Hace tiempo que busco la manera de solucionar esto y no lo puedo hacer.
Tengo un archivo de datos en modo txt sacado del archivo passwd, al que le he suprimido todo menos los siguientes datos:
usuario:nombre:grupo:home
Por ejemplo:
gSanabria:Gustavo Sanabria:Estadistica:/home/estadistica/gSanabria
Con un script que encontre en Internet para agregar usuarios desde un archivo me funciona pero siempre y cuando no use el “nombre” ya que ahí falla el script, es decir, no me trae correctamente el nombre completo del usuario. El script en cuestion es:
#script to add many users .
#here you will have to create a file called users.dat in /root dir.
#the format of the file should be as below
#USER:GROUPNAME:HOMEDIRECTORY:SHELL
#the script will take the parameters as input and configure the user.
#the passwd of the user will also be configured thru the script.
#you can add as many users as you want via this script by editing the /tmp/users.dat file.
#
#script by Suhas Oka...........
for i in `cat /root/users.dat`
do
USER=`echo $i | awk -F":" '{print $1}'`
GROUP=`echo $i | awk -F":" '{print $2}'`
DIR=`echo $i | awk -F":" '{print $3}'`
SHELL=`echo $i | awk -F":" '{print $4}'`
/usr/sbin/useradd -g $GROUP -d $DIR -m -s $SHELL $USER
done
#script to add single user.....
Yo lo modifique para incluir el nombre de esta forma:
USER=`echo $i | awk -F":" '{print $1}'`
NAMEUSU=`echo $i | awk -F":" '{print $2}'`
GROUP=`echo $i | awk -F":" '{print $3}'`
DIR=`echo $i | awk -F":" '{print $4}'`
SHELL=`echo $i | awk -F":" '{print $5}'`
/usr/sbin/useradd -g $GROUP -d $DIR –c $NAMEUSU -m -s $SHELL $USER
done
Pero no funciona porque no reconoce el espacio en blanco del nombre completo del usuario y me trunca y desacomoda el resto de los datos.
Alguien tiene alguna sugerencia de cómo lo puedo hacer?
Saludos cordiales,
/usr/sbin/useradd -g $GROUP -d $DIR -c "$NAMEUSU" -m -s $SHELL $USER
^^^^^^^^^^
Notar la variable entre comillas.
apt-salutti
--ejg
--
To UNSUBSCRIBE, email to debian-user-s...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
El script que estás usando como base para tus modificaciones deja
bastante qué desear. Procura no aprender mucho de ese código.
> Alguien tiene alguna sugerencia de cómo lo puedo hacer?
------------------------------------------------------------------------
#! /bin/bash
while IFS=: read -r -a datos
do
# Estas asignaciones son innecesarias. Se hacen por legibilidad.
usuario="${datos[0]}"
nombre="${datos[1]}"
grupo="${datos[2]}"
home="${datos[3]}"
# Hacer algo con los datos aquí.
# En tu caso, probablemente será algo como
#
# useradd -g "$grupo" -d "$home" -m -c "$nombre" -s /bin/false\
# "$usuario"
#
# Ojo, cuida las comillas, y verifica el error al retorno de
# useradd!
#
# Unos echos, por mientras.
echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"
done
------------------------------------------------------------------------
Este script muy probablemente requiere bash(1), no cualquier sh. Pero
estamos en debian-user-spanish, asi que eso no debería ser un
problema...
Úsalo redirigiendo la entrada desde tu archivo, e.g.
script.sh < /tmp/usuarios.dat
Tomar el nombre del archivo como parámetro es trivial, claro, pero así
es un poco más simple, y quizá hasta más flexible (puedes teclear los
datos de entrada, o pipearlos desde un sed(1), por ejemplo).
> Saludos cordiales,
Iguanas.
-CR
-----Mensaje original-----
De: César Rincón [mailto:cri...@et.com.mx]
Enviado el: miércoles, 28 de julio de 2004 20:14
Para: debian-us...@lists.debian.org
Asunto: Re: Una consulta sobre grep
Carlos.
Estoy copiando de vuelta a la lista, para el archivo.
> No he conseguido hacer funcionar el script que me diste, porque no
> entiendo bien su funcionamiento.
Lee el manual builtins(7), especialmente el comando "read". Creo que
todo lo que hay que saber acerca de este script está documentado en esa
sección.
Si no estás a gusto con los manuales en inglés, instala
manpages-es-extra. Ahí vienen bash(1) y builtins(7) en español.
Otras referencias:
http://es.tldp.org/COMO-INSFLUG/COMOs/Bash-Prog-Intro-COMO/
http://www.demiurgo.org/doc/shell/shell.html
> Lo copie a un archivo que se llama prueba.sh tal como te muestro a
> continuacion.
[...]
> Pero no funciona me dice: ./prueba.sh: datos[0]: command not found
Curioso. Acabo de usar tu mensaje para recrear el script y el archivo
de datos, y funciona perfectamente en mi máquina. Parece que tu bash no
soportara arreglos, o algo así. ¿Qué versión estás usando?
Como sea, me hiciste leer el manual de nuevo, y darme cuenta de lo sucio
que es usar un arreglo para esto. Prueba mejor así:
------------------------------------------------------------------------
#! /bin/sh
while IFS=: read -r usuario nombre grupo home
do
echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"
done
------------------------------------------------------------------------
Hasta donde sé esto no contiene "bashismos", debería correr en cualquier
shell POSIX. Yo lo probé en bash, pdksh, ash y dash. Me sorprendería
mucho que tuvieras problemas con esto.
> Debe ser realmente trivial, pero no sé como se hace esto, como dije no
> conozco practicamente nada de scritp y menos aun bash, sed, etc. Aparte
> mi ingles no es muy bueno para entender la documentacion
------------------------------------------------------------------------
#! /bin/sh
if [ $# -ne 1 ] ; then
echo "Uso: $0 archivo" >&2
exit 1
fi
(while IFS=: read -r usuario nombre grupo home
do
echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"
done) < "$1"
------------------------------------------------------------------------
Tú dirás si es trivial o no. Alternativamente, puedes definir el while
dentro de una función, y llamar a la función redirigiendo su entrada.
Yo haría eso si hubiera mucho código dentro de ese while.
Saludos cordiales,