es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear un archivo tar.gz y transferirlo al servidor de red.

Tengo una Raspberry Pi funcionando en mi red doméstica junto con una Macintosh que actúa como servidor de respaldo. Estoy intentando crear un script de Python3 que se ejecute en la Pi para crear una copia de seguridad tar.gz de la carpeta de inicio de la Pi (junto con todo su contenido) y transferirla a la Macintosh mediante SSH. Tengo la conexión SSH (usando claves) funcionando, pero me quedo atascado cuando intento crear el archivo de respaldo y transferirlo.

Mi código hasta ahora:

import paramiko
import tarfile
import os

ssh_cliente = paramiko.SSHClient()
ssh_cliente.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_cliente.connect(hostname='192.168.1.151', username='nombredeusuarioponeraquí')

print("¡Estoy conectado!")

#El siguiente bloque de código es el problema según lo veo
tar_cmd = 'tar czvf - ./home/PiOne/ | ssh_cliente -w:gz "cat > ./Volumes/PiBackups/PiOne/PiOneClone.tar.gz"'
ssh_cliente.exec_command(tar_cmd)

print("¡Archivo transferido!")

ssh_cliente.close()

¡Agradecería cualquier ayuda para crear el script!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Creando un script de Python para hacer una copia de seguridad de la carpeta de inicio de una Raspberry Pi y transferirla a un Macintosh usando SSH

    Para resolver tu problema, podemos dividir la tarea en tres partes:
    1. Crear una copia de seguridad tar.gz de la carpeta de inicio de la Raspberry Pi.
    2. Transferir el archivo tar.gz al Macintosh usando SSH.
    3. Crear un script de Python3 que automatice las dos partes anteriores.

    Creando una copia de seguridad tar.gz

    Podemos usar el módulo tarfile en Python para crear un archivo de copia de seguridad tarball de la carpeta de inicio de la Raspberry Pi. También podemos usar el módulo subprocess para ejecutar comandos de shell. Aquí tienes un ejemplo:

    import tarfile
    import subprocess
    
    # Definir el nombre del archivo de copia de seguridad
    backup_file = 'PiOneClone.tar.gz'
    
    # Usar la declaración 'with' para cerrar automáticamente el archivo cuando se termine
    with tarfile.open(backup_file, 'w:gz') as tar:
        # Agregar recursivamente todos los archivos del directorio de inicio de la Pi al archivo
        tar.add('/home/pi')
    
    # Probar si se creó el archivo de copia de seguridad correctamente
    try:
        # Ejecutar un comando de shell para listar el contenido del archivo
        subprocess.run(['tar', 'tzvf', backup_file], check=True)
        print(f'Se creó el archivo de copia de seguridad: {backup_file}')
    except subprocess.CalledProcessError as e:
        print(f'Ocurrió un error: {e}')
    

    Transferir el archivo de copia de seguridad al Macintosh usando SSH

    Podemos usar el módulo paramiko en Python para transferir el archivo de copia de seguridad al Macintosh usando SSH. Aquí tienes un ejemplo:

    import paramiko
    
    # Crear un objeto cliente SSH
    ssh_client = paramiko.SSHClient()
    # Añadir automáticamente hosts desconocidos
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # Conectar al Macintosh
    ssh_client.connect('192.168.1.151', username='nombredeusuarioaquí')
    
    # Definir el archivo local y la ruta remota en el Macintosh
    local_file = './PiOneClone.tar.gz'
    remote_path = './Volumes/PiBackups/PiOne/'
    
    # Crear un objeto cliente SFTP
    sftp_client = ssh_client.open_sftp()
    # Transferir el archivo de copia de seguridad al Macintosh
    sftp_client.put(local_file, remote_path + 'PiOneClone.tar.gz')
    # Cerrar el objeto cliente SFTP
    sftp_client.close()
    
    # Cerrar el objeto cliente SSH
    ssh_client.close()
    
    # Probar si el archivo de copia de seguridad se transfirió correctamente
    try:
        # Ejecutar un comando de shell en el Macintosh para listar el contenido del directorio
        subprocess.run(['ssh', 'nombredeusuarioaquí@192.168.1.151', 'ls', '-l', remote_path], check=True)
        print('El archivo se transfirió correctamente.')
    except subprocess.CalledProcessError as e:
        print(f'Ocurrió un error: {e}')
    

    Creando un script de Python3

    Ahora que tenemos las dos partes funcionando, podemos juntarlas en un solo script de Python3. Aquí tienes un ejemplo:

    #!/usr/bin/python3
    
    import tarfile
    import subprocess
    import paramiko
    
    # Definir el nombre del archivo de copia de seguridad
    backup_file = 'PiOneClone.tar.gz'
    
    # Usar la declaración 'with' para cerrar automáticamente el archivo cuando se termine
    with tarfile.open(backup_file, 'w:gz') as tar:
        # Agregar recursivamente todos los archivos del directorio de inicio de la Pi al archivo
        tar.add('/home/pi')
    
    # Probar si se creó el archivo de copia de seguridad correctamente
    try:
        # Ejecutar un comando de shell para listar el contenido del archivo
        subprocess.run(['tar', 'tzvf', backup_file], check=True)
        print(f'Se creó el archivo de copia de seguridad: {backup_file}')
    except subprocess.CalledProcessError as e:
        print(f'Ocurrió un error: {e}')
    
    # Crear un objeto cliente SSH
    ssh_client = paramiko.SSHClient()
    # Añadir automáticamente hosts desconocidos
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # Conectar al Macintosh
    ssh_client.connect('192.168.1.151', username='nombredeusuarioaquí')
    
    # Definir el archivo local y la ruta remota en el Macintosh
    local_file = './PiOneClone.tar.gz'
    remote_path = './Volumes/PiBackups/PiOne/'
    
    # Crear un objeto cliente SFTP
    sftp_client = ssh_client.open_sftp()
    # Transferir el archivo de copia de seguridad al Macintosh
    sftp_client.put(local_file, remote_path + 'PiOneClone.tar.gz')
    # Cerrar el objeto cliente SFTP
    sftp_client.close()
    
    # Cerrar el objeto cliente SSH
    ssh_client.close()
    
    # Probar si el archivo de copia de seguridad se transfirió correctamente
    try:
        # Ejecutar un comando de shell en el Macintosh para listar el contenido del directorio
        subprocess.run(['ssh', 'nombredeusuarioaquí@192.168.1.151', 'ls', '-l', remote_path], check=True)
        print('El archivo se transfirió correctamente.')
    except subprocess.CalledProcessError as e:
        print(f'Ocurrió un error: {e}')
    

    ¡Espero que esto te ayude con tu script de Python3 para hacer una copia de seguridad de la carpeta de inicio de tu Raspberry Pi y transferirla a tu Macintosh usando SSH!

Comments are closed.