Transferir archivos con Junos PyEZ
RESUMEN Utilice Junos PyEZ para proteger archivos de copia (SCP) entre el host local y un dispositivo Junos.
Junos PyEZ proporciona utilidades que le permiten realizar tareas de administración de archivos en dispositivos Junos. Puede utilizar la clase PyEZ jnpr.junos.utils.scp.SCP
de Junos para proteger archivos de copia (SCP) entre el host local y un dispositivo Junos.
Los SCP
open()
métodos y close()
establecen y terminan la conexión con el dispositivo. Como resultado, si la aplicación cliente sólo realiza operaciones de copia de archivos, puede omitir llamadas a los Device
open()
métodos y close()
. Las instancias de la SCP
clase se pueden utilizar como administradores de contexto, que llaman automáticamente a los open()
métodos y close()
. Por ejemplo:
from jnpr.junos import Device from jnpr.junos.utils.scp import SCP dev = Device('router1.example.com') with SCP(dev) as scp: scp.put('local-file', remote_path='path') scp.get('remote-file', local_path='path')
SCP
permite realizar un seguimiento del progreso de las transferencias mediante el progress
parámetro. De forma predeterminada, SCP
no imprime mensajes de progreso. Se establece progress=True
para imprimir mensajes de progreso predeterminados a intervalos de finalización de transferencia del 10 por ciento o superior.
with SCP(dev, progress=True) as scp:
Como alternativa, puede definir una función personalizada para imprimir mensajes de progreso y, a continuación, establecer el progress
parámetro igual al nombre de la función. La definición de la función debe incluir dos parámetros correspondientes a la instancia del dispositivo y al mensaje de progreso. Por ejemplo:
def log(dev, report): print (dev.hostname + ': ' + report) def main(): ... with SCP(dev, progress=log) as scp:
El siguiente programa de ejemplo transfiere los archivos scp-test1.txt y scp-test2.txt del host local al directorio /var/tmp del dispositivo de destino y, a continuación, transfiere el archivo de registro de mensajes del dispositivo de destino a un directorio de registros en el host local. Se cambia el nombre del registro de mensajes para anexar el nombre de host del dispositivo al nombre de archivo. En el ejemplo se utilizan claves SSH, que ya están configuradas en el host local y en el dispositivo, para la autenticación.
Para fines de comparación, el programa utiliza tanto los mensajes de progreso predeterminados como los mensajes personalizados, que se definen en la función denominada log
, para realizar un seguimiento del progreso de las transferencias.
from jnpr.junos import Device from jnpr.junos.utils.scp import SCP def log(dev, report): print (dev.hostname + ': ' + report) def main(): dev = Device('router1.example.com') msgfile = 'logs/'+dev.hostname+'-messages' try: #Default progress messages with SCP(dev, progress=True) as scp1: scp1.put('scp-test1.txt', remote_path='/var/tmp/') scp1.get('/var/log/messages', local_path=msgfile) #Custom progress messages with SCP(dev, progress=log) as scp2: scp2.put('scp-test2.txt', remote_path='/var/tmp/') scp2.get('/var/log/messages', local_path=msgfile) except Exception as err: print (err) return if __name__ == "__main__": main()
El progreso de las transferencias se envía a la salida estándar. El resultado predeterminado (progress=True
) incluye el nombre del dispositivo, el archivo que se está transfiriendo y el progreso de la transferencia en bytes y como porcentaje.
router1.example.com: scp-test1.txt: 8 / 8 (100%) router1.example.com: logs/router1.example.com-messages: 0 / 229513 (0%) router1.example.com: logs/router1.example.com-messages: 24576 / 229513 (10%) router1.example.com: logs/router1.example.com-messages: 139264 / 229513 (60%) router1.example.com: logs/router1.example.com-messages: 229513 / 229513 (100%)
La función personalizada produce un resultado similar en este caso.
router1.example.com : scp-test2.txt: 1 / 1 (100%) router1.example.com : logs/router1.example.com-messages: 0 / 526493 (0%) router1.example.com : logs/router1.example.com-messages: 57344 / 526493 (10%) router1.example.com : logs/router1.example.com-messages: 106496 / 526493 (20%) router1.example.com : logs/router1.example.com-messages: 212992 / 526493 (40%) router1.example.com : logs/router1.example.com-messages: 319488 / 526493 (60%) router1.example.com : logs/router1.example.com-messages: 368640 / 526493 (70%) router1.example.com : logs/router1.example.com-messages: 475136 / 526493 (90%) router1.example.com : logs/router1.example.com-messages: 526493 / 526493 (100%)
Después de ejecutar el programa, emita el file list
comando en el dispositivo de destino para verificar que los archivos scp-test1.txt y scp-test2.txt se copiaron en el directorio correcto.
user1@router1> file list /var/tmp/scp-test* /var/tmp/scp-test1.txt /var/tmp/scp-test2.txt
En el host local, el archivo de registro de mensajes , cuyo nombre se cambia para incluir el nombre de host del dispositivo, debe estar presente en el directorio de registros .
user1@server:~$ ls logs router1.example.com-messages
De forma predeterminada, Junos PyEZ consulta el archivo de configuración SSH predeterminado en ~/.ssh/config, si existe. Sin embargo, puede especificar un archivo de configuración SSH diferente al crear la instancia de dispositivo incluyendo el ssh_config
parámetro en la lista de Device
argumentos. Por ejemplo:
ssh_config_file = '~/.ssh/config_dc' dev = Device('198.51.100.1', ssh_config=ssh_config_file)
Además, cuando se incluye el ssh_private_key_file
parámetro en la lista de Device
argumentos para definir un archivo de clave privada SSH específico para la autenticación, la instancia utiliza el mismo archivo de clave para la SCP
autenticación al transferir archivos.
key_file='/home/user1/.ssh/id_rsa_dc' dev = Device('198.51.100.1', ssh_private_key_file=key_file) with SCP(dev) as scp: scp.put('scp-test.txt', remote_path='/var/tmp/')
La SCP
clase también proporciona compatibilidad con ProxyCommand, que permite transferir archivos desde el host local al dispositivo de destino a través de un host intermediario compatible con netcat. Esto es útil cuando solo puede iniciar sesión en el dispositivo de destino a través del host intermedio. Para configurar ProxyCommand, agregue la información adecuada al archivo de configuración SSH. Por ejemplo:
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -l user1 198.51.100.2 nc %h 22 2>/dev/null