2014-03-04 6 views
4

netcat의 멋진 기능 중 하나는 명령 행 프로그램을 서버로 전환하는 방법입니다. 단순히를 실행하여netcat을 사용하여 간단한 C 프로그램을 서버로 변환

netcat -l -p 2020 -e date 

그런 다음 우리는 다른 컴퓨터에서이 서비스를 호출 할 수 있습니다 : 그것은 stdout는 소켓을 통해 전송되는 것 때문에 예를 들어, 유닉스 시스템에서 우리는 netcatdate 바이너리를 전달하여 간단한 날짜 서버를 만들 수 있습니다 명령 :이 매우 권장되지이고 큰 보안 문제를 가지고 알고 있지만

netcat <ip-address> 2020 

는 심지어 쉘 (/bin/sh)에 연결 할 수있다.

마찬가지로, 나는 모두 읽고 stdinstdout에서 쓰는 내 자신의 간단한 C 프로그램을 만들려고 : 내가 다른 터미널에서 서비스를 호출 할 때

그러나
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) 
{ 
    char buffer[20]; 
    printf("Please enter your name:\n"); 
    fgets(buffer, 20, stdin); 
    printf("Hello there, %s\n", buffer); 
    return 0; 
} 

가, 더 초기 인사가 없다을; 실제로 인사말은 일부 정보를 보낸 후에 만 ​​인쇄됩니다. 예를 들어 :

는 그때, 그래서 내 인사는 처음에 소켓을 통해 전송됩니다 그렇게 입력을 기다릴 필요가 무엇
[email protected]puter:~$ netcat localhost 2020 
User 
Please enter your name: 
Hello there, User 

후 (I 바이너리 직접 호출하고처럼) 최종 메시지를 보내?

이러한 시스템을 구현하는 데 더 나은 (그리고 더 안전 할 수있는) 접근법이있을 수 있지만 netcat의 기능에 대해 궁금합니다. 왜 이것이 작동하지 않는지 궁금합니다.

답변

3

비 터미널에 쓸 때 stdout은 라인 버퍼링되지 않습니다. printf 바로 뒤에 fflush(stdout)을 입력하십시오.

+0

굉장! 고맙습니다! – Peter

+1

버퍼링하지 않는 dprintf()를 사용할 수도 있습니다. – Jean

+0

@Phibonacci 파일 설명자가 있다면 별의 제안. – cnicutar