我一直在尝试用C在Unix中创建一个远程shell。我能够连接到服务器并从中拉出命令。但是我无法改变我的pwd,即使看起来运行正常。我给它一个目录,如果该目录不存在,我将收到一个错误。下面是我一直在测试的快速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 );
}
答案 0 :(得分:2)
cd
不是程序,它是一个shell内置命令,它更改shell的cwd,而不是生成该shell的程序。您正在为每个命令生成一个新的shell,因此更改后的cwd不会持久存在。
您可以尝试捕获cd
的调用并自己运行chdir()
,或者生成单个交互式shell并使用管道或pty(伪终端)与之通信。
答案 1 :(得分:1)
exec
使用cd
命令不会更改调用exec
的程序的工作目录。它会激活一个更改自己的工作目录的进程,然后退出。
您必须通过调用cd
系统调用而不是chdir
来专门处理exec
命令。