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 82904×
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 ssh
man rsync