CONTENT
  • CHANGES
Szukaj
counter

#top ftpdcmds


#top DESCRIPTION


ftpdcmds pozwala na nawiązywanie połączeń do serwera FTP i wykonywanie wielu róznych operacji włączając: nawiązanie połączenia czysto-tekstowego lub połączenia szyfrowanego z weryfikacją certyfikatu, autoryzacje (w obydwu przypadkach bez szyfrowania połączenia i z szyfrowaniem połączenia), wysyłanie plików na serwer, pobieranie plików z serwera, oraz innych komend na serwerze FTP.

Jedną z metod przekazywania hasła jest umieszenie jego w adresie URL. Niestety metoda ta ujawnia hasło każdemu, kto wyświetli listę procesów za pomocą np: "ps". Aby uchronić hasła przed podejrzeniem, należy zapisać je w pliku .netrc oraz za pomocą polecenia "chmod", ograniczyć dostęp do tego pliku tylko dla właściciela. Jeżeli hasła są bardzo ważne, nie należy go przechowywać w tym pliku na stałe, tylko dodać na czas wykonywania operacji i usunąć je z pliku natychmiast po zakończeniu wykonywania operacji na serwerze.

#top Download


Download:



#top SYNOPSIS


SYNOPSIS
ftpdcmds [options] <command> <ftp[s]://user:pass@host[:port]/path/to/file>

#top OPTIONS


Opcje wspólne:

-d
Wyświetlanie informacji diagnostycznych.

-q
Tryb cichy. Wyłącza dodatkowe informacje wyświetlane standardowo.

--syserrors
Wyświetlanie systemowych przyczyn błędów.

Opcje sieciowe:

--prefer-family=family
Wybór preferowanej rodziny adresów do której nazwy będą rozwiązywane, możliwie wartości dla family: AF_UNSPEC|AF_INET|AF_INET6 (default: AF_UNSPEC).

--inet4
--ipv4
Rozwiązywanie nazw tylko do adresów protokołu IPv4 (opcja równoznaczna do --prefer-family=AF_INET).

--inet6
--ipv6
Rozwiązywanie nazw tylko do adresów protokołu IPv6 (opcja równoznaczna do --prefer-family=AF_INET6).

-w timeout-connect
-W timeout-connect
--timeout-connect=timeout-connect
Maksymalny czas oczekiwania na nawiązanie połączenia (domyślnie: 5.0). Dotyczy to tylko jednego serwera, w przypadku, gdy nazwa rozwiązuje się na 3 adresy IP, ten czas może być 3-krotnie dłuższy, jeśli połączenie z żadnym serwerem nie zakończy się sukcesem.
(-W - dla kompatybilności z innymi narzędziami sieciowymi)

-T timeout-socket
--timeout-socket=timeout-socket
Maksymalny czas oczekiwania na wykonanie operacji sieciowych wysyłania i odbierania danych (domyślnie: timeout-connect=5.0 timeout-socket=90.0).

--bind-addr=ipaddr
Przypisanie lokalnego addresu IP przed nawiązywaniem połączenia do zdalnego serwera.

--dnsqaddr=ipaddr
Ustawienie adresu IP serwera nazw, który będzie używany do rozwiązywania nazw na adresy IP.

--dnsqtimeo=dnsq-timeout
Maksymalny czas oczekiwania na rozwiązanie nazwy na adres IP przez wskazany serwer nazw (stosowane z opcją --dnsqaddr).

Opcje wyświetlania komend wysyłanych do serwera i zwracanych odpowiedzi:

--sock-send
Wyświetlanie pomocniczych informacji związanych z wysyłaniem danych.

--sock-recv
Wyświetlanie pomocniczych informacji związanych z odbieraniem danych.

--sock-info
Wyświetlanie pomocniczych informacji związanych z statusem wykonania wysłanych komend (metod).

-S
--comm-send
Wyświetlanie komend (nagłówków) wysyłanych do serwera.

-R
--comm-recv
Wyświetlanie komend (nagłówków) odbieranych od serwera.

--data-send
Wyświetlanie wysyłanych danych (treści) powiązanych z komendami (nagłówkami).

