Transferir archivos con PHP / SSH con Autenticación por llaves RSA

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 = &amp;Log::singleton("file", "/var/log/envia_archivos_ssh.log");
    $monitor-&gt;log($mensaje,$tipo);
}

function procesoPrincipal($source_dir = DIR_ORI, $file_ext ='*.jpg'){
    if($conexionSSH = ssh2_connect(IPSERVER, PORTSERVER, array('hostkey'=&gt;'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-&gt;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) ;
}

?>