Cálculo de checksum a través de SFTP

Resuelto
drumjoel Mensajes publicados 56 Estado Miembro -  
drumjoel Mensajes publicados 56 Estado Miembro -
Bonjour,
He creado un script que descarga un archivo list.txt que contiene nombres de archivos a descargar por SFTP.
Busca si el archivo contenido en list.txt está en local, si es así, calcula su checksum y lo compara con el de el servidor remoto; si son diferentes, descargamos el del servidor.
Si el archivo no existe en local, lo descargamos.

Mi problema es que paso por SSH para calcular el checksum del archivo en el servidor remoto, pero quisiera permitir solo las conexiones SFTP.

#!/usr/bin/bash downfile=list.txt sftp user@192.168.0.40:$downfile #descarga el archivo list.txt ls | grep $downfile > /dev/null 2>&1 if [ $? -eq 0 ]; then #prueba la presencia del archivo $downfile cat "$downfile" | while read line do ls | grep $line > /dev/null 2>&1 if [ $? -eq 0 ]; then #prueba la presencia del archivo $line md5local=$(md5sum $line) #almacena el checksum del archivo local md5distant=$(ssh user@192.168.0.40 -n md5sum $line) #almacena el checksum del archivo remoto (servidor sftp) while [ "$md5local" != "$md5distant" ] do sftp user@192.168.0.40:$line #si es diferente, descargamos el archivo remoto md5local=$(md5sum $line) #almacena el checksum del archivo local done else sftp user@192.168.0.40:$line #si el archivo no está presente en local, lo descargamos fi done else exit 1; fi exit 0; 

3 respuestas

  1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 502
     
    Hola,

    SFTP no puede ejecutar comandos que no estén implementados de origen, así que no creo que sea posible.

    La única solución viable es tener un archivo MD5 en el sitio asociado a cada archivo, que podrás descargar al mismo tiempo que el archivo fuente y a partir de ahí podrás hacer tu verificación sin necesidad de variables...

    --
    Zen mis nuggets ;-)
    Haz un gesto por el medio ambiente, cierra tus ventanas y adopta un pingüino.
    0
  2. drumjoel Mensajes publicados 56 Estado Miembro 2
     
    Está bien, gracias por la rapidez
    así que lo marco como resuelto.
    0
    1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 502
       
      Espera, sin embargo, otras opiniones, había dejado claro: "no creo que sea posible.", sin ser categórico al 100%; -\
      0
    2. drumjoel Mensajes publicados 56 Estado Miembro 2
       
      Bien, mis investigaciones avanzaron en tu dirección, así que llegué a la conclusión de que tenías razón.
      0
  3. drumjoel Mensajes publicados 56 Estado Miembro 2
     
    Aquí está el script que he realizado y que funciona
     #!/usr/bin/bash #Este script descarga un archivo cuyo nombre está almacenado en $downfile #el archivo $downfile contiene el md5 y el nombre del archivo a descargar #si el archivo listados en $downfile no existe localmente o no tiene el mismo checksum (md5) entonces lo descargamos del servidor downfile=list_onco.txt sftp usersftp@192.168.0.40:$downfile #descarga el archivo list_onco.txt ls | grep $downfile > /dev/null 2>&1 if [ $? -eq 0 ]; then #test de la presencia del archivo $downfile cat "$downfile" | while read line do md5distant=$(echo $line | cut -b1-32) #recupera el md5 del archivo distante almacenado en list_onco.txt nomFich=$(echo $line | cut -b34-) #recupera el nombre del archivo almacenado en list_onco.txt ls | grep $nomFich > /dev/null 2>&1 if [ $? -eq 0 ]; then #test de la presencia del archivo $nomFich md5local=$(md5sum $nomFich | cut -b1-32) #si el archivo está presente almacena el checksum del archivo local while [ "$md5local" != "$md5distant" ] #mientras el checksum local sea diferente del checksum distante do sftp usersftp@192.168.0.40:$nomFich #descargamos el archivo distante md5local=$(md5sum $nomFich | cut -b1-32) #almacena el checksum del archivo descargado en el checksum del archivo local done else #si el archivo no está almacenado localmente sftp usersftp@192.168.0.40:$nomFich #lo descargamos md5local=$(md5sum $nomFich | cut -b1-32) #calculamos el md5sum local del archivo descargado while [ "$md5local" != "$md5distant" ] #mientras el checksum local sea diferente del checksum distante do sftp usersftp@192.168.0.40:$nomFich #descargamos el archivo distante md5local=$(md5sum $nomFich | cut -b1-32) #almacena el checksum del archivo descargado en el checksum del archivo local done fi done else exit; #error fi exit 0; #sin errores 
    0