Código fuente:
#!/usr/local/bin/php -q <?php include "./lib/Log.php"; define('DIR_ORI','/origen/'); define('DIR_DES','/destino/'); define('DIR_USR','/'); define('IPSERVER','0.0.0.0'); define('PORTSERVER','22'); define('USERSSHLOCAL','usuario'); define('USERSSHREMOTE','usuario'); define('KEYSSHNAME','nombre-de-archivo-llave'); define('EXTARCHIVO','.jpg'); define('PSWSSH',''); // inicia definicion de funciones function Bitacora($msg,$tipo = PEAR_LOG_INFO){ $mensaje = $msg; $monitor = &Log::singleton("file", "/var/log/envia_archivos_ssh.log"); $monitor->log($mensaje,$tipo); } function procesoPrincipal($source_dir = DIR_ORI, $file_ext ='*.jpg'){ if($conexionSSH = ssh2_connect(IPSERVER, PORTSERVER, array('hostkey'=>'ssh-rsa'))){ if (ssh2_auth_pubkey_file($conexionSSH, USERSSHREMOTE, DIR_USR.USERSSHLOCAL.'/.ssh/'.KEYSSHNAME.'.pub', DIR_USR.USERSSHLOCAL.'/.ssh/'.KEYSSHNAME)) { // Creando session SFTP $sftp = ssh2_sftp($conexionSSH); // Buscando archivos con un tipo determinado de extension en el directorio asignado $file_list = glob($source_dir.$file_ext); foreach($file_list as $file_fullpath){ // obtenemos el md5 del archivo local $md5ArcLocal = md5_file($file_fullpath); // obtenemos nombre de archivo a enviar $nombreArchivoSSH=substr($file_fullpath,41); Bitacora('[Prepara Envio] ['.$nombreArchivoSSH.']',PEAR_LOG_INFO); // preparamos inicio de sesion sftp y nombre de archivo temporal de envio $cadenaEnvioSFTP = 'ssh2.sftp://'.$sftp.DIR_DES.$nombreArchivoSSH.".tmp"; $contenidoArchivoRemoto = fopen($cadenaEnvioSFTP, 'w'); try { if (!$contenidoArchivoRemoto) { throw new Exception("No se pudo abrir el archivo remoto: ".IPSERVER.":".DIR_DES.$nombreArchivoSSH); } $contenidoArchivoLocal = @file_get_contents(DIR_ORI.$nombreArchivoSSH); if ($contenidoArchivoLocal === false) { throw new Exception("No se pudo abrir el archivo local: ".DIR_ORI.$nombreArchivoSSH); } if (fwrite($contenidoArchivoRemoto, $contenidoArchivoLocal) === false) { throw new Exception("No se pudo enviar los datos del archivo: ".DIR_ORI.$nombreArchivoSSH); }else{ Bitacora('[Inicia Envio] ['.$nombreArchivoSSH.']',PEAR_LOG_INFO); } // si no hubo problemas con la tranferencia cerramos el archivo fclose($contenidoArchivoRemoto); Bitacora('[Finaliza Envio] ['.$nombreArchivoSSH.']',PEAR_LOG_INFO); // comparamos el md5 del archivo local con el archivo remoto $md5ArcRemoto = md5_file($cadenaEnvioSFTP); // verificacmos integridad de md5 local y remoto if(strcmp($md5ArcLocal, $md5ArcRemoto) != 0){ ssh2_sftp_unlink($sftp, DIR_DES.$nombreArchivoSSH.".tmp"); throw new Exception("la verificacion del archivo ".DIR_DES.$nombreArchivoSSH." resulto erronea"); }else{ ssh2_sftp_rename($sftp, DIR_DES.$nombreArchivoSSH.".tmp", DIR_DES.$nombreArchivoSSH); Bitacora('[Envio Satisfactorio] ['.$nombreArchivoSSH.']',PEAR_LOG_INFO); } } catch (Exception $e) { Bitacora('Excepcion: ' . $e->getMessage(),PEAR_LOG_ERR); exit(); } } } else { Bitacora('Error de autenticacion de clave publica\n',PEAR_LOG_ERR); exit(); } }else{ Bitacora('El servidor de centralizacion '.IPSERVER.' se encuentra fuera de linea,'. 'favor de revisar con su area de telecomunicaciones.',PEAR_LOG_ERR); exit(); } } // - - - function procesoPrincipal() // termina definicion de funciones $lista_origen_busqueda = array(DIR_ORI); foreach($lista_origen_busqueda as $directorio_busqueda){ Bitacora('Directorio de busqueda: ['.$directorio_busqueda.']',PEAR_LOG_INFO); procesoPrincipal($directorio_busqueda,'*'.EXTARCHIVO) ; } ?>