使用netcat将简单的C程序转换为服务器

Pet*_*ter 5 c unix stdio netcat

的一个很酷的功能netcat是它如何将任何命令行程序转换为服务器。例如,在Unix系统上,我们可以通过将date二进制文件传递给来制作一个简单的日期服务器,netcat以便stdout通过套接字发送它:

netcat -l -p 2020 -e date
Run Code Online (Sandbox Code Playgroud)

然后,我们可以通过简单地发出以下命令从另一台机器上调用此服务:

netcat <ip-address> 2020
Run Code Online (Sandbox Code Playgroud)

/bin/sh尽管我知道这是极不推荐的做法,并且对安全性有很大影响,但即使是外壳也可以连接()。

同样,我尝试制作自己的简单C程序,该程序可以从stdin和读取和写入stdout

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我从另一个终端调用服务时,没有初始问候。实际上,问候语仅在发送一些信息后才打印。例如:

user@computer:~$ netcat localhost 2020
User
Please enter your name:
Hello there, User
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能使问候语首先通过套接字发送,然后等待输入,然后发送最终消息(就像我直接调用二进制文件一样)?

我知道可能会有更好(甚至更安全)的方法来实现这样的系统,但是我对的功能netcat以及为什么它不起作用感到好奇。

cni*_*tar 5

stdout写入非终端时很有可能没有行缓冲。做一个fflush(stdout)刚过printf