Přenos souborů

scp, rsync, sftp.

Dřív nebo později budeš potřebovat dostat soubor z jednoho stroje na druhý — zálohu na server, web na hosting, log z produkce k sobě na notebook. V Linuxu na to nepotřebuješ žádný FTP klient s okýnky: máš tři nástroje, které jedou přes SSH (tedy šifrovaně a bezpečně) rovnou z terminálu. scp na rychlou kopii, rsync na chytrou synchronizaci (přenese jen změny) a sftp na interaktivní „procházení". Až pochopíš rozdíl mezi nimi — hlavně ten zákeřný lomítko na konci u rsyncu — přestaneš se bát, že si někde přepíšeš data.


Pár pojmů na úvod

  • SSH = šifrovaný tunel mezi dvěma stroji. Všechny tři nástroje níž ho používají jako „potrubí", takže přenos je vždy zabezpečený a autentizovaný (heslem nebo klíčem). Víc v kapitole o SSH.
  • Zdroj (source) a cíl (destination) = odkud a kam kopíruješ. Pořadí v příkazu je vždy nástroj ZDROJ CÍL — jako u cp. Splést si je znamená kopírovat obráceně.
  • user@host:/cesta = zápis vzdáleného umístění. user je účet na druhém stroji, host jeho adresa (IP nebo doménové jméno), za dvojtečkou cesta na tom stroji. Bez dvojtečky je to lokální soubor.
  • Synchronizace = srovnání dvou míst tak, aby byla stejná. Narozdíl od prosté kopie se přenese jen to, co se liší — to je hlavní trik rsync.
  • Idempotence = když příkaz pustíš podruhé a nic se nezměnilo, nic se neděje. rsync je idempotentní: druhý běh nepřenáší nic, protože cíl už je aktuální.

scp — rychlá kopie přes SSH

scp (secure copy) je nejjednodušší nástroj: chová se jako cp, ale jeden konec může být na jiném stroji. Skvělý na „hoď mi tenhle jeden soubor tam/sem".

# lokální soubor NA server (do /var/www)
scp web.tar.gz user@server:/var/www/

# ze serveru K SOBĚ (do aktuální složky — tečka)
scp user@server:/var/log/app.log .

# přejmenování při kopii — cíl má jiné jméno
scp zaloha.sql user@server:/tmp/zaloha-2026.sql

Celou složku (rekurzivně) přeneseš s -r:

scp -r muj-web/ user@server:/var/www/

Když SSH na serveru neběží na standardním portu 22, port se u scp zadává velkým -P (pozor — ssh používá malé -p, scp velké):

scp -P 2222 soubor.zip user@server:/tmp/

💡 scp je bezvadný na jednorázovou drobnost. Ale neumí navázat přerušený přenos ani poznat, co už na druhé straně je — vždycky přenese všechno znovu. Na velké nebo opakované přenosy sáhni po rsync.


rsync — chytrá synchronizace jen změn

rsync je král přenosů. Než něco pošle, porovná zdroj a cíl a přenese jen to, co chybí nebo se změnilo. Když ho pustíš na stejnou složku podruhé, většinou nepřenese skoro nic — a to i u tisíců souborů.

Základní kouzelná kombinace je -avz:

rsync -avz muj-web/ user@server:/var/www/web/
  • -a (archive) = zachovej všechno — práva, časy, symlinky, rekurzivně celé stromy. Tohle chceš skoro vždy.
  • -v (verbose) = vypisuj, co se děje (které soubory letí).
  • -z (compress) = komprimuj po cestě. Šetří data po pomalé síti (přes internet ano, po lokální gigabitce zbytečné).

Užitečné přepínače, které budeš sahat pořád:

# ukaž průběh u velkých souborů (procenta, rychlost)
rsync -avz --progress velky-soubor.iso user@server:/data/

# NANEČISTO — jen ukáže, co by udělal, nic nepřenese
rsync -avz --dry-run muj-web/ user@server:/var/www/web/

# vynech vybrané složky/soubory
rsync -avz --exclude 'node_modules' --exclude '*.log' projekt/ user@server:/srv/projekt/

