&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Desafortunadamente, sftp sólo ejecutará todas las solicitudes en el archivo de entrada una tras otra, no hay ningún mecanismo para probar si la transferencia funcionó o no.
Ya que no se pueden utilizar macros de comando, ¿hay alguna alternativa? El producto gnu_tools se envía con un programa llamado expect. Puede ser usado para enviar comandos, esperar cualquier número de respuestas diferentes y hacer algo basado en lo que ve en el flujo de salida. No soy un experto en expect, pero el script de la figura 6 le ayudará a empezar. Si busca en la web "scripts de espera" encontrará muchas referencias que le ayudarán a personalizar mi sencillo ejemplo.
# If we get an end-of-file (eof) it means that the sftp process # Este procedimiento hace coincidir las expresiones regulares buscando las cadenas clave# en la salida recolectada del comando que fue ejecutado. En este caso # Sólo estoy informando el tipo de error, pero otras cosas se pueden hacer # también. También sólo compruebo dos errores. Hay otros. Tendrás # para añadirlos a medida que los encuentres. # proc checkforerrors {buf cmd} { if [regexp {.*no encontrado} $buf] { pone "$cmd FALLIDO: no encontrado" retorno 1 } if [regexp {.*Permiso denegado} $buf] { pone "$cmd FALLADO: problemas de acceso" retorno 1 } retorno 0 }# establecer el tiempo de espera a -1 para que no haya tiempo de espera. El valor predeterminado es de 10 segundos # y la mayoría de las transferencias de archivos toman más tiempo que eso. Decidí establecer no # Tiempo muerto, puedes cambiar eso. establecer el tiempo de espera -1 # Start sftp # esperar el prompt de sftp pero si obtenemos un prompt de autenticación, que termina en # cambiar a un directorio conveniente para las pruebas # llamar a la comprobación de errores pasando todos los caracteres recogidos hasta el enviar "put foor" enviar "get barr" enviar "quitr" |
expect sftp3.exp Nos hemos conectado al servidor equivocado o el servidor ha sido recargado.La clave del servidor debe ser validada antes de que este script pueda ser ejecutado de nuevo.ready 10:41:10 |
expect sftp3.exp sftp> get barNo se pudo establecer un archivo remoto: No hay tal archivo o directorio El archivo "/SysAdmin/Noah_Davids/sftp_test/bar" no se ha encontrado. sftp> get bar FALLADO: no se encuentra ya 10:42:11 |
Por último, en mi blog de FTP mencioné que el FTP era capaz de leer los archivos que aún estaban abiertos y esto en ocasiones ha dado lugar a que se transfieran archivos incompletos, sugerí que si el macro de FTP espera a que un archivo aparezca en una ubicación y luego lo transfiere, el macro debe comprobar que ya no está bloqueado. El mismo problema puede ocurrir con el SFTP y la solución es la misma. Puede colocar la comprobación de bloqueo de archivos en una macro de comando (figura 9) y luego, cuando el archivo ya no esté bloqueado, llamar a esperar con el script apropiado.
&label AGAIN |