--data-recv
Wyświetlanie odbieranych danych (treści) powiązanych z komendami (nagłówkami).

Opcje TLS/SSL:

--ca-file=/etc/pki/tls/certs/ca-bundle.crt
Ustawienie ścieżki do pliku zawierającego certyfikaty główne i pośrednie.

--SNI=sniname
Ustawia sniname jako SNI zamiast nazwy hosta z adresu URL.

--starttls=TLSv13
Wymuszenie nawiązania bezpiecznego połączenia z użyciem protokołu szyfrowania TLSv13.

--starttls=TLSv12
Wymuszenie nawiązania bezpiecznego połączenia z użyciem protokołu szyfrowania TLSv12.

--starttls=TLSv11
Wymuszenie nawiązania bezpiecznego połączenia z użyciem protokołu szyfrowania TLSv11.

--starttls=TLSv10
Wymuszenie nawiązania bezpiecznego połączenia z użyciem protokołu szyfrowania TLSv10.

--starttls=SSLv3
Wymuszenie nawiązania bezpiecznego połączenia z użyciem protokołu szyfrowania SSLv3.

--starttls
Wymuszenie nawiązania bezpiecznego połączenia z użyciem dowolnego protokołu szyfrowania.

--tlsinfo
Wyświetlenie informacji o nawiązanym połączeniu TLS/SSL (parametry szyfrowania):
Description - Opis protokołu TLS/SSL (Wersja - Zestaw Szyfrowania),
Session ID - Identyfikator Sesji,
Version - Wersja protokołu,
Cipher Suite - Zestaw Szyfrowania,
Key eXchange - Sposób wymiany kluczy,
Cipher - Szyfr,
MAC - Kod Uwierzytelnienia Wiadomości,
Compression - Kompresja używana w protokole TLS/SSL,

--certcheck-no
Weryfikacja Certyfikatu:
Zwrócenie kodu weryfikacji certyfikatu, umożliwiającego przerwanie połączenia w przypadku nie prawidłowego certyfikat (w przypadku braku tej opcji zostanie zwrócony kod oznaczający, że certyfikat jest prawidłowy, nawet w przypadku nie prawidłowego certyfikatu).

--certverify
Weryfikacja informacji w certyfikacie:
Sprawdzenie czy Wystawca certyfikatu jest zaufany
Sprawdzenie czy nazwa hosta w certyfikacie pasuje do nazwy hosta z którym nawiązano połączenie,
Wyświetlenie Wystawcy certyfikatu,
Wyświetlenie Podmiotu certyfikatu,
Sprawdzenie dat ważności certyfikatu,

--certinfo
Informacje o certyfikacie X509:
Wyświetlenie wersji certyfikatu,
Wyświetlenie Numeru Seryjnego certyfikatu,
Wyświetlenie Sygnatury Argorytmu certyfikatu,
Wyświetlenie Wystawcy certyfikatu,
Wyświetlenie Podmiotu certyfikatu,
Wyświetlenie dat ważności certyfikatu,
Wyświetlenie informacji o Kluczu Publicznym,
Wyświetlenie Rozszerzeń certyfikatu,

--certshow
Wyświetlenie certyfikatu w formacie PEM (Privacy Enhanced Mail).

Opcje różne:

--color=WHEN
Kolorowanie wysyłanych komend i odbieranych statusów wykonania komend (nagłówków), WHEN może być jednym z: 'auto', 'always', 'never',

--conn-retry-max=count
Ustawia maksymalną liczbę ponowień operacji żądania na liczbę \fIcount\fR w przypadku, gdy żądanie nie może zostać zrealizowane z powodu błędów w komunikacji sieciowej.

--conn-retry-wait=seconds
Ustawia czas przerwy na seconds sekund przed ponowieniem żądania w przypadku, gdy żądanie nie może zostać zrealizowane z powodu błędów w komunikacji sieciowej.

Opcje protokołu FTP:

--disable-auth
Wyłacza (pomija) operacje autentykacji.

--disable-op
Wyłącza wykonywanie operacji określonych wywołaną komendą.

--disable-comm-list
Nie używaj komendy LIST do wyświetlenia zawartości katalogu.

