21 Oct 2007

NetCat, a przesyłanie plików.

NetCat (nc) jest narzędziem pozwalającym m.in transmitować dowolne dane (nie tylko tekstowe) korzystając z protokołów TCP i UDP, skanować porty zdalnych maszyn, tworzyć proste serwery usług i robić wiele innych fajnych rzeczy. Z racji swojej niewielkiej objętości często jest określany scyzorykiem szwajcarskim ... ale nie o tym miałem pisać, każdy kogo zainteresowały dodatkowe opcje nc niech spojrzy do manuala i do licznych przykładów wykorzystania tego programu dostępnych przez Google.

Ja w tej krótkiej notce chciałbym pokazać, że istnieje alternatywny (dla FTP i SCP) sposób transferu dużych plików przez sieć lokalną (nie polecam przesyłać w taki sposób danych przez internet ponieważ nie ma wznawiania transmisji i dane nie są w żaden sposób szyfrowane przez program nc).

A więc po kolei, dla NetCata nie ma znaczenia skąd przychodzą dane i gdzie są wysyłane dopóki jest to możliwe. Program może działać zarówno jako klient jak i serwer. Pora przejść do praktyki:

Serwer do którego przesyłamy ma ip zewnętrzne

Sytuacja taka ma miejsce gdy maszyna na której uruchomiliśmy NetCata jako serwer (punkt docelowy dla danych, które przesyłamy) jest widoczna przez klienta (drugi komputer)

serwer: (punkt docelowy dla danych):

nc -l -p 6666 | tar xvfp -
Notka:Jeśli nie masz praw administratora systemu to jest wątpliwe by udało Ci się uruchomić nasłuchiwanie na porcie niższym niż 1024.
Notka:W tym przypadku serwerem jest maszyna odbierająca dane.

klient (źródło danych):

tar cfp - /katalog/do/przeslania | nc -w 3 ip_serwera_nc 6666
i właściwie nasze dane sa już przesyłane. Notka:Operacja nie zawsze się powiedzie ponieważ jeśli na komputerze będącym serwerem mamy zablokowane porty (np przez iptables) to zadne dane do naszego serwera nie dotrą, ponieważ zostaną odrzucone przez firewall.

Klient ma zewnętrzne ip

Sytuacja taka ma miejsce, gdy punkt docelowy dla danych jest np za firewallem i nijak nie możemy się z nim skomunikować bezpośrednio, ale sami mamy ip widoczne (np zewnętrzne) z punktu docelowego

serwer (źródło danych)

tar cvfp - . | nc -w 3 -l -p 6666

klient (punkt docelowy dla danych):

nc adres_ip_serwera 6666 | tar xvfp -

Oba komputery znajdują się za NATem

Posiadamy dostęp do trzeciego komputera z ip zewnętrznym

Wydaje się, że jest to sytuacja patowa, ale gdy mamy dostęp do zewnętrznego komputera z Linuxem i ten komputer stoi na w miarę dobrym łączu, możemy obejść tą niedogodność niewielkim kosztem (generując dosyć znaczny ruch z maszyny z ip zewnętrznym)

Konfiguracja maszyny z ip zewnętrznym (nazwijmy ją przesiadkową)

nc -w 3 -l -p 6666 | nc -w 3 -l -p 6667 6668
Notka: Uruchamiamy tutaj podwójny serwer nc, który transmituje nam ruch pomiędzy maszynami, ale to nie wszystko zabawa się zaczyna gdy pomiędzy dwa serwery nc damy polecenie tee dodatkowo duplikujące dane przychodzące z pipe do pliku zewnętrznego (jednym słowem za jednym przesłaniem danych mamy je na dwóch maszynach - przesiadkowej i docelowej). Ale to chyba nie jest tak naprawdę interesujące.

klient (źródło danych):

tar cfp - dane_do_poslania | nc -w 3 ip_serwera 6666

klient (punkt docelowy dla danych):

nc ip_serwera 6667 6668 | tar xvfp -
Notka:Ten sposób działa ale dosyć dużym kosztem (podwaja ruch na maszynie przesiadkowej - dobrze by było gdyby miała łącze full duplex), ale można to zrobić lepiej poprzez tzw NAT Traversal ... ale o tym może innym razem.

Proste operacje na stringach w Bashu.

By mieć to zawsze pod ręką i się nie zastanawiać czy na pewno jest dobrze :)
#!/bin/bash
PATH2=/usr/src/linux
FILE=archive.tar.gz
PATHFILE=/home/johny/Desktop/ff.zip
echo '## THE PATH'
echo $PATH2 '=>'  ${PATH2%/*}             # rm last / or get parent
echo '## FILE'
echo ${FILE} '=>' ${FILE%%.*}           # name without extension
echo ${FILE} '=>' ${FILE##*.}           # only last extesion
echo ${FILE} '=>' ${FILE#*.}            # full extension
echo '## PATHFILE'
echo $PATHFILE '=>' ${PATHFILE%/*}
echo ${PATHFILE} '=>' ${PATHFILE##*.}
echo ${PATHFILE} '=>' ${PATHFILE#*.}

Wynik:
## THE PATH
/usr/src/linux => /usr/src
## FILE
archive.tar.gz => archive
archive.tar.gz => gz
archive.tar.gz => tar.gz
## PATHFILE
/home/johny/Desktop/ff.zip => /home/johny/Desktop
/home/johny/Desktop/ff.zip => zip
/home/johny/Desktop/ff.zip => zip

AVR w Gentoo.

Sprawa się wydaje być banalna, ale trzeba zainstalować następujące pakiet: sys-devel/crossdev. Niestety wersję którą ja miałem okazję testować nękały problemy kompilacji glibca, których rozwiązaniem było wydanie następujących komend:
gcc-config -l
gcc-config avr-3.4.6 # tu kompilator do kompilacji skrośnej na AVRy
source /etc/profile
env-update

po tym glibc się już skompilował bez problemu. Opis jak zrobić sobie środowisko do pracy z AVR znajduje się tutaj: http://kosma.jogger.pl/2006/07/04/avr-gcc-pod-gentoo/ (nie to nie żart ;)).