Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“更改目录”;cd";iOS应用程序上的libssh2_Ios_Xcode_Shell_Cd_Libssh2 - Fatal编程技术网

“更改目录”;cd";iOS应用程序上的libssh2

“更改目录”;cd";iOS应用程序上的libssh2,ios,xcode,shell,cd,libssh2,Ios,Xcode,Shell,Cd,Libssh2,我想实现类似Mac终端应用程序的东西,但要针对iOS。我设置了libssh2,一切正常 我运行“cd Test”命令,其中Test是工作目录中的一个文件夹。然后,若我运行:“pwd”,它将显示cd命令并没有更改目录 但是,如果我运行:“cd Test;pwd”,它将显示它更改了目录 我理解为什么会发生这种情况,这里最好解释一下: 我的问题:有什么解决办法?我希望能够像在终端中一样运行它,就像在一个大的外壳中一样,在每个命令之后都不会死掉。这可能吗?每次更改目录,然后做你想做的事,都会杀死用户。

我想实现类似Mac终端应用程序的东西,但要针对iOS。我设置了libssh2,一切正常

我运行“cd Test”命令,其中Test是工作目录中的一个文件夹。然后,若我运行:“pwd”,它将显示cd命令并没有更改目录

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

我理解为什么会发生这种情况,这里最好解释一下:

我的问题:有什么解决办法?我希望能够像在终端中一样运行它,就像在一个大的外壳中一样,在每个命令之后都不会死掉。这可能吗?每次更改目录,然后做你想做的事,都会杀死用户。为什么如果目录更改一次,在新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];}
-(NSString*)execCommand:(char*)命令行{
//干净的数据;
[self.data setLength:0];
NSString*结果;
int rc=0;
int字节数=0;
/*删除主机上的Exec非阻塞*/
while((channel=libssh2\u channel\u open\u session(session))==NULL和&libssh2\u session\u last\u错误(session,NULL,NULL,0)==libssh2\u error\u EAGAIN)
{
waitsocket(sock,session);
}
如果(通道==NULL)
{
fprintf(stderr,“Error\n”);
返回@“错误”;
}
while((rc=libssh2\u channel\u exec(channel,commandline))==libssh2\u ERROR\u EAGAIN)
{
waitsocket(sock,session);
}
如果(rc!=0)
{
fprintf(stderr,“Error\n”);
返回@“错误”;
}
对于(;;)
{
/*循环直到我们阻塞*/
int rc1;
做
{
字符缓冲区[0x4000];
rc1=libssh2_channel_read(通道、缓冲区、sizeof(缓冲区));
如果(rc1>0)
{
NSData*tmpData=[NSData dataWithBytes:缓冲区长度:rc1];
[self.data appendData:tmpData];
int i;
字节数+=rc1;
fprintf(stderr,“我们读:\n”);
对于(i=0;i0);
/*这是由于阻塞,否则会发生阻塞,所以我们继续循环
这种情况*/
如果(rc1==LIBSSH2\u错误\u EAGAIN)
{
waitsocket(sock,session);
}
其他的
打破
}
int exitcode=127;
而((rc=libssh2\u通道\u关闭(通道))==libssh2\u错误\u EAGAIN)
waitsocket(sock,session);
如果(rc==0)
{
exitcode=libssh2\u通道\u获取\u退出\u状态(通道);
}
printf(“\nEXIT:%d字节数:%d\n”,exitcode,字节数);
libssh2_信道自由(信道);
通道=空;
结果=[[NSString alloc]initWithData:self.data编码:NSUTF8StringEncoding];
[self.data setLength:0];
返回[结果自动释放];}

唯一的解决方案可能是模拟目录的更改—我的意思是更改内部存储的路径,该路径指示您当前在目录树中的位置,并在执行对服务器的任何其他请求时使用该路径。希望这有帮助

如果您正在为这个项目使用一种编程语言,那么如果您为该编程语言添加一个标记,您将得到更好的答案。祝你好运。谢谢你的提示。你正在使用
执行命令:
?它看起来每次都会在远程主机上执行一个新的shell,这就是为什么
cd
不能像您期望的那样工作。我认为您需要深入了解libssh2,以获得您想要的功能。你需要启动一个shell并保持运行。我发现我必须在每次命令后更改通道。尝试将其用于更多命令,但不起作用。我在libssh2文档和示例中没有看到任何其他选项。也许有人这样做了,可以分享他的智慧;)