Transfer Files Between Linux Machines Over SSH
Overview
Soms willen we op een veilige manier bestanden van de ene Linux machine naar de andere overzetten. Misschien willen we wat bestanden uploaden naar een productieserver of een backup maken.
In dit artikel bekijken we verschillende tools voor het overzetten van bestanden tussen Linux machines over ssh, het populairste protocol voor remote verbinding tussen Linux machines.
We bekijken de twee populairste tools voor bestandsoverdracht: scp en rsync.
Basic Tool Usage
2.1. Een snel voorbeeld
Stel dat we het bestand text.log willen kopiëren van ons lokale systeem naar het pad /var/log op een Linux server op afstand met IP-adres 111.111.111.111, en we willen gebruik maken van root-gebruikers-gegevens.
Dit kan worden bereikt met scp of rsync met dezelfde basis syntax:
scp text.log :/var/logrsync text.log :/var/log
Laten we eerst begrijpen wat deze commando’s gemeen hebben voordat we hun variaties en verschillen leren kennen.
2.2. De algemene syntax
De algemene syntax voor scp of rsync is:
scp/rsync ]Source_File ]Destination_file
Het OPTION gedeelte stelt ons in staat om command line switches te gebruiken om het gedrag van de kopieer operatie aan te passen. Met de twee paden voor bron en bestemming kunnen we het pad naar het bestand aan beide kanten van de kopieeroperatie opgeven, evenals de te gebruiken gebruikersaccount(s).
In het bovenstaande voorbeeld wordt het lokale bestand gekopieerd naar een locatie op afstand – . Zoals we later zullen zien, kunnen we het remote formaat gebruiken om bron of doel te beschrijven, waardoor deze commando’s zowel bestanden naar een server kunnen uploaden als bestanden van een server kunnen downloaden.
2.3. Belangrijke dingen om op te merken
Er zijn een paar punten om te onthouden als we bestanden over ssh overbrengen met welk gereedschap dan ook:
- Het scp/rsync commando vraagt om het gebruikerswachtwoord om in te loggen op de server op afstand als we geen auto-login hebben ingesteld door RSA sleutels uit te wisselen
- We hoeven onze gebruikersnaam of server IP niet op te geven voor onze lokale server
- We kunnen een absoluut pad of relatief pad opgeven naar het bron/bestemmingsbestand, waarbij relatieve paden relatief zijn ten opzichte van de huidige werkdirectory of de homedirectory van de gebruiker op afstand
2.4. Het opgeven van een bestandsnaam
Het is niet verplicht om een bestandsnaam op te geven bij het bestemmingspad. Als we geen bestandsnaam opgeven, wordt de naam van het bronbestand gebruikt.
In ons eerste voorbeeld wordt het bestand in de doelmap aangemaakt met de naam text.log. Als we het bestand onder een andere naam hadden willen opslaan, hadden we een bestandsnaam kunnen opgeven als onderdeel van het bestemmingspad.
Door de impliciete bestandsnaam te gebruiken, kunnen we een bestand van een Linux-server op afstand naar de huidige directory kopiëren met de oorspronkelijke naam:
scp :/var/log/text.log .rsync :/var/log/text.log .
Hier staat de “.” parameter voor de huidige werkdirectory. We kunnen ook een ander pad opgeven als we dat willen:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Kopiëren tussen Servers
We kunnen deze tools zelfs gebruiken om te kopiëren tussen twee servers op afstand. Bijvoorbeeld, laten we het text.log bestand kopiëren van server 111.111.111.111. naar server 222.222.222.222 voor de root gebruiker:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Nu we een basis begrip hebben van scp en rsync, laten we ze eens wat dieper bekijken.
scp (Secure Copy)
scp staat voor Secure Copy en wordt gebruikt om bestanden over een ssh-verbinding over te dragen. Het is een onbewerkte kopie, wat betekent dat het alleen de gegevens uit de bronmap leest en deze in de doelmap schrijft. Dus, als we op zoek zijn naar een snelle kopie die niet meer dan een paar minuten duurt, dan kunnen we het beste scp gebruiken.
Als we een groot bestand overzetten, moeten we er zeker van zijn dat we een stabiele internetverbinding hebben. Omdat scp niet hervat kan worden, kan er tijd verloren gaan als de verbinding wegvalt tijdens een grote overdracht, en zal de hele kopieeroperatie opnieuw gestart moeten worden.
3.1. Installatie
De meeste Linux distributies komen met scp voorgeïnstalleerd. We kunnen eenvoudig controleren of scp geïnstalleerd is of niet:
which scp
We zien het pad naar het scp commando als het al geïnstalleerd is. Een leeg antwoord betekent dat scp niet is geïnstalleerd.
Als we het nog niet hebben, dan moeten we om scp te installeren het OpenSSH client pakket uit de officiële package repository installeren:
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
Laten we eens door een paar veel voorkomende scenario’s gaan voor het gebruik van scp.
3.2. Meerdere bestanden overzetten
We kunnen een lijst met bestanden opgeven, gescheiden door een spatie om meerdere bestanden over te zetten:
scp text.log text1.log text2.log :/var/log
We kunnen ook de -r optie gebruiken om de hele directory recursief te kopiëren. Bijvoorbeeld, om alle bestanden uit de /home/app/log/ directory te kopiëren:
scp -r /home/app/log :/var/log
We kunnen * gebruiken om bestanden te versturen die aan een bepaald naamgevingspatroon voldoen. Bijvoorbeeld, we hebben vier bestanden text.log, text2.log, app.log, en app2.log, en we willen alleen bestanden versturen die beginnen met app:
scp /home/app/log/app* :/var/log
3.3. Bestanden versturen met Identity Files
In de meeste Linux distributies wordt de voorkeur gegeven aan sleutel-gebaseerde authenticatie. In het scp commando kunnen we het identiteitsbestand specificeren met de -i optie:
scp -i key.pem text.log :/var/log
Veel systeembeheerders gebruiken sleutel-gebaseerde authenticatie om bestanden over te zetten, omdat het niet de gebruikersgegevens vereist bij elke overdracht.
3.4. On-the-Fly Compressie
We kunnen de overdrachtstijd verkorten door on-the-fly compressie te gebruiken met de -C optie. Dit comprimeert en decomprimeert het bestand op respectievelijk bron- en bestemmingspad:
scp -C text.log :/var/log
3.5. Beperk de bandbreedte tijdens de overdracht
We kunnen de bandbreedte in Kbit/s opgeven met de -l optie:
scp -l 500 text.log :/var/log
3.6. Verbose modus voor debuggen
We kunnen verbose modus inschakelen met de -v optie:
scp -v text.log :/var/log
De uitvoer zou er ongeveer zo uitzien:
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
Verbose (debug) uitvoer drukt de exacte stappen af die scp uitvoert, wat nuttig is voor het debuggen van verbindingen, authenticatie, en configuratie problemen.
rsync (Remote Synchronization)
rsync is snel en veelzijdig. Het is goed voor het synchroniseren en slim overzetten van bestanden, omdat het bijhoudt hoeveel gegevens er zijn gekopieerd en hoeveel er nog over zijn.
We zouden rsync moeten gebruiken als we grote bestanden moeten overzetten – zelfs als er problemen zijn met de netwerkverbinding, gaan de gegevens die tot dat punt zijn gekopieerd niet verloren, en als de verbinding wordt hersteld, wordt de kopie vanaf dat punt hervat.
rsync is sneller dan het scp commando wanneer we hetzelfde bestand meerdere keren moeten overzetten, omdat het een remote-update protocol gebruikt, waarmee alleen de verschillen tussen twee sets bestanden kunnen worden overgezet.
4.1. Installatie
Laten we controleren of rsync is geïnstalleerd door het aan te roepen om zijn versie te laten zien:
rsync --version
Als we een foutmelding krijgen, dan kunnen we het installeren:
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Laten we een aantal veel voorkomende scenario’s doorlopen waar we rsync kunnen gebruiken.
4.2. Doe een Dry Run
Omdat rsync zo krachtig is, kan het gevaarlijk zijn om het te gebruiken zonder te controleren wat het gaat doen. Gelukkig biedt rsync de -dry-run optie, die een proefrun uitvoert zonder daadwerkelijk bestanden over te zetten:
rsync --dry-run text.log :/var/log
4.3. Kopieer Attributen en Metadata
rsync biedt de -a optie, die symbolische koppelingen, wijzigingstijden, groep, eigendom en permissies kopieert samen met de bestandsinhoud.
Een andere belangrijke optie is -h, die uitvoer zal afdrukken in een voor mensen leesbare vorm. Dit kan vooral nuttig zijn wanneer het samen met de -dry-run optie wordt uitgevoerd:
rsync -ah --dry-run text.log :/var/log
4.4. Meerdere bestanden in een directory overzetten
We kunnen een lijst met bestanden opgeven, gescheiden door een spatie om meerdere bestanden over te zetten:
rsync text.log text1.log text2.log :/var/log
De -r optie kopieert recursief alle bestanden in de directory:
rsync -r /home/app/log :/var/log
De operator * stuurt bestanden die overeenkomen met een bepaald patroon:
rsync /home/app/log/app* :/var/log
We kunnen de optie -include en de optie -exclude gebruiken om bestanden in de lijst met bestanden in de map op te nemen of uit te sluiten. Bijvoorbeeld, om alle bestanden uit een directory te versturen, behalve de bestanden die beginnen met ‘R’:
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. On-The-Fly Compressie
We kunnen de overdrachtstijd verkorten door on-the-fly compressie te gebruiken met de -z optie. Dit comprimeert en decomprimeert bestanden op respectievelijk bron- en bestemmingspaden:
rsync -z text.log :/var/log
4.6. Verwijder Bestaande Bestanden op Bestemmingspad Voor Overdracht
De -delete optie verwijdert bestaande bestanden van de bestemming voordat nieuwe bestanden worden overgedragen:
rsync --delete text.log :/var/log
4.7. Bronbestanden automatisch verwijderen na overdracht
Laten we zeggen dat we een backup willen maken van logs van de productieserver naar een backupserver. In dit scenario willen we waarschijnlijk bestanden van de produktie server verwijderen nadat we alle bestanden naar onze backup server hebben overgebracht.
rsync server biedt de -remove-source-files optie om bronbestanden te verwijderen nadat de overdracht is voltooid:
rsync --remove-source-files text.log :/var/log
Whke Tool to Choose?
We kunnen beide tools gebruiken om bestanden tussen Linux machines te verplaatsen. We zouden echter scp moeten overwegen als de bestandsgrootte klein is – het is een eenvoudig kopieerprogramma en is algemeen beschikbaar. In ons dagelijks gebruik is scp de makkelijke keuze voor kleine, eenmalige overdrachten.
Wij zouden het meeste baat hebben bij rsync als de bestandsgrootte groot is of als we complexere en efficiëntere synchronisatie nodig hebben. Het is ook de betere keuze voor terugkerende taken zoals cron jobs en scripts.
Conclusie
In dit artikel hebben we gekeken naar twee bestandsoverdracht tools: scp en rsync.
We hebben ook gekeken naar de verschillen tussen hen, en welke tools passen bij bepaalde use cases.