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.
