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
-c
marcas 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 usaecho
no hay forma de que su programa (eldate
reemplazo) obtenga la solicitud del navegador. Entonces, probablemente finalmente quieras hacer algo como esto:¿Dónde
yourprogram
debe 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; done
It is an error to use this option in conjunction with the -l option
-p
opción junto con la-l
otra 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-l
y-p
juntas 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
-k
bandera, no agregandoConnection: keep-alive
al encabezado de la solicitud.Agregar
-q 1
a lanetcat
línea de comando:fuente
-q
1 no está funcionando enCentOS
6.x lo que se debe utilizar paraCentOS
6.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 1
funcionó 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
read
ytr
) 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<pipe
esperará hastanc
que 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
socat
onetcat
lo 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 -s
Luego 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:8080
fuente
main
funció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
nc
no era exactamente el mismo que el tuyo, no le gustaba la-p
opció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
-e
denetcat
pero no sé por qué no funciona ... tal vez es minc
versión la que prueboopenwrt
...con
socat
eso funciona ....Intento esto https://github.com/avleen/bashttpd
y funciona, pero debo ejecutar el script de shell con este comando.
El
socat
ynetcat
samples en github no me funciona, pero elsocat
que usé funciona.fuente
reuseaddr
bandera me alegraste el dia! GRACIASEn realidad, la mejor manera de cerrar con gracia la conexión es enviar el
Content-Length
encabezado de la siguiente manera. El cliente (comocurl
cerrará la conexión después de recibir los datos).fuente