2012-02-08 119 views
0

我想实现类似Mac的终端应用程序,但是适用于iOS。我建立了libssh2,一切正常。在iOS应用上使用libssh2更改目录“cd”

我运行“cd Test”命令,其中Test是工作目录中的文件夹。然后如果我运行:“pwd”,它会告诉我,cd命令没有改变目录。

但是,如果我运行:“cd Test; pwd”,它将显示它已更改目录。

我明白为什么会出现这种情况,最好在这里解释: ssh2_exec() wont change directory :(

我的问题:什么是这种情况的解决方案?我希望能够在终端中运行,就像在一个大外壳中一样,在每个命令后都不会死亡。这可能吗?每次改变目录都会导致用户死亡,然后做你想做的事情。为什么如果目录改变一次,在新的cd出现之前不会保持改变?我怎样才能做到这一点?

谢谢大家。

编辑:

这里是我的方法:

- (NSString*) execCommand: (char *)commandline { 

// Clean data; 
[self.data setLength:0]; 

NSString *result; 

int rc = 0; 
int bytecount = 0; 

/* Exec non-blocking on the remove host */ 
while((channel = libssh2_channel_open_session(session)) == NULL && libssh2_session_last_error(session,NULL,NULL,0) == LIBSSH2_ERROR_EAGAIN) 
{ 
    waitsocket(sock, session); 
} 

if(channel == NULL) 
{ 
    fprintf(stderr,"Error\n"); 
    return @"Error"; 
} 

while((rc = libssh2_channel_exec(channel, commandline)) == LIBSSH2_ERROR_EAGAIN) 
{ 
    waitsocket(sock, session); 
} 

if(rc != 0) 
{ 
    fprintf(stderr,"Error\n"); 
    return @"Error"; 
} 

for(;;) 
{ 
    /* loop until we block */ 
    int rc1; 
    do 
    { 
     char buffer[0x4000]; 
     rc1 = libssh2_channel_read(channel, buffer, sizeof(buffer)); 
     if(rc1 > 0) 
     { 
      NSData * tmpData = [NSData dataWithBytes:buffer length:rc1]; 
      [self.data appendData:tmpData]; 

      int i; 
      bytecount += rc1; 
      fprintf(stderr, "We read:\n"); 
      for(i=0; i < rc1; ++i) 
       fputc(buffer[i], stderr); 
      fprintf(stderr, "\n"); 
     } 
     else { 
      fprintf(stderr, "libssh2_channel_read returned %d\n", rc1); 
     } 
    } 
    while(rc1 > 0); 

    /* this is due to blocking that would occur otherwise so we loop on 
    this condition */ 
    if(rc1 == LIBSSH2_ERROR_EAGAIN) 
    { 
     waitsocket(sock, session); 
    } 
    else 
     break; 
} 

int exitcode = 127; 
while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) 
    waitsocket(sock, session); 

if(rc == 0) 
{ 
    exitcode = libssh2_channel_get_exit_status(channel); 
} 
printf("\nEXIT: %d bytecount: %d\n", exitcode, bytecount); 

libssh2_channel_free(channel); 
channel = NULL; 

result = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]; 
[self.data setLength:0]; 

return [result autorelease];} 
+0

如果您在此项目中使用编程语言,如果您为编程语言添加标记,则会得到更好的答案。祝你好运。 – shellter 2012-02-08 17:27:42

+0

感谢提示,住房。 – 2012-02-08 17:57:02

+0

你使用'executeCommand:'吗?它看起来会每次在远程主机上执行一个新的shell,这就是为什么'cd'不会像你期望的那样工作。我认为你需要深入研究libssh2以获得你想要的功能。你需要启动一个shell并保持运行。 – 2012-02-08 18:37:22

回答

0

可能就是这个唯一的办法就是仿效目录的变化 - 其目的仅仅是改变内部存储的路径它指明了在您目前所在的目录树,并在执行任何其他请求到服务器时使用它。希望这可以帮助!