Saya mencoba menyiapkan server web minimal menggunakan netcat (nc). Ketika browser memanggil localhost: 1500, misalnya, itu harus menunjukkan hasil dari suatu fungsi ( tanggal dalam contoh di bawah, tetapi pada akhirnya itu akan menjadi program python atau c yang menghasilkan beberapa data). Server web netcat kecil saya perlu menjadi loop yang sebenarnya dalam bash, mungkin sesederhana ini:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Ketika saya mencoba ini, browser menunjukkan data yang tersedia saat ini pada saat nc mulai. Saya ingin browser menampilkan data pada saat browser memintanya. Bagaimana saya bisa mencapai ini?
Jawaban:
Coba ini:
The
-c
merek netcat mengeksekusi perintah yang diberikan di shell, sehingga Anda dapat menggunakan echo. Jika Anda tidak membutuhkan gema, gunakan-e
. Untuk informasi lebih lanjut tentang ini, cobaman nc
. Perhatikan, bahwa saat menggunakanecho
tidak ada cara untuk program Anda (date
-replacement) untuk mendapatkan permintaan browser. Jadi Anda mungkin akhirnya ingin melakukan sesuatu seperti ini:Di mana
yourprogram
harus melakukan hal-hal protokol seperti menangani GET, mengirim HTTP 200 dll.sumber
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
opsi bersama dengan yang-l
ada adalah kesalahan, situs web resmi netcat menggunakan kedua opsi dalam contohnya. Lihat: nc110.sourceforge.netnc
: Hobbit (asli), BSD / Mac OS X , dan GNU (yang tertua dari kelompok itu, dan tidak lagi dipertahankan). Ada juga Ncat Nmap . Saya mengemukakan ini karena saya pikir perlu dicatat bahwa-l
dan-p
bersama-sama hanya dianggap sebagai kesalahan dalam rasa BSD nc, maka sintaks alternatif diberikan oleh @matlehmannTidak tahu bagaimana atau mengapa tetapi saya berhasil menemukan ini di sekitar dan itu berhasil untuk saya, saya punya masalah saya ingin mengembalikan hasil mengeksekusi bash
CATATAN: Perintah ini diambil dari: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
ini menjalankan tes skrip bash dan mengembalikan hasilnya ke klien browser yang terhubung ke server yang menjalankan perintah ini pada port 8080
Skrip saya melakukan ATM ini
dan browser web saya ditampilkan
sungguh menakjubkan!
sumber
-k
bendera, bukan dengan menambahkanConnection: keep-alive
ke header permintaan.Tambahkan
-q 1
kenetcat
baris perintah:sumber
-q
1 tidak bekerja diCentOS
6.x apa yang harus digunakan untukCentOS
6.x mana mengatakan: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
berfungsi untuk saya di Ubuntu 18.04. Semoga membantu.Masalah yang Anda hadapi adalah bahwa nc tidak tahu kapan klien web selesai dengan permintaannya sehingga dapat menanggapi permintaan tersebut.
Sesi web seharusnya berjalan seperti ini.
Baris yang dimulai dengan "\ n" hanyalah baris kosong bahkan tanpa spasi dan tidak lebih dari karakter baris baru.
Saya memiliki httpd bash saya diluncurkan oleh xinetd, tutorial xinetd . Ini juga mencatat tanggal, waktu, alamat IP browser, dan seluruh permintaan browser ke file log, dan menghitung Panjang Konten untuk respons header Server.
Untuk menambahkan lebih banyak fungsionalitas, Anda dapat menggabungkan.
Selamat menampar!
sumber
Saya memiliki kebutuhan / masalah yang sama tetapi tidak ada yang berhasil untuk saya (atau saya tidak memahami semuanya), jadi inilah solusi saya.
Saya memposting minimal_http_server.sh saya (bekerja dengan / bin / bash saya (4.3.11) tetapi tidak / bin / sh karena pengalihan):
Dan a_script.sh saya (dengan kebutuhan Anda):
sumber
read
dantr
) dan minor ([
mengikuti elif). Saya tidak mereproduksi masalah Anda. Saya tidak mengerti mengapa minimal_http_server.sh akan menyebabkan interval 1 detik ini. Anda dapat menentukan apakah minimal_http_server.sh atau "a_script.sh" Anda yang salah dengan menjalankan beberapa kali (dengan kecepatan yang sama seperti permintaan curl Anda) ./a_script.sh setelah menyetel variabel lingkungan REQUEST.Cara lain untuk melakukan ini
Mari kita uji dengan 2 permintaan HTTP menggunakan curl
Dalam contoh ini, 172.16.2.6 adalah Alamat IP server.
Sisi server
Sisi klien
Jika Anda ingin menjalankan perintah lain, silakan ganti $ (date).
sumber
sumber
read line<pipe
akan menunggu sampainc
menulispipe
? Tetapi pada titik ini, menurut saya permintaan tersebut dilakukan sebelum tanggapan ditulis ..?Ini adalah keindahan dari webserver kecil , saya menemukannya online dan membuat salinan dan merapikannya sedikit - itu menggunakan
socat
ataunetcat
saya telah mengujinyasocat
- itu berdiri sendiri dalam satu skrip dan menghasilkan file konfigurasinya sendiri dan favicon.Secara default, ini akan dimulai sebagai browser file berkemampuan web namun mudah dikonfigurasi oleh file konfigurasi untuk logika apa pun. Untuk file itu mengalirkan gambar dan musik (mp3), video (mp4, avi, dll) - Saya telah menguji streaming berbagai jenis file ke perangkat Linux, Windows dan Android termasuk jam tangan pintar!
Saya pikir itu streaming lebih baik daripada VLC sebenarnya. Saya merasa ini berguna untuk mentransfer file ke klien jarak jauh yang tidak memiliki akses selain browser web misalnya jam tangan pintar Android tanpa perlu khawatir secara fisik menghubungkan ke port USB.
Jika Anda ingin mencobanya, cukup salin dan tempel ke file bernama bashttpd, lalu mulai di host dengan
$> bashttpd -s
Kemudian Anda dapat pergi ke komputer lain (anggap saja firewall tidak memblokir koneksi tcp masuk ke port 8080 - port default, Anda dapat mengubah port ke apa pun yang Anda inginkan menggunakan variabel global di bagian atas skrip).
http://bashttpd_server_ip:8080
sumber
main
fungsi yang bertuliskan[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, hack super pincang, tapi setidaknya curl dan firefox menerimanya:
Lebih baik Anda segera menggantinya dengan sesuatu yang layak!
Ah ya, saya
nc
tidak persis sama dengan milik Anda, tidak suka-p
pilihannya.sumber
Jika Anda menggunakan Apline Linux, netcat BusyBox sedikit berbeda:
sumber
Ketik nc -h dan lihat apakah Anda memiliki opsi -e . Jika ya, Anda dapat membuat skrip, misalnya:
script.sh
dan jalankan seperti ini:
Perhatikan bahwa opsi -e harus diaktifkan pada kompilasi agar tersedia.
sumber
Saya pikir masalah bahwa semua solusi yang tercantum tidak berfungsi, bersifat intrinsik dalam sifat layanan http, setiap permintaan yang dibuat adalah dengan klien yang berbeda dan respons perlu diproses dalam konteks yang berbeda, setiap permintaan harus membuat yang baru contoh respon ...
Solusi saat ini yang menurut saya adalah
-e
darinetcat
tetapi saya tidak tahu mengapa tidak berhasil ... mungkinnc
versi saya yang saya ujiopenwrt
...dengan
socat
itu berhasil ....Saya mencoba https://github.com/avleen/bashttpd ini
dan berhasil, tetapi saya harus menjalankan skrip shell dengan perintah ini.
The
socat
dannetcat
sampel pada github tidak bekerja untuk saya, tapisocat
yang saya gunakan bekerja.sumber
reuseaddr
bendera kamu membuat hariku! TERIMA KASIHSebenarnya, cara terbaik untuk menutup koneksi dengan baik adalah dengan mengirim
Content-Length
header seperti berikut. Klien (seperticurl
akan menutup koneksi setelah menerima data.sumber