--list-comm-nlst
Użyj komendy NLST do wyświetlenia zawartości katalogu.

--list-comm-mlsd
Użyj komendy MLSD do wyświetlenia zawartości katalogu.

--data-comm-pasv
Użyj komend PASV/PORT dla pasywnego/aktywnego połączenia (zamiast domyślnych EPSV/EPRT dla pasywnego/aktywnego połączenia).

--data-mode-active
Użyj aktywnego połączenia zamiast domyślnego pasywnego połączenia dla operacji wyświetlania zawartości katalogu i transferu plików.
Użyj komend EPRT/PORT dla aktywnego połączenia (zamiast domyślnych EPSV/PASV dla pasywnego połączenia).

-c
--rest-data
Kontynowanie pobieranie częściowo ściągniętego pliku. Należy zwrócić uwagę, że nie jest wykonywane żadne sprawdzenie (nie ma takiej możliwości) czy pobrana już część pliku jest aktualna.

--disable-op
Wyłącza wykonywanie operacji dla aktualnie wybranej komendy.

--command-pre="command"
Wysyła komendę command przed wykonaniem operacji określonych aktualnie wybraną komendą.

--command-post="command"
Wysyła komendę command po wykonaniu operacji określonych aktualnie wybraną komendą.

--file-path=/path/to/file/root
Określa ścieżkę katalogu głównego dla listy plików ze ścieżką względną.

--file-list=/path/to/file/list
Określa ścieżkę do pliku zawierającego listę plików ze ścieżką względną do pobrania lub wysłania do serwera.



#top COMMANDS


komendy dostępne:

#top UTILS commands


Komendy różne:

noop
Wysłanie instrukcji pustej do serwera. W programie uruchamianym z wiersza poleceń nie ma żadnego zastosowania, ale w innych aplikacjach utrzymujących połączenie do serwera przez dłuższy czas wysłanie pustej instrukcji pozwala sprawdzić czy połączenie jest aktywne oraz czy serwer odpowiada na wysyłane komendy.

syst
Wysłanie komendy SYST do serwera.

help
Wysłanie komendy HELP do serwera.

feat
Wysłanie komendy FEAT do serwera.

#top DIRS commands


Komendy do zarządzania katalogami:

stat
Wyświetlenie statusu katalogu (zawartości katalogu) lub pliku (statusu pliku).

mlst
Wyświetlenie informacji o katalogu lub pliku.

list
mlsd
nlst
Wyświetlenie zawartości (wylistowanie) katalogu.

mkd
mkdir
Utworzenie katalogu.

rmd
rmdir
Usunięcie katalogu.

remove
Usunięcie pliku lub katalogu z zawartością (rekurencyjnie).

#top FILES commands


Komendy do zarządzania plikami:

size
Wyświetlenie rozmiaru katalogu.

mdtm
time
Wyświetlenie daty modyfikacji pliku (nie katalogu).

rename
Zmiana nazwy pliku lub katalogu.

dele
Usunięcie pliku.

#top TRANSFER commands


Komendy do przesyłania plików:

retr
Pobranie pliku z serwera.

stor
Wysłanie pliku do serwera.



#top ENVIRONMENT VARIABLES


ZMIENNE ŚRODOWISKOWE

HOME
Określa ścieżkę do katalogu domowego w którym znajduje się plik konfiguracyjny użytkownika.



#top FILES


PLIKI

/etc/ftpdcmdsrc
Globalny plik konfiguracyjny.

$HOME/.ftpdcmdsrc
Prywatny plik konfiguracyjny użytkownika.



#top SYNTAX FTPDCMDSRC


SKŁADNIA FTPDCMDSRC

syserrors=WHEN
Wyświetlanie systemowych przyczyn błędów, WHEN może być jednym z: '1', '0', 'on', 'off'.

prefer-family=family
Wybór preferowanej rodziny adresów do której nazwy będą rozwiązywane, możliwie wartości dla family: AF_UNSPEC|AF_INET|AF_INET6 (default: AF_UNSPEC).

