Estoy tratando de configurar un servidor web mínimo usando netcat (nc). Cuando el navegador llama a localhost: 1500, por ejemplo, debería mostrar el resultado de una función ( fecha en el ejemplo a continuación, pero eventualmente será un programa python o c que arrojará algunos datos). Mi pequeño servidor web netcat necesita ser un verdadero ciclo en bash, posiblemente tan simple como esto:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Cuando intento esto, el navegador muestra los datos disponibles actualmente durante el momento en que se inicia nc. Sin embargo, quiero que el navegador muestre los datos durante el momento en que lo solicite. ¿Cómo puedo conseguir esto?

Respuestas:
Prueba esto:
Las
-cmarcas NETCAT ejecutar la orden dada en una cáscara, lo que puede utilizar eco. Si no necesita eco, úselo-e. Para más información sobre esto, intenteman nc. Tenga en cuenta que cuando se usaechono hay forma de que su programa (eldatereemplazo) obtenga la solicitud del navegador. Entonces, probablemente finalmente quieras hacer algo como esto:¿Dónde
yourprogramdebe hacer las cosas del protocolo como manejar GET, enviar HTTP 200, etc.fuente
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l localhost 1500; doneIt is an error to use this option in conjunction with the -l option-popción junto con la-lotra es un error, el sitio web oficial de netcat usa ambas opciones en sus ejemplos. Ver: nc110.sourceforge.netnc: Hobbit (el original), BSD / Mac OS X y GNU (el más antiguo del grupo, y ya no se mantiene). También está el Ncat de Nmap . Menciono esto porque creo que vale la pena señalar que las banderas-ly-pjuntas solo se consideran un error en el sabor BSD de nc, de ahí la sintaxis alternativa dada por @matlehmannNo sé cómo ni por qué, pero me las arreglo para encontrar esto y funciona para mí, tuve el problema de que quería devolver el resultado de ejecutar un bash
NOTA: Este comando fue tomado de: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
esto ejecuta la prueba de script bash y devuelve el resultado a un cliente de navegador que se conecta al servidor que ejecuta este comando en el puerto 8080
Mi script hace este cajero automático
y mi navegador web muestra
¡simplemente asombroso!
fuente
-kbandera, no agregandoConnection: keep-aliveal encabezado de la solicitud.Agregar
-q 1a lanetcatlínea de comando:fuente
-q1 no está funcionando enCentOS6.x lo que se debe utilizar paraCentOS6.x donde dice: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 1funcionó para mí en Ubuntu 18.04. Espero que ayude.El problema que enfrenta es que nc no sabe cuándo el cliente web ha terminado con su solicitud, por lo que puede responder a la solicitud.
Una sesión web debería ser algo como esto.
Las líneas que comienzan con "\ n" son simplemente líneas vacías sin siquiera un espacio y contienen nada más que un nuevo carácter de línea.
Tengo mi bash httpd lanzado por xinetd, tutorial de xinetd . También registra la fecha, la hora, la dirección IP del navegador y toda la solicitud del navegador en un archivo de registro, y calcula la longitud del contenido para la respuesta del encabezado del servidor.
Para agregar más funcionalidad, puede incorporar.
Feliz golpeando
fuente
Tenía la misma necesidad / problema, pero aquí nada me funcionó (o no entendí todo), así que esta es mi solución.
Publico mi minimal_http_server.sh (trabajando con mi / bin / bash (4.3.11) pero no / bin / sh debido a la redirección):
Y mi a_script.sh (con tu necesidad):
fuente
readytr) y uno menor ([después de elif). No reproduzco tu problema. No veo por qué minimal_http_server.sh causaría estos intervalos de 1 segundo. Puede determinar si es minimal_http_server.sh o su "a_script.sh" que está defectuoso al ejecutar varias veces (a la misma velocidad que sus solicitudes de curl) ./a_script.sh después de configurar la variable de entorno REQUEST.Otra forma de hacer esto.
Probémoslo con 2 solicitudes HTTP usando curl
En este ejemplo, 172.16.2.6 es la dirección IP del servidor.
Lado del servidor
Lado del cliente
Si desea ejecutar otro comando, no dude en reemplazar $ (fecha).
fuente
fuente
read line<pipeesperará hastancque escribapipe? Pero en este punto, creo que la solicitud se realiza antes de que se escriba la respuesta ...?Aquí hay una belleza de un pequeño servidor web bash , lo encontré en línea y bifurqué una copia y la puse un poco, lo usa
socatonetcatlo probésocat, está autocontenido en un script y genera su propio archivo de configuración y favicon.Por defecto, se iniciará como un navegador de archivos habilitado para la web, pero el archivo de configuración lo configura fácilmente para cualquier lógica. Para archivos, transmite imágenes y música (mp3), video (mp4, avi, etc.). ¡He probado la transmisión de varios tipos de archivos a dispositivos Linux, Windows y Android, incluido un reloj inteligente!
Creo que se transmite mejor que VLC en realidad. Lo he encontrado útil para transferir archivos a clientes remotos que no tienen acceso más allá de un navegador web, por ejemplo, un reloj inteligente Android, sin tener que preocuparse por la conexión física a un puerto USB.
Si desea probarlo, simplemente cópielo y péguelo en un archivo llamado bashttpd, luego inícielo en el host con
$> bashttpd -sLuego puede ir a cualquier otra computadora (suponiendo que el firewall no esté bloqueando las conexiones TCP entrantes al puerto 8080, el puerto predeterminado, puede cambiar el puerto a lo que quiera usando las variables globales en la parte superior del script).
http://bashttpd_server_ip:8080fuente
mainfunción donde dice[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, un truco súper cojo, pero al menos curl y firefox lo aceptan:
¡Será mejor que lo reemplace pronto con algo apropiado!
Ah sí, mi
ncno era exactamente el mismo que el tuyo, no le gustaba la-popción.fuente
Si está utilizando Apline Linux, el netcat de BusyBox es ligeramente diferente:
fuente
Escriba nc -h y vea si tiene la opción -e disponible. En caso afirmativo, puede crear un script, por ejemplo:
script.sh
y ejecutarlo así:
Tenga en cuenta que la opción -e debe habilitarse en la compilación para estar disponible.
fuente
Creo que el problema de que toda la solución enumerada no funciona, es intrínseca en la naturaleza del servicio http, cada solicitud establecida es con un cliente diferente y la respuesta debe procesarse en un contexto diferente, cada solicitud debe bifurcar un nuevo instancia de respuesta ...
Creo que la solución actual es la
-edenetcatpero no sé por qué no funciona ... tal vez es mincversión la que prueboopenwrt...con
socateso funciona ....Intento esto https://github.com/avleen/bashttpd
y funciona, pero debo ejecutar el script de shell con este comando.
El
socatynetcatsamples en github no me funciona, pero elsocatque usé funciona.fuente
reuseaddrbandera me alegraste el dia! GRACIASEn realidad, la mejor manera de cerrar con gracia la conexión es enviar el
Content-Lengthencabezado de la siguiente manera. El cliente (comocurlcerrará la conexión después de recibir los datos).fuente