# zrcadlení — smaž v cíli to, co ve zdroji už není (viz varování níž!)
rsync -avz --delete muj-web/ user@server:/var/www/web/

💡 --dry-run (zkráceně -n) je tvůj nejlepší kamarád. Pusť ho pokaždé, když si nejsi jistý, co rsync udělá — hlavně s --delete. Ukáže přesně seznam akcí, ale disku se ani nedotkne.


⚠️ Lomítko na konci — nejdůležitější věc o rsyncu

Tohle je místo, kde se spálí úplně každý začátečník. U rsync lomítko na konci zdroje mění význam:

  • muj-web/ (s lomítkem) = „vezmi obsah téhle složky".
  • muj-web (bez lomítka) = „vezmi složku samotnou".

Rozdíl na příkladu — cíl je /var/www/:

# S lomítkem: obsah muj-web/ přistane PŘÍMO do /var/www/
rsync -av muj-web/ user@server:/var/www/
# výsledek: /var/www/index.html, /var/www/styl.css …

# BEZ lomítka: vytvoří se /var/www/muj-web/ a obsah jde tam
rsync -av muj-web user@server:/var/www/
# výsledek: /var/www/muj-web/index.html …

Obojí je legitimní — jen musíš vědět, které chceš. Klasický průšvih: chceš nasadit web do /var/www/web/, zapomeneš lomítko a rsync ti vyrobí /var/www/web/muj-web/ — web nefunguje, protože soubory jsou o složku hlouběji.

🚩 Zapamatuj si to takhle: lomítko za zdrojem znamená „nasyp mi vnitřek sem". Bez lomítka „přines mi celou tu složku i s obalem". U cíle lomítko naopak nevadí — chová se pořád stejně.


sftp — interaktivní přenos

sftp (SSH File Transfer Protocol) tě přihlásí na vzdálený stroj a dá ti interaktivní prompt, kde se pohybuješ jako v FTP klientovi — jen šifrovaně přes SSH. Hodí se, když nevíš přesně, kde soubor je, a chceš si to „proklikat".

sftp user@server

Uvnitř máš dvojici příkazů: bez písmenka pracují na vzdáleném stroji, s l (jako local) na tvém:

sftp> pwd            # vzdálená složka, kde jsi
sftp> ls             # výpis na serveru
sftp> cd /var/www    # přesun na serveru
sftp> lls            # výpis u TEBE (local ls)
sftp> lcd ~/Stažené  # přesun u tebe

sftp> get app.log            # stáhni soubor K SOBĚ
sftp> put zaloha.sql         # nahraj soubor NA server
sftp> get -r logs/           # celá složka rekurzivně
sftp> bye                    # konec

💡 sftp je fajn na ruční „poslepu" hledání a jednotlivé soubory. Na skriptování a hromadné synchronizace je ale nešikovný — tam vede rsync.


rsync přes SSH a kdy co použít

rsync používá pro přenos na dálku ve výchozím stavu SSH (u novějších verzí automaticky, jakmile uvidí user@host:). Explicitně to řekneš přepínačem -e ssh, což se hodí, když chceš přidat volby — třeba jiný port:

# rsync přes SSH na nestandardním portu 2222
rsync -avz -e "ssh -p 2222" muj-web/ user@server:/var/www/web/

Kdy sáhnout po kterém nástroji:

SituaceNástrojProč
Jeden soubor, jednorázověscpNejkratší zápis, není co synchronizovat.
Velký soubor / pomalá síťrsync -P-P = --partial --progress: ukazuje průběh a naváže přerušený přenos.
Opakovaný přenos (deploy, záloha)rsyncPodruhé přenese jen změny — bleskové.
Zrcadlení dvou místrsync --deleteSrovná cíl přesně podle zdroje.
„Proklikat" a najít souborsftpInteraktivní pohyb po serveru.

💡 Když ti spadne přenos velkého souboru přes scp, musíš celý začít znovu. rsync spuštěný s -P (--partial --progress) se rozdělaného souboru chytí a dopočítá jen zbytek. ⚠️ Pozor: bez --partial rsync nedokončený soubor při přerušení zahodí — takže na velké přenosy jezdi rsync -avP. (A pokud v cíli už leží starší verze souboru, rsync stejně pošle jen odlišné bloky.)


