0

Mac のターミナル アプリのようなものを iOS 用に実装したいと考えています。libssh2 をセットアップしました。すべてが機能しています。

「 cd Test」コマンドを実行します。Test は作業ディレクトリ内のフォルダーです。次に「pwd」を実行すると、cd コマンドがディレクトリを変更しなかったことが示されます。

ただし、「cd Test; pwd」を実行すると、ディレクトリが変更されたことが示されます。

なぜこれが起こっているのか理解しています。ここで最もよく説明されています: ssh2_exec()はディレクトリを変更しません:(

私の質問:これに対する解決策は何ですか? 各コマンドの後に死ぬことのない大きなシェルのように、ターミナルのようにこれを実行できるようにしたいです。これは可能ですか?ディレクトリを変更するたびにユーザーを殺してから、必要なことを行います。ディレクトリが一度変更された場合、新しい 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];}
4

1 に答える 1

0

おそらくこれに対する唯一の解決策は、ディレクトリの変更をエミュレートすることです。これは、ディレクトリツリーの現在の場所を示す内部的に保存されたパスを変更し、サーバーへの他の要求を実行しているときにそれを使用することを意味します。お役に立てれば!

于 2013-10-17T14:04:04.587 に答える