Rsync vía PHP exec () con SSH sin contraseña ssh de inicio de sesión

Si ejecuto el comando a través de php exec (): no funciona. Pero si uso bash, funciona perfecto. Alguna idea de lo que podría ser el problema? Estaba pensando que tal vez está ejecutando rsync como apache y no permitiendo el inicio de sesión ssh.

exec('rsync -au /var/www/html/f1/ [email protected]:/var/www/html/f2/'); 

PHP generalmente se ejecuta en Apache bajo mod_php . Por lo general, Apache se ejecuta como su propia cuenta de usuario, independientemente de las personas del mundo real que usan el servidor.

Por lo tanto, los archivos ~/.ssh que almacenan la clave SSH sin contraseña en el directorio de inicio de su cuenta de usuario no están disponibles para PHP dentro de Apache, ya que no tienen su homedir. Incluso si Apache compartió su directorio de inicio, aún no tendría permisos para leer esos archivos.

Mi investigación de estas cosas me lleva a eso: puedo ejecutar rsync en php, que a su vez funciona bajo apache. Pero debo tener en cuenta algunos puntos:

  • Los directorios de inicio deben existir para un usuario bajo cuya cuenta se inicia un servidor web en la computadora local (probablemente, http) y para un usuario remoto bajo cuya cuenta se conecta al host remoto.
  • La clave de autenticación privada (posiblemente con una contraseña vacía) debe estar accesible para el usuario http. La clave pública correspondiente se debe agregar al control remoto

     ~/.ssh/authorized_keys 

    archivo. Aquí ~ es el directorio de inicio del usuario remoto en el host remoto.

  • Un archivo de configuración local

     ~/.ssh/config 

    debe ser creado. Aquí ~ es el directorio de inicio del usuario http en el host local. El archivo de config debe ser accesible para el usuario http. Puede contener algo como esto:

     Host * User=www-data IdentityFile=~/.ssh/nopass_rsa Compression=no Ciphers=arcfour StrictHostKeyChecking=no UserKnownHostsFile=/dev/null 

    Aquí el User es un nombre de usuario en el host remoto, IdentityFile es un archivo de clave. Los siguientes dos parámetros ( Compression y Ciphers ) permiten boost ligeramente el rendimiento. Y los dos últimos parámetros permiten omitir la comprobación de la clave del host.

  • Si está tratando con el directorio ~/.ssh del usuario http local y ~ es el directorio raíz para el servidor web al mismo tiempo, entonces está el problema de seguridad: usted (o cualquier otra persona) puede acceder a sus archivos clave simplemente escribiendo

     www.your-domain.com/.ssh/ 

    en el navegador. De modo que negar el acceso a este directorio en la configuración de un navegador web será una buena idea.

Mi ejemplo de php-code:

 exec('rsync -auq remote.host.com:/archive/ ./backup_bd/'); 

que simplemente funciona …

Creo que respondí tu pregunta.

A continuación, le indicamos cómo debe especificar dónde debe recoger SSH sus claves:

 exec('rsync -e "ssh -i /home/you/.ssh/id_dsa" ...') 

Supongo que Apache se ejecuta bajo el usuario que puede leer su id_dsa o id_rsa .

almacene el comando en un script de shell, ya que no tiene partes dinámicas, y luego use exec () para ejecutar el script de shell.

 # on command line echo 'rsync -au /var/www/html/f1/ [email protected]:/var/www/html/f2/' > sync_files # On command line chmod +x sync_files  

Como ninguna de las sugerencias anteriores funcionaría, tuve que permitir que la cuenta de usuario de Apache no tuviera acceso al servidor que necesitaba para cargar imágenes. Funciona como me encanta, como sea necesario, gracias a todos los que intentaron ayudar con mi problema.