¿Cómo hacer scp en Python?
¿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 paramiko
un 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')
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 )
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')
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')