Toto je první článek v naší sérii o praktickém použití příkazové řádky věnovaný síťové komunikaci.
14.7.2004 13:00 | Jan Houštěk | přečteno 83855×
Začneme s v Linuxu a linuxových systémech obecně velmi rozšířeným
nástrojem jménem ssh. Jedná se o náhradu rsh
(remote shell), od kterého se již dnes právě díky ssh téměř
zcela ustoupilo. Nejznámější a nejrozšířenější implementací je OpenSSH
pocházející z OpenBSD, na tuto implementaci se v tomto článku zaměříme (jiné
implementace mají odlišnou syntax a také trochu jiné možnosti a schopnosti).
SSH znamená secure shell, ovšem kromě šifrování a bohatého výběru autentizačních mechanismů přináší další řadu možností jako např. forwarding TCP spojení, tunelování X11, kompresi a další.
Aby bylo možné ssh použít, musí na straně serveru běžet
sshd. Konfigurací démona se zabývat nebudeme, předpokládejme, že
na stroji ssh.linuxsoft.cz je zprovozněn. Uživatel bfu se do
interaktivního shellu na tento stroj přihlásí asi takto:
bfu@client:~$ ssh bfu@ssh.linuxsoft.cz The authenticity of host 'ssh.linuxsoft.cz (82.208.29.34)' can't be established. RSA key fingerprint is 10:17:47:bc:08:98:a7:db:7e:17:3a:dc:3a:03:73:43. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'ssh.linuxsoft.cz,82.208.29.34' (RSA) to the list of known hosts. bfu@ssh.linuxsoft.cz's password: ******** bfu@linuxsoft:~$
Hláška o RSA klíči se objevila, protože klient nebyl schopný ověřit identitu serveru a tudíž nelze nijak vyloučit, že opice sedí na drátě (MITM neboli monkey-in-the-middle) a vydává se za server. Tuto hlášku byste neměli ignorovat, ale poskytnutý fingerprint ověřit. Na cesty doporučuji fingerprinty v peněžence na kartičce velikosti kreditní karty, z druhé strany může být seznam jednorázových hesel :-)
Ověřené klíče se obvykle ukládají do $HOME/.ssh/known_hosts, nebo je může administrátor uložit do /etc/ssh/ssh_known_hosts. Pokud bychom chtěli vidět fingerprinty těchto uložených klíčů (např. pro přípravu zmíněné kartičky), použijeme např. příkaz
bfu@client:~$ ssh-keygen -l -f .ssh/known_hosts 2048 10:17:47:bc:08:98:a7:db:7e:17:3a:dc:3a:03:73:43 ssh.linuxsoft.cz 1024 a9:1d:8a:74:87:30:a7:41:a8:26:7e:88:e6:42:e2:6b root.cz
ssh-keygen je nástroj určený pro výrobu a manipulaci s ssh klíči.
Volba -l slouží právě k vygenerování fingerprintů, -f
udává soubor s klíči.
Máme tedy ověřenu identitu serveru, pojďme se podívat, co dalšího nám
ssh nabízí. Např.
ssh -1 -C -X -p 2222 ssh.linuxsoft.cz
stále vede k získání interaktivního shellu. Použité volby jsou ortogonální,
-1 vynutí použití protokolu verze 1. Dnes se již většinou jako
výchozí používá protokol 2, který je bezpečnější a má větší možnosti
(forwarding portů, subsystémy). Protokol 1 ocení ti, kdo potřebují interaktivní
shell používat na pomalých linkách a/nebo linkách s dlouhou odezvou. V
kombinaci s kratším klíčem (doporučuji 768 bitů) je např. při použití GPRS
spojení shell subjektivně podstatně "živější".
-C slouží k zapnutí komprese, což zase
uvítají ti, kdo přes ssh chtějí na pomalejších linkách přenášet větší množství
dat a/nebo mají počítanou linku. Na rychlých linkách má tato volba smysl jen
v případě, že server i klient zvládnou datový tok v reálném čase (de)šifrovat
a současně (de)komprimovat.
Volba -X slouží k protunelování X11 spojení. Běží-li na straně
klienta X server, je možné v získaném vzdáleném shellu spouštět i X11
aplikace, jejich vstup a výstup bude pomocí ssh tunelován a
zobrazen na lokálním X serveru.
A konečně volba -p umožní zadat jiný port než standardní 22/tcp.
To se může hodit k připojení na servery za firewallem, nebo servery spuštěné
neprivilegovaným uživatelem.
Vynechání uživatelského jména je v pořádku, v takovém případě se použije login lokálního uživatele. Spuštěním shellu možnosti ssh nekončí. Zjistit čas na vzdaleném serveru můžeme třeba takto:
bfu@client:~$ ssh ssh.linuxsoft.cz 'date' Fri Jul 1 06:54:11 CEST 2004
Uvozovky jsou v tomto případě zbytečné, ovšem je dobré si na ně zvyknout, u
příkazů s parametry už totiž nutné jsou. Jak je vidět, vede toto ke spuštění
příkazu na vzdáleném serveru, přičemž standardní výstup je přes ssh přesměrován
na klienta. A nejen to, standardní vstup je zase přesměrován na server,
zkopírovat lokální soubor secret_file přes ssh na server můžeme
např. takto:
ssh ssh.linuxsoft.cz 'cat > secret_file_copy' < secret_file
V případě celého adresáře použijeme stejným způsobem tar:
tar cf - some_dir | ssh ssh.linuxsoft.cz 'tar xf -'
Pro přenos souborů přes ssh máme ovšem k dispozici mnohem
komfortnější a silnější nástroje, jmenovitě rsync,
scp či sftp. Princip fungování je ovšem stejný, jako
v předchozím případě.
Ukažme si ještě jednu vlastnost ssh, kterou je přesměrování portů.
Nechť např. na stroji pop.host.com je provozována služba pop3, pomocí které si
chcete na klientskou stanici stáhnout poštu. Z nějakého důvodu (firewall,
bezpečnost, anonymita apod.) to ale nechcete provádět přímo z klienta, ale z
ssh.linuxsoft.cz. Použijete tedy příkaz
ssh -N -L 11000:pop.host.com:110 ssh.linuxsoft.cz
Po zadání hesla se pak můžete pop3 klientem připojit na lokální port
11000/tcp, toto spojení bude na port 110/tcp serveru pop.host.com navázáno z
ssh.linuxsoft.cz, mezi klientem a ssh.linuxsoft.cz je komunikace jako obvykle
tunelovaná a šifrovaná pomocí ssh. Volba -N způsobí,
že nedojde ke spuštění příkazu ani interaktivního shellu, není nutné ji použít
(v takovém případě se ssh chová jako obvykle, tj. při absenci
příkazu otevře interaktivní shell).
Lze provést i přesměrování v opačném směru, pomocí -R.
Provozujete-li např. na lokálním stroji nacházejícím se za firewallem nebo
NATem http server, který chcete (dočasně) zpřístupnit z internetu
prostřednictvím ssh.linuxsoft.cz, provedete to příkazem (z
klienta, kde běží zmíněný http server)
ssh -N -R 8080:localhost:80 ssh.linuxsoft.cz
Nyní se lze připojit na port 8080 serveru ssh.linuxsoft.cz (např
zadáním http://ssh.linuxsoft.cz:8080/ do prohlížeče), toto spojení
je přes ssh forwardováno na port 80 na klientské stanici. Je možné
localhost nahradit jménem nebo IP adresou jiného stroje v lokální
síti. Toto zpřístupnění lokálních služeb z Internetu navíc nelze nijak
detekovat, z pohledu místního firewallu se jedná o odchozí TCP spojení na ssh
server a z pohledu zpřístupněných služeb zase o přístupy z lokální stanice (na
které spouštíme ssh klient).
Rsync je poměrně sofistikovaný nástroj pro přenos souborů. Mezi jeho hlavní výhody patří efektivita, vysoká konfigurovatelnost a kontrola integrity přenášených dat je přímo součástí protokolu. Je to jeden z nejrozšířenějších nástrojů používaných pro synchronizaci dat mezi hlavním zdrojem a mirrory, umí totiž přenášet pouze nové soubory a u existujících pouze jejich změněné části.
Syntax je jednoduchá, rsync vždy voláme podle následujícího
schématu:
rsync {případné předvolby} {zdroj nebo více zdrojů} {cíl}
Zdroj a cíl mohou mít několik tvarů. Nejdůležitější je rozlišení na lokální a
vzdálená umístění. Lokální umístění se zapisují stejně jako např. v případě
cp. Např. všechny soubory jpg z aktuálního adresáře
do adresáře /home/bfu/photo zkopírujeme příkazem
bfu@linux:~$ rsync *.jpg /home/bfu/photo
Chceme-li kopírovat celé adresáře, je nutno použít parametr -r.
S parametrem -v zase rsync rsync ukazuje soubory,
které kopíruje, a s parametrem --progress navíc u každého
zobrazí i průběh, rychlost a čas (to má smysl zejména u větších souborů).
bfu@linux:~$ rsync -rv --progress /share/linux/MDK-amd64 /tmp/to_burn building file list ... 6 files to consider created directory /tmp/to_burn MDK-amd64/Mandrakelinux10.0-CD1.amd64.iso 726958080 100% 6.13MB/s 0:01:53 MDK-amd64/Mandrakelinux10.0-CD2.amd64.iso 727709696 100% 6.15MB/s 0:01:52 MDK-amd64/Mandrakelinux10.0-CD3.amd64.iso 727904256 100% 5.85MB/s 0:01:58 MDK-amd64/Mandrakelinux10.0-CD4.amd64.iso 724908032 100% 5.74MB/s 0:02:00 MDK-amd64/Mandrakelinux10.0-amd64.md5sum 264 100% 0.00kB/s 0:00:00 wrote 2907835604 bytes read 100 bytes 6246693.24 bytes/sec total size is 2907480328 speedup is 1.00
Pozor na zápis adresářů ve zdrojích. V případě, že za jméno adresáře napíšeme
lomítko, je přenesen jeho obsah, nikoliv adresář samotný. Následující dva
příkazy vedou ke stejnému výsledku, tj. zkopírování ISO obrazů do adresáře
/tmp/to_burn/tmp, zatímco původní příkaz vytvořil adresář
/tmp/to_burn/MDK-amd64
rsync /share/linux/MDK-amd64/ /tmp/to_burn rsync /share/linux/MDK-amd64/* /tmp/to_burn
Pro co možná nejidentičtější kopii lze použít parametr -a. Je
to zkratka za -rlptgoD. Parametr -r již známe,
-l znamená zachování symlinků, funkce ostatních je dohledatelná
v manuálové stránce.
Rsync se ovšem většinou používá nikoliv jako "chytřejší" cp,
ale pro přenos souborů po síti. Cílové nebo lokální umístění může mít jeden
ze dvou následujících tvarů
rsync -a rsync://ftp.debian.org/debian /ftproot/mirror/ftp.debian.org rsync -a www bfu@remote.machine.com:archive
První příkaz přenese Debianí FTP archiv na lokální stroj do určeného adresáře.
Druhý pak zkopíruje adresář www do adresáře archive v
domovském adresáři uživatele bfu na stroji
remote.machine.com.
Rozdíl je v použitém protokolu. Příklad s Debianem používá vlastní
rsync protokol, který je tak trochu podobný FTP.
Na straně serveru musí být tato služba zprovozněna a patřičně nakonfigurována
(tím se zde zabývat nebudeme), může vyžadovat autentizaci nebo umožnit
anonymní přístup.
Řada velkých archivů software tuto službu provozuje kvůli snadné synchronizaci
s mirrory, někdy je dostupná i běžným uživatelům – v takovém případě je
při stahování např. ISO obrazů vhodné dát programu rsync přednost před
FTP či HTTP. Použijeme přitom většinou také
volbu --partial, která způsobí, že při předčasném přerušení
není částečně stažený soubor smazán a stahování lze navázat.
bfu@linux:~$ rsync -v --progress --partial \ rsync://debian.sh.cvut.cz/debian-cd/current/ iso/i386/debian-30r2-i386-binary-1.iso . Welcome to SiLiCONN HiLL MiRROR SiTE Use: ftp.sh.cvut.cz::ftp/ Server name: ftp.sh.cvut.cz Server IP: 147.32.127.222 CPU and RAM: Intel Celeron 800MHz, 384MB Connection: 100 MBit Location: Europe, Czech Republic, Prague Contact: admin@ftp.sh.cvut.cz debian-30r2-i386-binary-1.iso 10829824 1% 5.67MB/s 0:01:43
Pro nás užitečnější bude ale především druhý zápis s dvojtečkou. V takovém
případě je přenos realizován přes službu vzdáleného shellu, dnes tedy většinou
ssh. Některé distribuce v defaultní konfiguraci zkouší používat
zastaralý rsh, k použití ssh pak rsync přimějeme
parametrem -e ssh. Na straně serveru musí běžet sshd
a musí být nainstalován rsync.
Následující příkaz přenese všechny PDF dokumenty z domovského adresáře vzdáleného serveru do aktuálního lokálního adresáře. Příklad předpokládá, že vzdálený uživatel je stejný jako lokálně přihlášený.
rsync remote.machine.com:*.pdf .
Lokální adresář data můžeme se stejnojmenným adresářem v domovském
adresáři na vzdáleném serveru synchronizovat příkazem
rsync -a --delete data remote.machine.com:
Parametr --delete způsobí smazání těch souborů a adresářů
v adresáři data na vzdáleném serveru, které neexistují lokálně.
Takto je možné např. synchronizovat data mezi notebookem a pracovní stanicí.
Protože jsou přenášeny jen změny a nové soubory, je celá operace většinou
rychlá i v případě, že celkový objem adresáře je značný.
Ke komfortnímu používání rsync a ssh je užitečné
používat ssh klíče a případně ssh agenta, aby při každém připojení nebylo
nutné zadávat heslo. To ale přesahuje rámec tohoto článku.
Rsync je opravdu mocný nástroj, práce s ním je efektivní a díky ssh také
bezpečná, navíc je možné ho použít prakticky kdekoliv (jak již bylo zmíněno,
stačí nainstalovaný rsync a ssh služba). Osobně ho preferuji
před podstatně méně schopným scp i před méně bezpečnými
a méně spolehlivými službami jako FTP. Věřím, že si ho také oblíbíte!
man sshman rsync