Linux/Unix Shell Scripting - Tecnico

   
Vista:

Tecnico

Publicado por Pablo (2 intervenciones) el 13/04/2009 01:06:01
Hola!
Estoy armando un pequeño script para monitorear un directorio de mi FTP server, para de esta manera cada vez que hay una nueva adicion en este directorio me llegue un mail avisando.
Esto parece funcionar con el script que voy a pegar a continuacion, en todos los casos excepto cuando el nombre del archivo que agrego tiene espacios.

**************************************************************************************************************

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash
###Este programa verifica originalmente todo lo que se sube por medio de FTP a un directorio, le cambia los permisos para que no pueda ser borrado y notifica al administrador que se subio un archivo.###
 
#Powered By: Pablo Scheri under GPL License
# Changes:
# V1.0, 04 Abril 2009, Initial release
 
##########################################################################################
 
##Definicion de variables
 
#Directorio a monitorear:
monitdir=/home/trend/upload
tempdir=/home
 
#Notificaciones:
rcpt="pabloscheri@hotmail.com"
subject="Nuevo upload"
emailmessage="/tmp/emailbody.txt"
 
#Datos FTP
ftpserver=**********
ftpipaddr=`ifconfig eth0 | grep addr: |cut -d " " -f 12 | cut -d ":" -f 2`
ftpuser=*********
ftppassword=*********
 
##########################################################################################
 
#loop infinito
while [ "0" = "0" ]; do
 
#Listado del contenido a monitorear
ls -N $monitdir > $tempdir/nuevo-upload.txt
 
#Para cada linea del nuevo listado lo comparo con cada linea del viejo listado y cada archivo que no existe lo escribo en nuevos.txt
for nuevo in `cat $tempdir/nuevo-upload.txt`; do
flag=false
for viejo in `cat $tempdir/viejo-upload.txt`;do
if [ "$nuevo" = "$viejo" ]; then
flag=true
fi
done
if [ "$flag" = false ]; then
echo $nuevo >> $tempdir/nuevos.txt
fi
done
 
#Si no existen neuvos archivos, no hace falta seguir con el programa
if [ -f $tempdir/nuevos.txt ]; then
 
#Para cada linea de nuevos.txt definido mas arriba verifico si ese archivo aun se esta subiendo para no cortar la transmicion por el cambio de permisos
for nuevosarchivos in `cat $tempdir/nuevos.txt`;do
until [ $tamanoorg = $tamanonuevo ];do
tamanoorg=$(ls -l "$monitdir/$nuevosarchivos" | cut -d ' ' -f 5 )
sleep 2
tamanonuevo=$(ls -l "$monitdir/$nuevosarchivos" | cut -d ' ' -f 5 )
done
 
#Cambio de permisos y owner para que no se puedan borrar los archivos una vez subidos
chown pablos:trend "$monitdir/$nuevosarchivos" -R
chmod 750 "$monitdir/$nuevosarchivos" -R
 
#Se agrega el nombre del archivo a la lista vieja para que no vuevla a ser tomado en cuenta
echo $nuevosarchivos >> $tempdir/viejo-upload.txt
done
 
#Se genera el body del mensage y se envia el mail
echo "Se han agregado los siguientes archivos al FTP:" > $emailmessage
cat $tempdir/nuevos.txt >> $emailmessage
echo """
Recuerde los datos de logueo:
Server: $ftpserver <$ftpipaddr>
User: $ftpuser
Password: $ftppassword

Tu amigo:
Pablo.

PD: no olvides compartir en la carpeta Upload!""" >> $emailmessage
nail -s "$subject" "$rcpt" < $emailmessage
rm $tempdir/nuevos.txt
fi
 
#El Script vuelve a correr cada 5 minutos
sleep 300
done

**************************************************************************************************************

Lo proximo que probe, fue algo similar pero en vez de usar un "for" use un "while read". En este caso, no funciona de ninguna manera, ya que siempre detecta todos los archivos como nuevos y manda un mail por cada corrida del programa. Copio el codigo a continuacion.

