Jak przesłać dane ze zdalnego systemu?
Załóżmy, że mamy system, który stoi sobie na drugim końcu świata (o ile świat ma dwa końce). Dostęp do tegoż systemu mamy wyłącznie przez SSH i żadna inna usługa na nim nie pracuje. Mam wprawdzie uprawnienia administratora, jednak host strzeżony jest przez „wielkiego ogniomura”, który nie pozwala podróżować pakietom innym, niż tym z inicjałami tcp/22 i nie jesteśmy w stanie nic na to poradzić. I chcemy z tego wspaniałego systemu pobrać plik. W sumie nic prostszego:
[kbechler@flame .ssh]$ scp kbechler@lupus:~/lico-update.sh ~
kbechler@lupus's password:
lico-update.sh 100% 19KB 18.9KB/s 00:00
[kbechler@flame .ssh]$
Trudne to jakoś specjalnie nie było.
A teraz spróbujmy zrobić to samo, ale z urządzeniem blokowym (bo chcemy zrobić kopię zapasową odmontowanej partycji):
[kbechler@flame .ssh]$ scp kbechler@lupus:/dev/sda2 ~
kbechler@lupus's password:
scp: /dev/sda2: Permission denied
[kbechler@flame .ssh]$
Hmmm, brakuje nam trochę uprawnień :-\
Ale możemy przecież zrobić tak, aby te uprawnienia uzyskać:
[kbechler@lupus ~]$ sudo chmod 644 /dev/sda2
I co teraz?
[kbechler@flame .ssh]$ scp kbechler@lupus:/dev/sda2 ~
kbechler@lupus's password:
scp: /dev/sda2: not a regular file
[kbechler@flame .ssh]$
Upsss….chyba niewiele to dało. Przywróćmy lepiej poprzednie prawa:
[kbechler@lupus ~]$ sudo chmod 64 /dev/sda2
No dobra, to co możemy zrobić? Ano możemy połączyć siłę SSH z wielce użytecznym narzędziem dd oraz potokami:
[kbechler@flame ~]$ ssh kbechler@lupus "sudo dd if=/dev/sda2" | dd of=~/sda2
kbechler@lupus's password:
4116480+0 records in
4116480+0 records out
2107637760 bytes (2.1 GB) copied, 70.9355 seconds, 29.7 MB/s
4116480+0 records in
4116480+0 records out
2107637760 bytes (2.1 GB) copied, 75.0957 seconds, 28.1 MB/s
[kbechler@flame ~]$
Tadam!
W zależności od tego, co tak naprawdę przesyłamy, możemy do kompletu zaprosić jeszcze jakiś kompresor:
[kbechler@flame ~]$ ssh kbechler@lupus "sudo dd if=/dev/sda2 | bzip2 -9" | bzip2 -d | dd of=~/sda2
kbechler@lupus's password:
4116480+0 records in
4116480+0 records out
2107637760 bytes (2.1 GB) copied, 74.1963 seconds, 28.4 MB/s
ex4116480+0 records in
4116480+0 records out
2107637760 bytes (2.1 GB) copied, 107.966 seconds, 19.5 MB/s
[kbechler@flame ~]$
W sumie tyle :-)