Hoe scp je in Python?

Wat is de meest pythonische manier om een bestand in Python te scpn? De enige route die ik ken is

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

wat een hack is, en die niet werkt buiten Linux-achtige systemen, en die hulp nodig heeft van de Pexpect-module om wachtwoordprompts te vermijden, tenzij je al SSH zonder wachtwoord hebt ingesteld voor de externe host.

Ik ben op de hoogte van Twisted’s conch, maar ik zou liever vermijden om scp zelf te implementeren via low-level ssh-modules.

Ik ken paramiko, een Python-module die SSH en SFTP ondersteunt; maar het ondersteunt geen SCP.

Achtergrond: ik maak verbinding met een router die geen SFTP ondersteunt, maar wel SSH/SCP, dus SFTP is geen optie.

BEWERKEN:
Dit is een duplicaat van Hoe kopieer je een bestand naar een externe server in Python met SCP of SSH?. Echtergeeft die vraag geen scp-specifiek antwoord dat betrekking heeft op sleutels vanuit Python. Ik hoop op een manier om code uit te voeren zoals

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')

Antwoord 1, autoriteit 100%

Probeer de Python scp-module voor Paramiko. Het is heel gemakkelijk te gebruiken. Zie het volgende voorbeeld:

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())

Bel vervolgens scp.get()of scp.put()aan om SCP-bewerkingen uit te voeren.

(SCPClient-code)


Antwoord 2, autoriteit 11%

Misschien ben je geïnteresseerd in het proberen van Pexpect(broncode). Dit zou u in staat stellen om te gaan met interactieve vragen om uw wachtwoord.

Hier is een voorbeeld van gebruik (voor ftp) van de hoofdwebsite:

# 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')

Antwoord 3, autoriteit 8%

Je kunt ook paramikobekijken. Er is (nog) geen scp-module, maar deze ondersteunt sftp volledig.

[BEWERKEN]
Sorry, ik heb de regel gemist waar je paramiko noemde.
De volgende module is gewoon een implementatie van het scp-protocol voor paramiko.
Als je geen paramiko of conch wilt gebruiken (de enige ssh-implementaties die ik ken voor python), kun je dit herwerken om over een gewone ssh-sessie te lopen met behulp van pijpen.

scp.py voor paramiko


Antwoord 4, autoriteit 8%

Kon geen duidelijk antwoord vinden en deze “scp.Client”-module bestaat niet.
In plaats daarvan, ditpast bij mij:

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')

Antwoord 5, autoriteit 6%

als je putty installeert op win32 krijg je een pscp (putty scp).

zodat je de os.system-hack ook op win32 kunt gebruiken.

(en u kunt de putty-agent gebruiken voor sleutelbeheer)


sorry het is maar een hack
(maar je kunt het in een python-klasse inpakken)


Antwoord 6, autoriteit 5%

U kunt het pakketsubproces en de opdrachtaanroep gebruiken om het scp-commando uit de shell te gebruiken.

from subprocess import call
cmd = "scp user1@host1:files user2@host2:files"
call(cmd.split(" "))

Antwoord 7, autoriteit 5%

Vanaf vandaag is de beste oplossing waarschijnlijk AsyncSSH

https://asyncssh.readthedocs.io/en/latest/#scp- klant

async with asyncssh.connect('host.tld') as conn:
    await asyncssh.scp((conn, 'example.txt'), '.', recurse=True)

Antwoord 8, autoriteit 5%

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('<IP Address>', username='<User Name>',password='' ,key_filename='<.PEM File path')
#Setup sftp connection and transmit this script 
print ("copying")
sftp = client.open_sftp() 
sftp.put(<Source>, <Destination>)
sftp.close()

Antwoord 9, autoriteit 4%

Bekijk fabric.transfer.

from fabric import Connection
with Connection(host="hostname", 
                user="admin", 
                connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}
               ) as c:
    c.get('/foo/bar/file.txt', '/tmp/')

Antwoord 10, autoriteit 3%

Het is al een tijdje geleden dat deze vraag werd gesteld, en in de tussentijd is er een andere bibliotheek opgedoken die dit aankan:
U kunt de functie kopiërengebruiken opgenomen in de Plumbumbibliotheek:

import plumbum
r = plumbum.machines.SshMachine("example.net")
   # this will use your ssh config as `ssh` from shell
   # depending on your config, you might also need additional
   # params, eg: `user="username", keyfile=".ssh/some_key"`
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)

Antwoord 11, autoriteit 2%

Als je *nix gebruikt, kun je sshpass

gebruiken

sshpass -p password scp -o User=username -o StrictHostKeyChecking=no src dst:/path

Antwoord 12

Hmmm, misschien is een andere optie iets als sshfs(er een sshfsook voor Mac). Zodra uw router is gemount, kunt u de bestanden gewoon rechtstreeks kopiëren. Ik weet niet zeker of dat werkt voor jouw specifieke toepassing, maar het is een leuke oplossing om bij de hand te houden.


Antwoord 13

Ik heb een tijdje geleden een python SCP-kopiescript samengesteld dat afhankelijk is van paramiko. Het bevat code om verbindingen met een privésleutel of SSH-sleutelagent af te handelen met een terugval op wachtwoordverificatie.

http://code.activestate.com /recepten/576810-copy-files-over-ssh-using-paramiko/

Other episodes