**************************************************************************************************************

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/bash
###Este programa verifica originalmente todo lo que se sube por medio de FTP a un directorio, le cambia los permisos para que no pueda ser borrado y notifica al administrador que se subio un archivo.###
 
#Powered By: Pablo Scheri under GPL License
# Changes:
# V1.0, 04 Abril 2009, Initial release
 
##########################################################################################
 
##Definicion de variables
 
#Directorio a monitorear:
monitdir=/home/trend/download
tempdir=/home
 
#Notificaciones:
rcpt="pabloscheri@hotmail.com"
subject="Nuevo download"
emailmessage="/tmp/emailbody.txt"
 
#Datos FTP
ftpserver=*******
ftpipaddr=`ifconfig eth0 | grep addr: |cut -d " " -f 12 | cut -d ":" -f 2`
ftpuser=******
ftppassword=*******
 
##########################################################################################
 
#loop infinito
while [ "0" = "0" ]; do
 
#Listado del contenido a monitorear
ls -N $monitdir > $tempdir/nuevo-download.txt
 
#Para cada linea del nuevo listado lo comparo con cada linea del viejo listado y cada archivo que no existe lo escribo en nuevos.txt
# for nuevo in `cat $tempdir/nuevo-download.txt`; do
cat $tempdir/nuevo-download.txt | while read nuevo; do
flag=false
# for viejo in `cat $tempdir/viejo-download.txt`;do
cat $tempdir/viejo-download.txt | while read viejo; do
if [ "$nuevo" = "$viejo" ]; then
flag=true
fi
done
if [ "$flag" = false ]; then
echo $nuevo >> $tempdir/nuevos-download.txt
fi
done
 
#Si no existen neuvos archivos, no hace falta seguir con el programa
if [ -f $tempdir/nuevos-download.txt ]; then
 
#Para cada linea de nuevos.txt definido mas arriba verifico si ese archivo aun se esta subiendo para no cortar la transmicion por el cambio de permisos
for nuevosarchivos in `cat $tempdir/nuevos-download.txt`;do
 
#Se agrega el nombre del archivo a la lista vieja para que no vuevla a ser tomado en cuenta
echo $nuevosarchivos >> $tempdir/viejo-download.txt
done
 
#Se genera el body del mensage y se envia el mail
echo "Se han agregado los siguientes archivos al FTP:" > $emailmessage
cat $tempdir/nuevos-download.txt >> $emailmessage
echo """
Recuerde los datos de logueo:
Server: $ftpserver <$ftpipaddr>
User: $ftpuser
Password: $ftppassword

Tu amigo:
Pablo.

PD: no olvides compartir en la carpeta Upload!""" >> $emailmessage
nail -s "$subject" "$rcpt" < $emailmessage
rm $tempdir/nuevos-download.txt
fi
 
#El Script vuelve a correr cada 5 minutos
sleep 3
 
done

**************************************************************************************************************

Desde ya muchisimas gracias por la ayuda!!

Saludos.

Pablo.-
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tecnico

Publicado por Tom (253 intervenciones) el 14/04/2009 15:37:25
Usa siempre comillas dobles encerrando la variable que contiene el nombre del fichero.

TEST="Guia de Estilo C++.odf"

ls "$TEST"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tecnico

Publicado por pablo (2 intervenciones) el 14/04/2009 20:13:06
Gracias por la respuesta! el problema no esta en que no me toma los espacios de la variable, sino que si el archivo que estoy leyendo con el "FOR" es asi:

prueba
test espaciado

El FOR lo que va a hacer es leer: "prueba", "test" y por ultimo "espaciado"
Yo lo que necesito es que lea: "prueba" y "test espaciado"

Pablo.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tecnico

Publicado por Tom (253 intervenciones) el 15/04/2009 18:17:12
Difícil ver en cual de los 10 "for" que tienes te está pasando eso.

No lo hagas con for, hazlo con while y read:

while read LINE
do
echo "$LINE"
done < fichero.txt
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar