leer datos desde bash
-
Hola, quiero hacer lo siguiente, tengo un archivo de texto con el siguiente contenido.
juan 192.168.100.10 00:45:f7:d4:87:a1
pedro 192.168.100.11 00:b5:63:c2:ff:83
Quiero saber como puedo leer cada linea y guardarla en un array o en una variable de un script.
Gracias - Te paso 2 formas para que cada linea te quede en la variable a y luego la puedas parsear o hacer lo que quieras con ella. Cambia el /tmp/miarchivo.txt hacia la ubicacion y nombre de tu archivo.
Escrito por lucasoria
FORMA 1:FORMA 2:cat /tmp/miarchivo.txt | while read a #
do
echo $a # Mostras solo el contenido de la linea, aca hace lo que quieras
doneUn ejemplo para que de tu archivo queden solo las IPs sería:for a in `cat /tmp/miarchivo.txt`
do
echo $a # Mostras solo el contenido de la linea, aca hace lo que quieras
doneY listo.. más facil no te lo puedo hacer al ejemplo.cat /tmp/miarchivo.txt | while read IP
do
echo $IP | awk '{print $2}'
done
Saludos. -
Hola, gracias por tu respuesta, pero todavia no entiendo bien (soy nuevo en esto).
Yo lo que deseo hacer es que cuando ejecuto el script, me lea el archivo con los datos de los clientes, o sea nombre, ip, mac, etc, y me genere reglas de iptables en base a los datos leidos.
Una regla de iptables por cada cliente cargado en el archivo,y tambien si se puede verificar si se cumplen ciertas condiciones ejecuta tal comando y si no se cumple ejecuta otro.
Gracias. - Te entiendo y me agarraste con tiempo así que veo si te puedo explicar un toque que hacer. No va a ser en detalle así que lo vas a tener que adaptar a tu escenario.
Escrito por lucasoria
Básicamente necesitás dos cosas:
a) Un shell que es el que va a generar las reglas del firewall de acuerdo a las condiciones.
b) Un archivo en texto plano que es el que va a contener los datos de los clientes con algún field separator entre dato y dato, por ejemplo, una "," es un buen separador de campos.
- El shell lo vamos a llamar firewall.sh
- El archivo lo vamos a llamar datos.txt
El contenido del archivo datos.txt separados por comas (nombre de la empresa,ip)El contenido del shell:aerolineas_argentinas,10.0.72.1
curitas,10.0.73.1
catupechoenterprise,10.0.82.1Esto que te paso es un ejemplo maso menos.. en realidad el if debería ser anidado o se podría utilizar también un case o un while not. El hecho es que prefiero pasartelo así desglozado porque funciona igual y lo vas a entender mejor.
Acá poné todo lo referente al arranque de tu firewall......
for a in `cat datos.txt`
do
EMPRESA=`echo $a | cut -d ',' -f1`
IP=`echo $a | cut -d ',' -f2`
if [ "${EMPRESA}" = "aerolineas_argentinas"] && ["${IP}" -eq "10.0.72.1"]
then # Lo que hace si la empresa es aerolineas y la ip = 10.0.72.1
iptables -A INPUT .... etc etc etc $IP etc etc etc
else # Lo que hace si la empresa no es aerolineas o la ip no es igual a 10.0.72.1
echo "Algun dato de la empresa $EMPRESA está mal"
fi
if [ "${EMPRESA}" = "curitas"] && ["${IP}" -eq "10.0.73.1"]
then # Lo que hace si la empresa es curitas y la ip = 10.0.73.1
iptables -A INPUT .... etc etc etc $IP etc etc etc
else # Lo que hace si la empresa no es curitas o la ip no es igual a 10.0.73.1
echo "Algun dato de la empresa $EMPRESA está mal"
fi
if [ "${EMPRESA}" = "catupechoenterprise"] && ["${IP}" -eq "10.0.82.1"]
then # Lo que hace si la empresa es catupechoenterprise y la ip = 10.0.82.1
iptables -A INPUT .... etc etc etc $IP etc etc etc
else # Lo que hace si la empresa no es catupechoenterprise o la ip no es igual a 10.0.82.1
echo "Algun dato de la empresa $EMPRESA está mal"
fi
done
Básicamente lo que hace el shell cargar el archivo en un ciclo for, leer los dos campos, guarda en la variable EMPRESA el valor que está antes de la primer "," y guarda en la variable IP el valor que está después de la primer coma.
Luego, pregunta si el valor de la variable EMPRESA es igual a aerolineas_argentinas y si el valor de la variable IP es igual a 10.0.72.1. En caso afirmativo aplica una cadena de iptables a la empresa , en caso negativo te devuelve por pantalla un comentario diciendote que algun valor está mal.
Creo que esto responde a tu pregunta de como hacer un shell que existan condiciones de acuerdo al contenido de un archivo.
Saludos. -
HUUUUUUU!!!! no me esperaba tan grosa respuesta a prueba de "monkikis" como yo que recien empezamos en esto y por ahi nos trabamos con algo.
Desde ya muchas gracias, me sirvio muchisimo y ya lo entiendo bien al tema.
Pero en mi afan de aprender mas, buscando por ahi encontre algo asi, a ver que les parece:
# declaro una funcion correspondiente a cada cliente#
clientes='CL1 CL2' # y asi cada "cliente" #
CL1() {
nombre='monkiki'
ip='192.168.100.10';
mac='ab:cd:ef:12:34:56';
}
CL2() {
nombre='juancito'
ip='192.168.100.11';
mac='ba:dc:fe:98:76:54';
}
# y ahora con un for voy ejecuntando una linea pro cada cliente
for a in clientes
do a
iptables -A FORWARD -s $ip -m mac --mac $mac -j ACCEPT
done
# tambien puedo agregar condiciones en los datos de cada cliente, como si es nat o no, si va con proxy o no, bueno creo que es valido tambien y a alguien le puede servir, se que no debe ser lo mejor, ya que el ejemplo de kaos_engine creo es mejor porque se puede separar pon un lado los datos de cada cleinte y por otro el codigo en si.
Bueno muchas gracias a todos.
Saludos desde LA PAMPA!!!! -
si vas a hacer eso, me parece que te conviene mas hacerlo en python ...
no porque sea mejor ni peor, sino porque me parece que es una herramienta mas adecuada que bash para ese tipo de script =P
saludos
Otra cosa mas ... en el ejemplo de Kaos, podes tener reglas independientes ( iguales o distintas entre si ) para cada cliente ... y además de las reglas, podrias aplicarle cualquier otro comando ( como por ejemplo, algun otro script que se le aplique a "uno" o "algunos" de los clientes, pero no a todos ... scripts de QoS se me vienen a la cabeza como ejemplo ... u horarios ... etc, etc, etc ) mientras que en el tuyo, al usar un loop "for i in" le aplicas lo mismo a todos.
O sea, ninguno es mejor ni peor, solo que uno es mas flexible que el otro ...
salutes