Failure modes — časté průšvihy při přenosech

  • Zapomenuté lomítko u rsyncu. rsync -av dir host:/cil/ bez lomítka vyrobí /cil/dir/ a nasype obsah tam — u deploye ti tím „zmizí" web o složku hlouběji. Naopak navíc lomítko tam, kde jsi ho nechtěl, rozsype cíl (obsah přistane jinam, než čekáš). Vždy si to rozmysli, ideálně přes --dry-run.
  • --delete bez --dry-run. --delete smaže v cíli všechno, co není ve zdroji. Když se spleteš ve zdrojové cestě (třeba omylem prázdná složka), vymažeš cíl. Pravidlo: --delete nikdy nepouštěj poprvé bez -n/--dry-run a nekoukni na seznam.
  • scp přepisuje bez ptaní. Pokud v cíli soubor stejného jména existuje, scp ho tiše přepíše — žádné „opravdu?". Než něco kopíruješ do produkce, ověř, co tam už je.
  • Velký soubor přes scp a spadne síť. scp neumí resume — začínáš od nuly. Na cokoli velkého ber rsync (--progress, resume, komprese).
  • Špatné pořadí zdroj/cíl. nástroj ZDROJ CÍL — prohození znamená kopírovat obráceně. U rsync --delete je to dvojnásobně nebezpečné (zrcadlíš špatným směrem a mažeš data).
  • Práva a vlastník v cíli. Nahraješ soubory jako user, ale web běží pod jiným účtem → server je „nevidí" (403/permission denied). Po přenosu často řeš chown/chmod (a u rsync pomáhá -a, které práva zachová ze zdroje).

🛠️ Cvičení

  1. scp tam a zpátky. Vytvoř lokálně soubor test.txt, zkopíruj ho na server do /tmp/ a pak si ho stáhni zpět pod jiným jménem. Jaký je celý tvar příkazu a v jakém pořadí jsou zdroj a cíl?
  2. Lomítko rozhoduje. Máš složku web/ se souborem index.html. Napiš dvě varianty rsync do /var/www/ — jednu, po které vznikne /var/www/index.html, a druhou, po které vznikne /var/www/web/index.html. Čím se liší?
  3. Nanečisto před ostrým během. Chceš zrcadlit web/ na server s --delete. Napiš příkaz, který ti jen ukáže, co by se stalo (a hlavně co by se smazalo), aniž by cokoli provedl. Který přepínač to dělá?
  4. Vynech smetí. Synchronizuješ projekt na server, ale nechceš přenášet node_modules ani žádné .log soubory. Doplň do rsync správné přepínače.
  5. Jiný port. SSH na serveru běží na portu 2222. Napiš (a) scp a (b) rsync, které se na tenhle port připojí. Čím se zápis portu u těch dvou nástrojů liší?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. scp obousměrně — nahoru: scp test.txt user@server:/tmp/; dolů pod jiným jménem: scp user@server:/tmp/test.txt test-zpet.txt. Pořadí je vždy scp ZDROJ CÍL — stejné jako u cp. Vzdálené místo poznáš podle user@host: s dvojtečkou; lokální je prostá cesta (nebo . pro tady).
  2. Lomítko rozhoduje — přímo do /var/www/: rsync -av web/ user@server:/var/www/ (lomítko za web/ = „nasyp obsah sem"). Do podsložky: rsync -av web user@server:/var/www/ (bez lomítka = „vezmi složku i s obalem", vznikne /var/www/web/). Liší se jen tím lomítkem u zdroje — to je celý rozdíl mezi „obsah" a „složka samotná".
  3. Dry-runrsync -avn --delete web/ user@server:/var/www/web/ (nebo --dry-run místo -n). Vypíše seznam akcí včetně řádků deleting ..., ale disku se vůbec nedotkne. Teprve když seznam sedí, pustíš to samé bez -n. Pozor: --delete bez dry-runu je nejrychlejší cesta ke smazaným datům.
  4. Excludersync -avz --exclude 'node_modules' --exclude '*.log' projekt/ user@server:/srv/projekt/. --exclude můžeš zopakovat kolikrát chceš; bere i vzory (*.log). Pozor: vzor se vztahuje na cestu uvnitř přenosu, ne na absolutní cestu.
  5. Jiný portscp: velké -Pscp -P 2222 soubor user@server:/tmp/. rsync: přes -ersync -avz -e "ssh -p 2222" web/ user@server:/var/www/. Zrada: scp chce velké -P, kdežto ssh (a tím i rsync -e ssh) používá malé -p. Nejčastější překlep při přenosech na nestandardní port.