timeout-connect=seconds
Maksymalny czas oczekiwania na nawiązanie połączenia (domyślnie: 5.0). Dotyczy to tylko jednego serwera, w przypadku, gdy nazwa rozwiązuje się na 3 adresy IP, ten czas może być 3-krotnie dłuższy, jeśli połączenie z żadnym serwerem nie zakończy się sukcesem.

timeout-socket=seconds
Maksymalny czas oczekiwania na wykonanie operacji sieciowych wysyłania i odbierania danych (domyślnie: timeout-socket=90.0).

bind-addr=ipaddr
Przypisanie lokalnego addresu IP przed nawiązywaniem połączenia do zdalnego serwera.

dnsqaddr=ipaddr
Ustawia adres IP serwera nazw, który będzie używany do rozwiązywania nazw na adresy IP.

dnsqtimeo=dnsq-timeout
Maksymalny czas oczekiwania na rozwiązanie nazwy na adres IP przez wskazany serwer nazw (stosowane z opcją dnsqaddr=ipaddr).

proxyurl=(imap[s]|sieve|pop3[s]|nntp[s])://[user[:pass]@]host[:port]/
Używanie podanego adresu jako proxy do nawiązania połączenia z serwerem IMAP.

proxytunnel=WHEN
Nawiązanie połączenia tunelowanego przez proxy, WHEN może być jednym z: '1', '0', 'on', 'off'.

proxysocks=WHEN
Nawiązanie połączenia przez proxy socks, \fIWHEN\fR może być jednym z: '1', '0', 'on', 'off', WHEN może być jednym z: '1', '0', 'on', 'off'.


sock-send=WHEN
Wyświetlanie pomocniczych informacji związanych z wysyłaniem danych, WHEN może być jednym z: '1', '0', 'on', 'off'.

sock-recv=WHEN
Wyświetlanie pomocniczych informacji związanych z odbieraniem danych, WHEN może być jednym z: '1', '0', 'on', 'off'.

sock-info=WHEN
Wyświetlanie pomocniczych informacji związanych z statusem wykonania wysłanych komend (metod), WHEN może być jednym z: '1', '0', 'on', 'off'.

comm-send=WHEN
Wyświetlanie komend (nagłówków) wysyłanych do serwera, WHEN może być jednym z: '1', '0', 'on', 'off'.

comm-recv=WHEN
Wyświetlanie komend (nagłówków) odbieranych od serwera, WHEN może być jednym z: '1', '0', 'on', 'off'.

data-send=WHEN
Wyświetlanie wysyłanych danych (treści) powiązanych z komendami (nagłówkami), WHEN może być jednym z: '1', '0', 'on', 'off'.

data-recv=WHEN
Wyświetlanie odbieranych danych (treści) powiązanych z komendami (nagłówkami), WHEN może być jednym z: '1', '0', 'on', 'off'.


ca-file=/etc/pki/tls/certs/ca-bundle.crt
Ustawienie ścieżki do pliku zawierającego certyfikaty główne i pośrednie.

tlsinfo=WHEN
Wyświetlenie informacji o nawiązanym połączeniu TLS/SSL (parametry szyfrowania), WHEN może być jednym z: '1', '0', 'on', 'off'.

certverify=WHEN
Weryfikacja informacji w certyfikacie, WHEN może być jednym z: '1', '0', 'on', 'off'.

certinfo=WHEN
Informacje o certyfikacie X509, WHEN może być jednym z: '1', '0', 'on', 'off'.

certshow=WHEN
Wyświetlenie certyfikatu w formacie PEM (Privacy Enhanced Mail), WHEN może być jednym z: '1', '0', 'on', 'off'.


color=WHEN
Kolorowanie wysyłanych komend i odbieranych statusów wykonania komend (nagłówków), WHEN może być jednym z: 'auto', 'always', 'never'.

conn-retry-max=count
Określenie maksymalnej ilości powtórzeń prób nawiązania połączenia na count w przypadku nieudanej próby nawiązania połączenia.

conn-retry-wait=seconds
Oczekuje określoną ilość sekund podaną w argumencie seconds pomiędzy powtórzeniem pownego nawiązania połączenia.



#top SEE ALSO


ZOBACZ TAKŻE




#top EXAMPLES


Przykłady przedstawiono w analogicznej kolejności do opisanych powyżej komend.

