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.
scpna rychlou kopii,rsyncna chytrou synchronizaci (přenese jen změny) asftpna 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 ucp. Splést si je znamená kopírovat obráceně. user@host:/cesta= zápis vzdáleného umístění.userje účet na druhém stroji,hostjeho 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.
rsyncje 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/
💡
scpje 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 porsync.
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
💡
sftpje fajn na ruční „poslepu" hledání a jednotlivé soubory. Na skriptování a hromadné synchronizace je ale nešikovný — tam vedersync.
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:
| Situace | Nástroj | Proč |
|---|---|---|
| Jeden soubor, jednorázově | scp | Nejkratší 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) | rsync | Podruhé přenese jen změny — bleskové. |
| Zrcadlení dvou míst | rsync --delete | Srovná cíl přesně podle zdroje. |
| „Proklikat" a najít soubor | sftp | Interaktivní pohyb po serveru. |
💡 Když ti spadne přenos velkého souboru přes
scp, musíš celý začít znovu.rsyncspuštěný s-P(--partial --progress) se rozdělaného souboru chytí a dopočítá jen zbytek. ⚠️ Pozor: bez--partialrsync nedokončený soubor při přerušení zahodí — takže na velké přenosy jezdirsync -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. --deletebez--dry-run.--deletesmaž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:--deletenikdy nepouštěj poprvé bez-n/--dry-runa nekoukni na seznam.scppřepisuje bez ptaní. Pokud v cíli soubor stejného jména existuje,scpho tiše přepíše — žádné „opravdu?". Než něco kopíruješ do produkce, ověř, co tam už je.- Velký soubor přes
scpa spadne síť.scpneumí resume — začínáš od nuly. Na cokoli velkého berrsync(--progress, resume, komprese). - Špatné pořadí zdroj/cíl.
nástroj ZDROJ CÍL— prohození znamená kopírovat obráceně. Ursync --deleteje 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 ursyncpomáhá-a, které práva zachová ze zdroje).
🛠️ Cvičení
- 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? - Lomítko rozhoduje. Máš složku
web/se souboremindex.html. Napiš dvě variantyrsyncdo/var/www/— jednu, po které vznikne/var/www/index.html, a druhou, po které vznikne/var/www/web/index.html. Čím se liší? - 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á? - Vynech smetí. Synchronizuješ projekt na server, ale nechceš přenášet
node_modulesani žádné.logsoubory. Doplň dorsyncsprávné přepínače. - Jiný port. SSH na serveru běží na portu
2222. Napiš (a)scpa (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
- 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ždyscp ZDROJ CÍL— stejné jako ucp. Vzdálené místo poznáš podleuser@host:s dvojtečkou; lokální je prostá cesta (nebo.pro tady). - Lomítko rozhoduje — přímo do
/var/www/:rsync -av web/ user@server:/var/www/(lomítko zaweb/= „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á". - Dry-run —
rsync -avn --delete web/ user@server:/var/www/web/(nebo--dry-runmí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:--deletebez dry-runu je nejrychlejší cesta ke smazaným datům. - Exclude —
rsync -avz --exclude 'node_modules' --exclude '*.log' projekt/ user@server:/srv/projekt/.--excludemůžeš zopakovat kolikrát chceš; bere i vzory (*.log). Pozor: vzor se vztahuje na cestu uvnitř přenosu, ne na absolutní cestu. - Jiný port —
scp: velké-P→scp -P 2222 soubor user@server:/tmp/.rsync: přes-e→rsync -avz -e "ssh -p 2222" web/ user@server:/var/www/. Zrada:scpchce velké-P, kdežtossh(a tím irsync -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.
