¿Cómo hacer scp en Python?

Resuelto Michael Gundlach asked hace 15 años • 0 respuestas

¿Cuál es la forma más pitónica de escanear un archivo en Python? La única ruta que conozco es

os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )

que es un truco y que no funciona fuera de sistemas similares a Linux, y que necesita ayuda del módulo Pexpect para evitar solicitudes de contraseña a menos que ya tenga SSH sin contraseña configurado en el host remoto.

Conozco Twisted's conch, pero preferiría evitar implementar scp yo mismo a través de módulos ssh de bajo nivel.

Conozco paramikoun módulo de Python que admite SSH y SFTP; pero no es compatible con SCP.

Antecedentes: me estoy conectando a un enrutador que no admite SFTP pero sí admite SSH/SCP, por lo que SFTP no es una opción.

EDITAR : Este es un duplicado de ¿Cómo copiar un archivo a un servidor remoto en Python usando SCP o SSH? . Sin embargo , esa pregunta no da una respuesta específica de scp que trate con claves desde Python. Espero encontrar una forma de ejecutar código similar

import scp

client = scp.Client(host=host, user=user, keyfile=keyfile)
# or
client = scp.Client(host=host, user=user)
client.use_system_keys()
# or
client = scp.Client(host=host, user=user, password=password)

# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')
Michael Gundlach avatar Oct 30 '08 21:10 Michael Gundlach
Aceptado

Pruebe el módulo scp de Python para Paramiko . Es muy fácil de usar. Vea el siguiente ejemplo:

import paramiko
from scp import SCPClient

def createSSHClient(server, port, user, password):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(server, port, user, password)
    return client

ssh = createSSHClient(server, port, user, password)
scp = SCPClient(ssh.get_transport())

Luego llame scp.get()o scp.put()para realizar operaciones de SCP.

( Código de cliente SCPC )

Tom Shen avatar Nov 26 '2010 03:11 Tom Shen

Quizás le interese probar Pexpect ( código fuente ). Esto le permitiría lidiar con solicitudes interactivas para su contraseña.

Aquí hay un fragmento de ejemplo de uso (para ftp) del sitio web principal:

# This connects to the openbsd ftp site and
# downloads the recursive directory listing.
import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')
Pat Notz avatar Oct 30 '2008 16:10 Pat Notz

No se pudo encontrar una respuesta directa y este módulo "scp.Client" no existe. En cambio, esto me conviene:

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

with SCPClient(ssh.get_transport()) as scp:
   scp.put('test.txt', 'test2.txt')
   scp.get('test2.txt')
Maviles avatar Jul 24 '2016 20:07 Maviles