将服务器的输出重定向到客户端套接字

Rag*_*ddy 3 c sockets linux gcc

我正在通过套接字编程并很好地实现它..现在我想在其中实现一个系统调用ls..

当在客户端机器ls上给出输入时,服务器的输出应该打印在客户端机器上(即命令应该在服务器端执行,输出应该重定向到客户端...)

我如何收集服务器机器的输出?

我只需要提示..谢谢

jwe*_*ich 7

您可以使用dup2stdout(或任何其他现有的fd)重定向到套接字fd.例:

int client_fd = accept(server_fd, 0, 0);
assert(client_fd != -1);
close(0); // Close stdout
dup2(client_fd, 0); // Redirect stdout to client_fd
Run Code Online (Sandbox Code Playgroud)

这应该做的伎俩:-)

编辑1下面的示例显示连接到127.0.0.1:1234的客户端程序,生成一个shell进程,并重定向IO,以便shell自动处理所有通信.您可以通过在另一个终端中运行netcat -l 1234来测试它,然后运行该程序并ls从netcat 发送命令.将其调整为在服务器端工作仍然是运动.

重要信息:此程序提供对机器外壳的未经身份验证的访问.

#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int exec_shell(int sock_fd) {
    // Redirect IO
    dup2(sock_fd, 0);
    dup2(sock_fd, 1);
    dup2(sock_fd, 2);

    // Execute shell
    execl("/bin/sh", "sh", NULL);

    return 0;
}

int main() {
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in sa_dst;
    memset(&sa_dst, 0, sizeof(struct sockaddr_in));
    sa_dst.sin_family = AF_INET;
    sa_dst.sin_port = htons(1234);
    sa_dst.sin_addr.s_addr = inet_addr("127.0.0.1");

    int ret = connect(fd, (struct sockaddr *)&sa_dst, sizeof(struct sockaddr));
    assert(ret != -1);
    exec_shell(fd);
    close(fd);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)