Próbuję ustawić minimalny serwer WWW za pomocą netcat (nc). Na przykład, gdy przeglądarka wywołuje localhost: 1500, powinna pokazać wynik funkcji ( data w poniższym przykładzie, ale ostatecznie będzie to program w języku Python lub c, który dostarcza pewne dane). Mój mały serwer sieciowy netcat musi być chwilową prawdziwą pętlą w bashu, prawdopodobnie tak prostym, jak to:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Kiedy próbuję tego, przeglądarka pokazuje aktualnie dostępne dane w momencie uruchomienia nc. Chcę jednak, aby przeglądarka wyświetlała dane w momencie, gdy żąda ich. Jak mogę to osiągnąć?
Odpowiedzi:
Spróbuj tego:
Te
-c
marki Netcat wykonać daną komendę w powłoce, dzięki czemu można używać echo. Jeśli nie potrzebujesz echa, użyj-e
. Aby uzyskać więcej informacji na ten temat, spróbujman nc
. Zwróć uwagę, że podczas korzystaniaecho
z programu Twój program (date
opcja -replacement) nie może uzyskać żądania przeglądarki. Więc prawdopodobnie w końcu chcesz zrobić coś takiego:Gdzie
yourprogram
należy wykonać czynności związane z protokołem, takie jak obsługa GET, wysyłanie HTTP 200 itp.źródło
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l localhost 1500; done
It is an error to use this option in conjunction with the -l option
-p
opcji razem z-l
jedną jest błędem, oficjalna witryna internetowa netcat używa obu opcji w swoich przykładach. Zobacz: nc110.sourceforge.netnc
: Hobbit (oryginał), BSD / Mac OS X i GNU (najstarszy z tej grupy i nie jest już obsługiwany). Jest też Ncat Nmapa . Podnoszę to, ponieważ myślę, że warto zauważyć, że flagi-l
i-p
razem są uważane za błąd tylko w wersji BSD nc, stąd alternatywna składnia podana przez @matlehmannNie wiem, jak i dlaczego, ale udaje mi się to znaleźć i działa dla mnie, miałem problem, chciałem zwrócić wynik wykonania basha
UWAGA: To polecenie zostało pobrane z: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
wykonuje to test skryptu bash i zwraca wynik do klienta przeglądarki łączącego się z serwerem uruchamiającym to polecenie na porcie 8080
Mój skrypt wykonuje ten bankomat
i wyświetla się moja przeglądarka internetowa
po prostu wspaniałe!
źródło
-k
flagę, a nie dodającConnection: keep-alive
do nagłówka żądania.Dodaj
-q 1
donetcat
wiersza poleceń:źródło
-q
1 nie pracuje wCentOS
6.x, co powinno być wykorzystane doCentOS
6.x gdzie mówiąc:nc: invalid option -- 'q'
.while true; do tail -f /usr/local/freeswitch/log/freeswitch.log | nc -l 9999; done &
/usr/local/freeswitch/log/freeswitch.log
?-q 1
działało dla mnie na Ubuntu 18.04. Mam nadzieję, że to pomoże.Problem, z którym się spotykasz, polega na tym, że nc nie wie, kiedy klient sieciowy wykonuje swoje żądanie, aby mógł na nie odpowiedzieć.
Sesja internetowa powinna wyglądać mniej więcej tak.
Wiersze zaczynające się od „\ n” to po prostu puste wiersze bez spacji i zawierające jedynie znak nowego wiersza.
Mam mój bash httpd uruchomiony przez xinetd, samouczek xinetd . Rejestruje również datę, godzinę, adres IP przeglądarki i całe żądanie przeglądarki do pliku dziennika i oblicza długość zawartości dla odpowiedzi nagłówka serwera.
Aby dodać więcej funkcji, możesz dołączyć.
Miłego uderzenia!
źródło
Miałem tę samą potrzebę / problem, ale nic tutaj nie działało (lub nie rozumiałem wszystkiego), więc to jest moje rozwiązanie.
Publikuję mój minimal_http_server.sh (pracuję z moim / bin / bash (4.3.11), ale nie / bin / sh z powodu przekierowania):
I mój a_script.sh (z twoimi potrzebami):
źródło
read
itr
) i mniejszą ([
po elif). Nie odtwarzam twojego problemu. Nie rozumiem, dlaczego minimal_http_server.sh powodowałby te 1-sekundowe interwały. Możesz określić, czy jest to minimal_http_server.sh, czy plik „a_script.sh”, który jest uszkodzony, uruchamiając wiele razy (z taką samą częstotliwością jak żądania curl) ./a_script.sh po ustawieniu zmiennej środowiskowej REQUEST.Inny sposób, aby to zrobić
Przetestujmy to za pomocą 2 żądań HTTP za pomocą curl
W tym przykładzie 172.16.2.6 to adres IP serwera.
Po stronie serwera
Strona klienta
Jeśli chcesz wykonać inne polecenie, możesz zamienić $ (data).
źródło
źródło
read line<pipe
będzie czekać, ażnc
się napiszepipe
? Ale w tym momencie myślę, że żądanie zostało wykonane, zanim odpowiedź zostanie napisana ..?Oto piękno małego serwera internetowego bash , znalazłem go online, rozwidliłem kopię i trochę go ulepszyłem - używa
socat
lubnetcat
przetestowałem gosocat
- jest samodzielny w jednym skrypcie i generuje własny plik konfiguracyjny i favicon.Domyślnie uruchomi się jako przeglądarka plików z obsługą sieci, ale można ją łatwo skonfigurować za pomocą pliku konfiguracyjnego dla dowolnej logiki. W przypadku plików przesyła strumieniowo obrazy i muzykę (mp3), wideo (mp4, avi itp.) - testowałem przesyłanie strumieniowe różnych typów plików na urządzenia z systemem Linux, Windows i Android, w tym smartwatch!
Myślę, że w rzeczywistości strumieniuje lepiej niż VLC. Zauważyłem, że jest to przydatne do przesyłania plików do klientów zdalnych, którzy nie mają dostępu poza przeglądarką internetową, np. Smartwatch z Androidem, bez konieczności fizycznego łączenia się z portem USB.
Jeśli chcesz go wypróbować, po prostu skopiuj i wklej go do pliku o nazwie bashttpd, a następnie uruchom go na hoście za pomocą
$> bashttpd -s
Następnie możesz przejść do dowolnego innego komputera (zakładając, że zapora nie blokuje przychodzących połączeń TCP do portu 8080 - domyślny port, możesz zmienić port na dowolny, używając zmiennych globalnych u góry skryptu).
http://bashttpd_server_ip:8080
źródło
main
funkcji gdzie jest napisane[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, super lame hack, ale przynajmniej curl i Firefox to akceptuje:
Lepiej szybko zastąp go czymś odpowiednim!
Ach tak, moje
nc
nie były dokładnie takie same jak twoje, nie podobała się ta-p
opcja.źródło
Jeśli używasz Apline Linux, netcat BusyBox jest nieco inny:
źródło
Wpisz nc -h i zobacz, czy masz dostępną opcję -e . Jeśli tak, możesz stworzyć skrypt, na przykład:
script.sh
i uruchom to w ten sposób:
Zauważ, że opcja -e musi być włączona podczas kompilacji, aby była dostępna.
źródło
Myślę, że problem polegający na tym, że wszystkie wymienione rozwiązania nie działają, jest nieodłączny w naturze usługi http, każde ustalone żądanie dotyczy innego klienta, a odpowiedź musi być przetworzona w innym kontekście, każde żądanie musi być nowe instancja odpowiedzi ...
Obecne rozwiązanie moim zdaniem jest
-e
onetcat
ale nie wiem dlaczego nie działa ... Może to mojanc
wersja to przetestować naopenwrt
...z
socat
tym działa ...Próbuję tego https://github.com/avleen/bashttpd
i działa, ale muszę uruchomić skrypt powłoki za pomocą tego polecenia.
socat
Inetcat
próbki na github nie działa na mnie, alesocat
że kiedyś prace.źródło
reuseaddr
flagą uczyniłeś mój dzień! DZIĘKUJĘWłaściwie najlepszym sposobem na bezpieczne zamknięcie połączenia jest wysłanie
Content-Length
nagłówka, takiego jak następujący. Klient (jakcurl
zamknie połączenie po otrzymaniu danych.źródło