Nawiązanie połączenia z serwerem i zakończenie połączenia:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv noop ftp://host[:port]/

Nawiązanie szyfrowanego połączenia z serwerem, weryfikacja certyfikatu, wyświetlenie informacji o certyfikacie i zakończenie połączenia:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --ca-file=/etc/pki/tls/certs/ca-bundle.crt --starttls --tlsinfo --certcheck-no --certverify --certinfo noop ftp://host[:port]/

Wyświetlenie statusu katalogu (zawartości katalogu) i statusu pliku:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv stat ftp://host[:port]/
ftpdcmds --syserrors -w 5 --comm-send --comm-recv stat ftp://host[:port]/filename.txt

Wyświetlenie informacji o katalogu i pliku:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv mlst ftp://host[:port]/
ftpdcmds --syserrors -w 5 --comm-send --comm-recv mlst ftp://host[:port]/filename.txt

Wyświetlenie zawartości (wylistowanie) katalogu (komendą LIST z użyciem w trybu pasywnego oraz aktywnego):
ftpdcmds --syserrors -w 5 --comm-send --comm-recv list ftp://host[:port]/
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --data-mode-active list ftp://host[:port]/

Wyświetlenie zawartości (wylistowanie) katalogu (komendą NLST):
ftpdcmds --syserrors -w 5 --comm-send --comm-recv nlst ftp://host[:port]/
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --list-comm-nlst list ftp://host[:port]/

Wyświetlenie zawartości (wylistowanie) katalogu (komendą MLSD):
ftpdcmds --syserrors -w 5 --comm-send --comm-recv mlsd ftp://host[:port]/
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --list-comm-mlsd list ftp://host[:port]/

Pobranie (zapisanie) pliku z serwera do lokalnego pliku:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv retr ftp://host[:port]/filename.txt /path/to/filename.txt

Wysłanie pliku lokalnego do serwera:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv stor ftp://host[:port]/filename.txt /path/to/filename.txt

Kontynowanie pobierania częściowo pobranego pliku z serwera do lokalnego pliku:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --rest-data retr ftp://host[:port]/filename.txt /path/to/filename.txt

Kontynowanie wysłania częściowo wysłanego pliku lokalnego do serwera:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv --rest-data stor ftp://host[:port]/filename.txt /path/to/filename.txt

Pobranie (rekurencyjnie) katalogu z serwera do lokalnego katalogu:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv retr ftp://host[:port]/pathname/ /path/to/pathname/

Wysłanie (rekurencyjnie) katalogu lokalnego do serwera:
ftpdcmds --syserrors -w 5 --comm-send --comm-recv stor ftp://host[:port]/pathname/ /path/to/pathname/



Przykład:
ftpdcmds -w 5 --sock-info --comm-send --comm-recv list ftp://ftp.atman.pl/
Rezultat:
ftpdcmds: Resolving ftp.atman.pl ... 2001:1a68::d911:228e, 217.17.34.102 Success
ftpdcmds: Connecting to ftp.atman.pl[2001:1a68::d911:228e]:21 Failed, Reason: 101:Network is unreachable
ftpdcmds: Connecting to ftp.atman.pl[217.17.34.102]:21 Success
ftpdcmds: result=ftp_conn(): result=1 Connect:OK Connected to ftp.atman.pl[217.17.34.102]:21
< 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
< 220-You are user number 2 of 50 allowed.
< 220-Local time is now 19:57. Server port: 21.
< 220-IPv6 connections are also welcome on this server.
< 220 You will be disconnected after 15 minutes of inactivity.
ftpdcmds: result=ftp_banner(): result=269 BANNER:OK 220:You will be disconnected after 15 minutes of inactivity.
> USER ftp
< 230 Anonymous user logged in
ftpdcmds: result=ftp_auth(): result=1 AUTH:OK 230:Anonymous user logged in
> EPSV
< 229 Extended Passive mode OK (|||64020|)
ftpdcmds: result=ftp_cmd_epsv()/ftp_cmd_pasv()/ftp_cmd_port()/ftp_cmd_eprt(): result=1 EPSV/PASV/PORT/EPRT:OK 229:Extended Passive mode OK (|||64020|)
> TYPE A
< 200 TYPE is now ASCII
ftpdcmds: result=ftp_cmd_type(A): result=1 TYPE:OK 200:TYPE is now ASCII
ftpdcmds: Connecting to DATA[217.17.34.102]:64020 Success
> LIST /
< 150 Accepted data connection
ftpdcmds: Connecting to DATA[217.17.34.102]:64020 To HOST[:0]: Success
ftpdcmds: result=ftp_cmd_list()/ftp_cmd_nlst(): result=1 LIST:OK 150:Accepted data connection
-rw-r--r--    1 1010       1010          1048576 Apr 18  2018 test1mb
-rw-r--r--    1 1010       1010        268435456 Apr 18  2018 test256mb
-rw-r--r--    1 0          0                 26843545600 Jun 27  2018 test25gb
-rw-r--r--    1 1010       1010       1372334563 Oct  7 14:55 test5gb
-rw-r--r--    1 1010       1010         67108864 Apr 18  2018 test64mb
drwxrwxr-x    2 1010       1010             4096 Oct 11 21:40 upload

