2011-04-04 102 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(僞終端)與其通信。