netcat

2016-10-17 10 views
7

का उपयोग करते समय अनुरोध के आधार पर सशर्त रूप से प्रतिक्रिया कैसे दें मैं केवल विंडोज बैच स्क्रिप्टिंग का उपयोग कर एक वेब सर्वर स्थापित करने की कोशिश कर रहा हूं।netcat

मेरे पास पहले से ही निम्न स्क्रिप्ट के साथ आते हैं:

@echo off 
@setlocal enabledelayedexpansion 

for /l %%a in (1,0,2) do (
    type tempfile.txt | nc -w 1 -l -p 80 | findstr mystring 
    if !ERRORLEVEL! == 0 (
    echo found > tempfile.txt 
) else (
    echo not-found > tempfile.txt 
) 
) 

हालांकि, प्रतिक्रिया हमेशा एक अनुरोध के पीछे है, मेरा मतलब है, अगर मैं ब्राउज़र में कुछ इस तरह टाइप करें:

REQUEST: localhost/mystring 

RESPONSE: not-found 

केवल अगले अनुरोध में मैं corr प्राप्त होगा:

मैं निम्नलिखित प्रतिसाद मिलेगा उपरोक्त अनुरोध के लिए ect उत्तर।

ऐसा इसलिए हो रहा है क्योंकि जैसे ही नेटकैट अनुरोध प्राप्त करता है, यह tempfile.txt की वर्तमान सामग्री के साथ प्रतिक्रिया देता है जिसे अभी तक अनुरोध के आधार पर अपडेट नहीं किया गया है।

क्या tempfile.txt अद्यतन होने तक प्रतिक्रिया को अवरुद्ध करने का कोई तरीका है या कोई अन्य तरीका जो अपेक्षित परिणाम पूरा करता है?

+1

आप 'tempfile की सामग्री को अधिलेखित कर रहे हैं

exec.bat (कुछ छद्म कोड) की तरह कुछ हो सकता है .txt' या तो "पाया" या "नहीं मिला" स्ट्रिंग के साथ; आपका कोड बिल्कुल काम नहीं करना चाहिए। – SomethingDark

+0

@ SomethingDark मुझे विश्वास है कि जानबूझकर था। वे लॉग होने का इरादा नहीं रखते हैं। वे HTTP सामग्री रखने के लिए हैं। क्या ओपी पूछ रहा है कि ब्राउजर के अनुरोध हेडर सामग्री के आधार पर 'एनसी' टीसीपी आउटपुट सशर्त बनाने के लिए कैसे है। – rojo

+0

@rojo - वह एक फाइल को ओवरराइट कर रहा है कि वह नेटकैट पर पाइप कर रहा है। नेटकैट उल्टी त्रुटियों को बाएं और दाएं होना चाहिए। – SomethingDark

उत्तर

3

समस्या है, जहां तक ​​मैं कह सकता हूं, nc क्लाइंट इनपुट के आधार पर इसके आउटपुट को दर्ज़ करने के लिए कॉलबैक नहीं कर सकता है। एक बार जब आप है ...

stdout generation | nc -l 

... अवरुद्ध है और एक कनेक्शन के लिए प्रतीक्षारत, इसके उत्पादन पहले से ही निर्धारित होता है। उस बिंदु पर उस आउटपुट स्थिर है।

मेरे लिए एकमात्र कामकाज अपेक्षाकृत अक्षम है।

  1. ग्राहक एक रीलोड
  2. परिमार्जन पिछले अनुरोध के हेडर से प्राप्त पते के प्रदर्शन करने के लिए तैयार की गई एक कनेक्शन के लिए सुनो: यह मूल रूप से निम्नलिखित तर्क शामिल है।
  3. ग्राहक के दूसरे कनेक्शन पर प्रासंगिक सामग्री की सेवा

उदाहरण कोड:

@echo off & setlocal 

rem // macro for netcat command line and args 
set "nc=\cygwin64\bin\nc.exe -w 1 -l 80" 

rem // macro for sending refresh header 
set "refresh=^(echo HTTP/1.1 200 OK^&echo Refresh:0;^)^| %nc%" 

for /L %%# in (1,0,2) do (
    rem // run refresh macro and capture client's requested URL 
    for /f "tokens=2" %%I in ('%refresh% ^| findstr "^GET"') do set "URL=%%I" 

    rem // serve content to the client 
    setlocal enabledelayedexpansion 
    echo URL: !URL! | %nc% 
    endlocal 
) 

एक तरफ ध्यान दें के रूप में, देरी विस्तार विस्मयादिबोधक चिह्न के साथ सेट चर मान पंगु बना सकते हैं अगर यह समय में सक्षम है सेटिंग का पुनर्प्राप्ति तक देरी विस्तार को सक्षम करने के लिए प्रतीक्षा करने के लिए सर्वश्रेष्ठ।

इसके अलावा, %ERRORLEVEL% पर बूलियन चेक करने पर यह conditional execution पर नियोजित करने के लिए अधिक सुंदर है। लेकिन इसका मेरे समाधान से कोई लेना देना नहीं है। :)

और अंत में, बजाय type filename.html | nc -l करने का, <filename.html nc -l (या nc -l <filename.html) का उपयोग कर type की बेकार उपयोग से बचने के लिए पर विचार करें।

+0

मुश्किल समाधान, लेकिन अनुरोध किया गया था, ty;) – utxeee

5

चेकआउट -e विकल्प, आप एक स्क्रिप्ट है कि संसाधन करता है लिख सकता है और उसके बाद

nc -L -w1 -p 80 -eexec.bat 

जो पाइप stdin और stdout आगे पीछे nc से स्क्रिप्ट की तरह आप चाहेंगे निष्पादित।

findstr mystring 
if not errorlevel 1 (echo found) else (echo not-found) 

या शायद एक पाश (भी कुछ हद तक छद्म कोड):

:top 
set /p input= 
if input wasn't "" echo %input% >> output.dat && goto top 
findstr /C:"mystring" output.dat 
if not errorlevel 1 (echo found) else (echo not-found) 
+0

क्या आप अवधारणा के प्रमाण के रूप में कोई कामकाजी कोड प्रदान कर सकते हैं? यदि हां, तो क्या आपने नेटकैट का निर्माण किया था, जिसका उपयोग आपने किया था कि आपका कोड काम करता है? मैंने प्रत्येक क्रमपरिवर्तन की कोशिश की है जिसे मैं Win32/64 के लिए नेटकैट 1.12 (https://eternallybored.org/misc/netcat/) का उपयोग करने के बारे में सोच सकता हूं, और न तो x86 और न ही x64 बिल्ड मुझे '-e मिल सकता है 'बैच स्क्रिप्ट चलाने के लिए स्विच करें और क्लाइंट को अपना आउटपुट भेजें। फायरबग हमेशा जीईटी अनुरोध स्थिति को "निरस्त" के रूप में दिखाता है। – rojo

+0

हाँ मैं लिनक्स टॉप पर हूं लेकिन साढ़े चार घंटों में आप पर वापस आऊंगा। – nephi12

+0

हेक्टेयर ढाई साल बनाते हैं। अभी कर रहा हूँ। – nephi12

संबंधित मुद्दे