Hoe scp werkt
`scp gebruiker@server:/pad/naar/bestand /lokale/doelmap` — dat is de hele opdracht. Geen wizard, geen GUI, geen poort die je moet onthouden. SSH doet de authenticatie en de versleuteling, scp doet alleen het kopiëren.
Dit artikel legt uit hoe scp werkt, welke opties je in de praktijk nodig hebt en waarom het ondanks zijn leeftijd nog steeds de snelste manier is om één bestand van A naar B te krijgen.
Vereisten
- OpenSSH-client, versie 9.0 of nieuwer. Bijna elke Linux-distributie levert dit standaard mee.
- SSH-toegang tot de doelmachine. Dat betekent: een account, een wachtwoord of SSH-sleutel, en een draaiende `sshd`-service op de server.
- Een netwerkpad tussen de twee machines. Firewalls mogen poort 22 (of een aangepaste SSH-poort) niet blokkeren.
scp -V
Dit toont de OpenSSH-versie. Ontbreekt het commando, installeer dan `openssh-client` via je package manager:
sudo apt install openssh-client
Hoe scp werkt
scp is geen zelfstandig protocol. Het is een dun laagje bovenop SSH dat het oude BSD RCP-commando nadoet, maar dan met encryptie. Wanneer je een scp-opdracht geeft, zet scp een SSH-sessie op naar de doelmachine en start daar een `scp`-proces. Dat proces leest het bestand en stuurt het versleuteld terug door de SSH-tunnel.Dit betekent twee dingen. Ten eerste: alles wat SSH kan — sleutels, agent forwarding, alternatieve poorten — werkt ook met scp. Ten tweede: scp erft ook de beperkingen van SSH. Wil je een bestand kopiëren naar een machine waar je niet kunt inloggen, dan lukt dat niet. En dat is precies de bedoeling.
Basisgebruik
De syntaxis lijkt op die van `cp`, met één verschil: een van de paden bevat een hostnaam.Lokaal bestand naar een server kopiëren:
scp /pad/naar/lokaal/bestand.txt gebruiker@server:/pad/naar/doel/
Bestand van een server naar je lokale machine halen:
scp gebruiker@server:/pad/naar/bestand.txt /pad/naar/lokaal/doel/
In beide gevallen vraagt scp om het wachtwoord van `gebruiker` op `server`, tenzij je een SSH-sleutel hebt geconfigureerd. De volgorde van bron en doel is hetzelfde als bij `cp`: eerst wat je kopieert, dan waar je het naartoe kopieert.
De opties die je echt gebruikt
De manpage van scp noemt tientallen opties. In de praktijk kom je met vijf ver.Recursief kopiëren met `-r`:
scp -r /pad/naar/map gebruiker@server:/pad/naar/doel/
Zonder `-r` weigert scp een directory te kopiëren. Het is de optie die je het vaakst vergeet en de foutmelding die je dan krijgt is niet mis te verstaan: `Not a regular file`.
Alternatieve SSH-poort met `-P`:
scp -P 2222 /pad/naar/bestand.txt gebruiker@server:/pad/naar/doel/
Staat je SSH-server op een andere poort dan 22, dan moet scp dat weten. Let op de hoofdletter. De kleine `-p` doet iets anders: die behoudt de modificatietijd van het bestand.
Specificiek sleutelbestand met `-i`:
scp -i /pad/naar/sleutel.pem /pad/naar/bestand.txt gebruiker@server:/pad/naar/doel/
Handig als je voor verschillende servers verschillende sleutels gebruikt, zoals bij cloudproviders gebruikelijk is.
Twee externe hosts verbinden met `-3`:
scp -3 gebruiker@server1:/pad/naar/bestand.txt gebruiker@server2:/pad/naar/doel/
Zonder `-3` probeert scp een directe verbinding tussen server1 en server2 op te zetten. Dat vereist dat beide servers elkaars SSH-poorten kunnen bereiken en dat je op allebei kunt inloggen. Met `-3` stuurt je lokale machine de data door. Dat is langzamer, maar het werkt ook als de twee servers elkaar niet kunnen zien.
Compressie met `-C`:
scp -C /pad/naar/groot-bestand.sql gebruiker@server:/pad/naar/doel/
Compressie helpt bij tekstbestanden en logbestanden over een trage verbinding. Bij al gecomprimeerde bestanden zoals `.zip` of `.jpg` voegt het niets toe en kost het alleen CPU-tijd.
Waarom scp nog bestaat
Er zijn inmiddels betere tools. `rsync` is efficiënter bij het synchroniseren van mappen omdat het alleen de gewijzigde delen van bestanden overdraagt. SFTP biedt interactieve bestandsbeheer en kan onderbroken overdrachten hervatten. Voor complexe workflows zijn die alternatieven de betere keuze.Maar voor één simpel feit blijft scp onaantrekkelijk: het is er al. Het zit in OpenSSH, dus op elke Linux-server die je ooit aanraakt. Geen extra package, geen daemon die je moet configureren, geen syntax die verschilt tussen versies. In een script dat een backup naar een andere server moet duwen, is scp de regel die je in tien seconden schrijft en nooit meer aanraakt.
Dat heeft ook een keerzijde. scp is verouderd — de OpenSSH-ontwikkelaars hebben het protocol in versie 9.0 gemarkeerd als deprecated, wat betekent dat het op termijn vervangen wordt door SFTP. In OpenSSH 9.0 en nieuwer gebruikt scp standaard het SFTP-protocol voor de overdracht, ook al heet het commando nog steeds scp. De vlaggen en de syntax blijven werken, maar onder de motorkap rijdt er een ander protocol.
Stappenplan: bestand kopiëren met een SSH-sleutel
De meest robuuste manier om scp te gebruiken is met een SSH-sleutel in plaats van een wachtwoord. Dat werkt ook in scripts, zonder dat iemand een wachtwoord typt.Stap 1: Genereer een sleutelpaar op je lokale machine
ssh-keygen -t ed25519 -a 100
De Optie `-t ed25519` kiest het moderne Ed25519-algoritme, `-a 100` verhoogt het aantal KDF-rondes voor de passphrase. Het resultaat staat in `~/.ssh/id_ed25519` (privé) en `~/.ssh/id_ed25519.pub` (publiek).
Stap 2: Kopieer de publieke sleutel naar de server
ssh-copy-id gebruiker@server
Dit commando voegt je publieke sleutel toe aan `~/.ssh/authorized_keys` op de server. Je moet één keer je wachtwoord invoeren.
Stap 3: Test de sleutel
ssh gebruiker@server 'echo gelukt'
Als dit zonder wachtwoordvraag werkt, werkt scp ook zonder wachtwoordvraag.
Stap 4: Kopieer het bestand
scp /pad/naar/bestand.txt gebruiker@server:/pad/naar/doel/
Geen prompt, geen vertraging. De overdracht start direct.
Stap 5: Stel een passphrase in op je sleutel
ssh-keygen -p -f ~/.ssh/id_ed25519
Een sleutel zonder passphrase is een beveiligingsrisico: wie je laptop bemachtigt, kan bij al je servers. Met een passphrase is de sleutel versleuteld op schijf. Je typt de passphrase één keer per sessie; `ssh-agent` onthoudt hem daarna.
Verificatie
Controleer of het bestand daadwerkelijk op de doelmachine staat:ssh gebruiker@server 'ls -l /pad/naar/doel/bestand.txt'
Vergelijk de bestandsgrootte met het origineel op je lokale machine:
ls -l /pad/naar/bestand.txt
Zijn de groottes gelijk, dan is de overdracht geslaagd. Voor extra zekerheid kun je een checksum berekenen op beide machines:
sha256sum /pad/naar/bestand.txt
ssh gebruiker@server 'sha256sum /pad/naar/doel/bestand.txt'De twee hashes moeten identiek zijn.
Veelgemaakte fouten
`Permission denied (publickey)`De server accepteert je sleutel niet. Controleer of de publieke sleutel in `~/.ssh/authorized_keys` op de server staat en of de permissies kloppen: `~/.ssh` moet `700` zijn, `authorized_keys` moet `600` zijn.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys`Connection refused`
De SSH-server draait niet of luistert op een andere poort. Test met `ssh -p 2222 gebruiker@server` of je überhaupt kunt verbinden. Werkt SSH wel, vergeet dan niet de `-P`-optie bij scp te gebruiken.
`scp: /pad/naar/doel/: No such file or directory`
De doelmap bestaat niet. scp maakt geen mappen aan; dat moet je zelf doen:
ssh gebruiker@server 'mkdir -p /pad/naar/doel/'
`Executable path ... is not allowed by default`
Je gebruikt een oudere OpenSSH-versie op de server die het SFTP-protocol niet toestaat voor scp. Update de server naar OpenSSH 9.0 of nieuwer, of forceer het oude protocol met:
scp -O /pad/naar/bestand.txt gebruiker@server:/pad/naar/doel/
De `-O`-optie gebruikt het klassieke scp-protocol. Die werkt overal, maar is precies de modus die de OpenSSH-ontwikkelaars willen afschaffen.
De eenvoud van scp is tegelijk zijn zwakte: het kan niets anders dan kopiëren. Geen synchronisatie, geen resume, geen directory-listing. Voor die taken bestaat rsync, en het is de moeite waard om dat te leren voor je volgende project. Maar voor de momenten dat je snel één bestand wilt verplaatsen — een config, een backup, een deployment-artefact — is scp nog steeds het gereedschap dat je als eerste pakt. Het zal nog jaren werken, ook al staat er op de doos 'deprecated'.