< 226-Options: -l
< 226 6 matches total
ftpdcmds: result=ftp_cmd_list()/ftp_cmd_nlst()/ftp_cmd_mlsd(): result=1 LIST:OK 226:6 matches total
ftpdcmds: LIST: size=0 [B] time=0.002 [s] speed=0 [B/s] speed=0.0 [kB/s] speed=0.00 [MB/s]
> QUIT
< 221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
< 221 Logout.
ftpdcmds: result=ftp_cmd_close(): result=1 QUIT:OK 6 matches total
ftp://ftp.atman.pl/ dnsq=0.005, conn=0.085, banner=0.115, starttls=0.000, socktls=0.000 auth=0.000, comm=0.009, datatime=0.002, quit=0.000, summ=0.318, size=0, speed=0, SH=38 SB=0 RH=500, RB=0, result=226:6 matches total

Przykład:
ftpdcmds -w 5 --sock-info --comm-send --comm-recv --ca-file=/etc/pki/tls/certs/ca-bundle.crt --starttls --tlsinfo --certcheck-no --certverify --certinfo msgslist ftp://ftp.atman.pl/
Rezultat:
ftpdcmds: Resolving ftp.atman.pl ... 2001:1a68::d911:228e, 217.17.34.102 Success
ftpdcmds: Connecting to ftp.atman.pl[2001:1a68::d911:228e]:21 Failed, Reason: 101:Network is unreachable
ftpdcmds: Connecting to ftp.atman.pl[217.17.34.102]:21 Success
ftpdcmds: result=ftp_conn(): result=1 Connect:OK Connected to ftp.atman.pl[217.17.34.102]:21
< 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
< 220-You are user number 2 of 50 allowed.
< 220-Local time is now 19:58. Server port: 21.
< 220-IPv6 connections are also welcome on this server.
< 220 You will be disconnected after 15 minutes of inactivity.
ftpdcmds: result=ftp_banner(): result=269 BANNER:OK 220:You will be disconnected after 15 minutes of inactivity.
> AUTH TLS
< 500 This security scheme is not implemented
> AUTH SSL
< 500 This security scheme is not implemented
ftpdcmds: result=ftp_starttls(): result=0 STARTTLS:FAIL 500:This security scheme is not implemented
> QUIT
< 221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
< 221 Logout.
ftpdcmds: result=ftp_cmd_close(): result=1 QUIT:OK This security scheme is not implemented
ftp://ftp.atman.pl/ dnsq=0.066, conn=0.009, banner=0.011, starttls=0.010, socktls=0.000 auth=0.000, comm=0.000, datatime=0.000, quit=0.000, summ=0.152, size=0, speed=0, SH=26 SB=0 RH=426, RB=0, result=500:This security scheme is not implemented




Zmodyfikowany ostatnio: 2020/07/11 09:52:50 (3 lata temu), textsize: 30,9 kB, htmlsize: 41,6 kB

Zapraszam do komentowania, zgłaszania sugestii, propozycji, własnych przykładów, ...
Dodaj komentarzKomentarze użytkowników