🧠 Otázky & odpovědi

Kdy použít scp a kdy rsync?

scp ber na jednorázovou drobnost — jeden soubor, který prostě jen chceš dostat tam nebo sem. Je krátký a jednoduchý, ale přenese vždycky všechno znovu a neumí navázat přerušený přenos. rsync je chytřejší: porovná zdroj a cíl a pošle jen změny, umí ukazovat průběh, komprimovat a s -P (--partial) navázat, když přenos spadne. Takže na velké soubory, opakované přenosy (deploy, zálohy) a zrcadlení sáhni vždy po rsyncu. Pravidlo palce: malá jednorázovka → scp, cokoli většího nebo opakovaného → rsync.

Proč je u rsyncu tak důležité lomítko na konci?

Protože lomítko za zdrojem rozhoduje, jestli kopíruješ obsah složky, nebo složku samotnou. web/ (s lomítkem) znamená vezmi vnitřek téhle složky a nasyp ho do cíle. web (bez lomítka) znamená vezmi celou složku i s jejím jménem a vytvoř ji v cíli. Když chceš nasadit web přímo do /var/www/ a zapomeneš lomítko, rsync ti vyrobí /var/www/web/ a soubory skončí o úroveň hlouběji — web nefunguje. U cíle na tom naopak nezáleží. Když si nejsi jistý, pusť --dry-run a uvidíš přesně, kam co poletí.

Co dělá přepínač --delete a proč je nebezpečný?

--delete udělá z cíle přesnou kopii zdroje — tedy smaže v cíli všechno, co ve zdroji není. To je přesně to, co chceš u zrcadlení, ale je to i nejrychlejší cesta ke ztrátě dat. Když se spleteš ve zdrojové cestě nebo omylem ukážeš na prázdnou složku, vymažeš celý cíl. Proto se --delete nikdy nepouští poprvé bez --dry-run (nebo -n): ten ti napřed vypíše, co by se smazalo, aniž by na disk sáhl. Teprve když seznam sedí, spustíš to naostro. A dvakrát si zkontroluj směr — zdroj a cíl.

Co když se přenos velkého souboru přeruší?

U scp máš smůlu — neumí resume, takže celý přenos začínáš od nuly. Proto je na velké soubory lepší rsync s přepínačem -P (--partial): po opětovném spuštění se chytne rozdělaného souboru a dopočítá jen zbývající část. ⚠️ Bez --partial ale rsync nedokončený soubor zahodí a začínáš od nuly — proto na velké přenosy rsync -avP. K tomu se hodí --progress, které ti během přenosu ukazuje procenta a rychlost, a -z pro kompresi po pomalé síti. Prakticky: velký soubor nebo nejistá linka → vždycky rsync, ať tě jedno spadnutí sítě nestojí celý přenos znovu.

K čemu je sftp, když mám scp a rsync?

sftp je interaktivní — přihlásí tě na server a dá ti prompt, kde se pohybuješ příkazy jako ls, cd, get a put, podobně jako ve starém FTP klientovi, jen šifrovaně přes SSH. Hodí se, když přesně nevíš, kde soubor na serveru leží, a chceš si to „proklikat", nebo když potřebuješ ručně stáhnout pár jednotlivých souborů. Na skriptování, deploy a hromadné synchronizace je ale nešikovný — tam je rychlejší a spolehlivější rsync. Ber sftp jako ruční průzkumník, ostatní dva jako nástroje na dávky.