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];}
如果您在此项目中使用编程语言,如果您为编程语言添加标记,则会得到更好的答案。祝你好运。 – shellter 2012-02-08 17:27:42
感谢提示,住房。 – 2012-02-08 17:57:02
你使用'executeCommand:'吗?它看起来会每次在远程主机上执行一个新的shell,这就是为什么'cd'不会像你期望的那样工作。我认为你需要深入研究libssh2以获得你想要的功能。你需要启动一个shell并保持运行。 – 2012-02-08 18:37:22