2011-04-04 81 views
1

我一直在努力创建一个用于Unix的C远程shell。我能够连接到服务器并将命令关闭。然而,我无法改变我的密码,即使似乎正常运行。我给它一个目录,如果该目录不存在,我会收到一个错误。下面是我测试过的快速外壳。无法更改远程shell的目录

while(1) 
{ 

    for(n = 0; n < BUFFER_SIZE; n++) 
{ 
    command[n] = '\0'; 
} 

    write(sockfd, buffer, strlen(buffer)); 

    read(sockfd, command, BUFFER_SIZE); 

    fprintf(stderr, "Command: %s\n", command); 

    dup2(sockfd, 2); 
    dup2(sockfd, 1); 
    dup2(sockfd, 0); 

    execlp("/bin/sh", "sh", "-c", command, (char *)NULL); 

}

回答

1

exec'ing a cd command not only change the directory directory of program that called exec。它分叉了一个过程,它自己的工作目录更改,然后退出。

您必须通过调用chdir系统调用来专门处理cd命令,而不是exec

2

cd不是一个程序,它是一个壳内建命令,这改变了CWD用于壳,而不适用于衍生该外壳程序。你为每个命令产生一个新的shell,所以改变后的cwd不会持续。

您可以尝试捕获cd的调用并自己运行chdir(),或产生单个交互式shell并使用管道或pty(伪终端)与其通信。