Linux v příkazech - ssh, rsync

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 82907×

SSH

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

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!

Zdroje

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=265