Telnet处理wc和从键盘读取输入的任何命令
我是UNIX新手,也不熟悉使用C语言编程 我想做的是telnet的简单实现 我在服务器和客户端上建立了所有必需的连接 在服务器上:我收到的任何请求,都会派生一个新进程来处理它Telnet处理wc和从键盘读取输入的任何命令,c,unix,telnet,systems-programming,unix-socket,C,Unix,Telnet,Systems Programming,Unix Socket,我是UNIX新手,也不熟悉使用C语言编程 我想做的是telnet的简单实现 我在服务器和客户端上建立了所有必需的连接 在服务器上:我收到的任何请求,都会派生一个新进程来处理它 void createProcess() { int pid = fork(); if( pid == CHILD ) { transferHandling(s); close(s); _exit(0); } } 此方法用于处理来自客户端的命令: i
void createProcess() {
int pid = fork();
if( pid == CHILD ) {
transferHandling(s);
close(s);
_exit(0);
}
}
此方法用于处理来自客户端的命令:
int transferHandling(int socket) {
char buf[20];
char command[1024];
int n, pid, fd[2];
char *shell, *ps1;
if( checkLogin(socket) == 0 ) { // Used to check user account
send(socket, "Login Succeeded\n", 16, 0);
if( setupENV(info->name) == 0 ) { // setuid and setgid for the user
if( pipe(fd) == ERROR ) {
send(socket, "Server Busy\n", 12, 0);
return 1;
}
// Here I make a process to run the default shell for the user
// and make pipe between them
if((pid = fork()) > 0) {
dup2(fd[0], STDOUT_FILENO);
close(fd[1]);
//read commands from socket
while(1) {
n = recv(socket, command, 1024, 0);
// send the commands received to the child which contains the default shell
write(fd[0], command, n);
}
} else {
dup2(fd[1], STDIN_FILENO);
dup2(socket, STDOUT_FILENO);
dup2(socket, STDERR_FILENO);
close(fd[0]);
//run default shell
shell = getpwnam(info->name)->pw_shell;
execlp(shell, shell, NULL);
}
} else {
return 1; // setup ENV error
}
} else {
send(socket, "Login Failed\n", 13, 0);
}
}
该程序使用任何命令都能成功运行,但当客户端编写任何命令(如:wc、cd、bash)以运行任何其他shell时。程序被挂起
这是连接设置后的客户端
if(login(soc)) { // send the user information for the server
char cmd[2024], cc[1024];
int n;
while(1) {
printf("Reading\n");
write(1, "username@hostname> ", 19);
n = read(0, cmd, 2024); // read the command from the STDIN, and send it to server
send(soc, cmd, n, 0);
printf("Receiving Now\n");
n = recv(soc, cmd, 2024, 0); // getting back the command output
write(1, cmd, n);
}
}
您的管道文件描述符搞错了。你应该:
write(fd[1], ...);
以及:
顺便说一句,中间进程不需要从套接字读取命令并通过管道将它们发送到shell。您可以直接从套接字重定向shell的输入。此外,如果直接写入管道,则不需要dup2。最后,执行此操作的无限循环似乎是一个非常糟糕的主意,因为它会在shell死亡时旋转。您的意思是,我应该移除fork并使dup2socket、STDIN_FILENO和输出相同,然后为userYes执行默认shell吗。在createProcess中调用fork一次,就这样了;dup2socket,标准输出文件号;dup2socket,标准文件号;//closefd[0];//运行默认shell shell=getpwnaminfo->name->pw_shell;execlpshell,shell,NULL;重定向应该是正常的。您确定这不是登录过程吗?尝试注释它,并使用nc作为客户端。此外,当stdin被重定向时,shell不应该提示输入命令,但仍然可以工作。
dup2(fd[0], STDIN_FILENO);