我想实现像Mac的终端应用程序,但适用于iOS。我设置了libssh2,一切正常。
我运行“ cd Test ”命令,其中Test是工作目录中的文件夹。然后如果我运行:“ pwd ”,它会告诉我cd命令没有改变目录。
但是,如果我运行:“ cd Test; pwd ”,则会显示它已更改目录。
我明白为什么会这样,最好在这里解释一下: ssh2_exec() wont change directory :(
我的问题:这是什么解决方案?我希望能够在终端中运行它,就像在一个大shell中一样,在每个命令之后都不会死。这可能吗?每次更改目录时都会杀死用户,然后执行您想要的操作。为什么如果目录更改一次,在新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 :(得分:0)
可能唯一的解决方案是模拟目录的更改 - 我的意思是更改内部存储的路径,指示当前目录树中的位置,并在执行对服务器的任何其他请求时使用它。希望这有帮助!