【问题标题】:libssh + iPhone Implementation with multiple commands execution in sequencelibssh + iPhone 实现,多条命令依次执行
【发布时间】:2010-02-02 11:45:30
【问题描述】:

我的问题似乎很奇怪,我没有得到足够的帮助,但我回来了。 我还有一个奇怪的问题需要紧急解决。

我正在开发一个 iPhone 应用程序。它使用 libssh 2 在远程主机上通过 iPhone 执行命令。如果我单独执行它们,所有方法和命令都可以正常工作。

我的问题是, 考虑一系列命令,

密码

=> o/p 将是 /Users/mac01

cd xyz

=> 什么都不是 o/p

密码

=> o/p 将是 /Users/mac01/xyz

所以,我的问题是保存已执行的命令的最后状态......但我得到的 o/p 是 /Users/mac01 在第二个 pwd 命令执行后,这是错误的。

那么,谁能帮我解决这类问题..?提前致谢。 我正在使用 libssh 2.0 库。

执行命令的方法:

char* cmd_exec(const char *commandline, const char *host, const char *username, const char *password, int port){ int 袜子, rc, 字节数 = 0; char *cmd_contents;

if(!he)
{
    struct sockaddr_in sin;

ifdef WIN32

    WSADATA wsadata;
    WSAStartup(MAKEWORD(2,0), &wsadata);

endif

    /* Init and Make Socket Connection  */
    /*  Start Socket Connection         */
    sock = socket(AF_INET, SOCK_STREAM, 0);

ifndef WIN32

    fcntl(sock, F_SETFL, 0);

endif

    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    /*sin.sin_addr.s_addr = inet_addr(host);

     if (connect(sock, (struct sockaddr*)(&sin),
     sizeof(struct sockaddr_in)) != 0) {    // in case connection failure
     fprintf(stderr, "Internet connection is required!\n");
     return "NETWORKFAILURE";
     }*/
    //const char *c = getIPFromHost("pepsi");
    //sin.sin_addr.s_addr = inet_addr(c);

    /*      IP Address Calculation  */

    he = gethostbyname(host);

    if(!he)
        return "Invalid hostname";

    struct in_addr **addr_list;
    addr_list = (struct in_addr **)he->h_addr_list;
    //for(int i = 0; addr_list[i] != NULL; i++) {
    if(addr_list != NULL){
        sin.sin_addr.s_addr = inet_addr(inet_ntoa(*addr_list[0]));
        //printf("%s", inet_ntoa(*addr_list[0]));
        if (connect(sock, (struct sockaddr*)(&sin),
                    sizeof(struct sockaddr_in)) != 0) { // in case connection failure
            fprintf(stderr, "Internet connection is required!\n");
            return "NETWORKFAILURE";
        }
    }
}
/*  End Socket Connection           */

// Initialize and create Session Instance
if(!session)
{
    session = libssh2_session_init();
    if ( !session ) 
    { 
        fprintf( stderr, "Error initializing SSH session\n" ); 
        return "SESSIONFAILURE"; 
    }


    /* Since we have set non-blocking, tell libssh2 we are non-blocking */
    //libssh2_session_set_blocking(session, 0);

    // Session starting
    if (libssh2_session_startup(session, sock)) {
        fprintf(stderr, "Failure establishing SSH session\n");
        return "SESSIONFAILURE";
    }

    /* Authenticate via password */ 
    if(strlen(password) != 0){
        if ( libssh2_userauth_password( session, username, password ) ) 
        { 
            fprintf( stderr, "Unable to authenticate user [%s]" 
                    "(wrong password specified?)\n", username ); 
            return "AUTHENTICATIONFAILURE";
        } 
    }else{
        while ((rc = libssh2_userauth_publickey_fromfile(session, username,
                                                         "/home/user/"
                                                         ".ssh/id_rsa.pub",
                                                         "/home/user/"
                                                         ".ssh/id_rsa",
                                                         password)) ==
               LIBSSH2_ERROR_EAGAIN);
        if (rc) {
            fprintf(stderr, "\tAuthentication by public key failed\n");
            return "AUTHENTICATIONFAILURE";
        }
    }

    //libssh2_session_set_blocking(session, 1);

}

// Open a session channel for command execution
if(!channel)

{
    channel = libssh2_channel_open_session(session);
if (!channel) {
    fprintf(stderr, "Unable to open a session\n");
    return "SESSIONFAILURE";
}

// Execute a command through channel

while( (rc = libssh2_channel_shell(channel)) ==

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

if( rc != 0 )   // if command execution failed
{
    fprintf(stderr,"Error\n");
    return "CMDFAILURE";
}
}

//libssh2_channel_write(channel,commandline,strlen(commandline));
do {
    /* write the same data over and over, until error or completion */
    rc = libssh2_channel_write(channel, commandline, sizeof(commandline));
    if (rc < 0) {
        fprintf(stderr, "ERROR %d\n", rc);
    }
} while (rc == 0);


while (libssh2_channel_send_eof(channel) == LIBSSH2_ERROR_EAGAIN);

/* read channel output  */
/* Start channel read   */
for( ;; )
{
    /* loop until we block */
    int rc;
    do
    {
        char buffer[0x4000];
//      char *tcontents = (char*)malloc(sizeof(buffer) + sizeof(cmd_contents));
        rc = libssh2_channel_read( channel, buffer, sizeof(buffer) );
        if( rc > 0 )
        {
            int i;
            bytecount += rc;
            for( i=0; i < rc; ++i )
                fputc( buffer[i], stderr);
            if(cmd_contents){
                free(cmd_contents);
            }
            cmd_contents = (char*)malloc(sizeof(buffer) + sizeof(cmd_contents));
            strcpy(cmd_contents, buffer);
            fprintf(stderr, "\n");
        }
        else {
            //fprintf(stderr, "libssh2_channel_read returned %d\n", rc);
        }
    }

    while( rc > 0 );

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

/* End channel read */
 while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN );

/*      closing channel */
int exitcode = 127;

// while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN ); 如果(rc == 0) { 退出代码 = libssh2_channel_get_exit_status( 通道 ); } //
libssh2_channel_free(通道); // 释放内存 频道 = NULL;

/*
libssh2_session_disconnect( session, "" );      // closing session
libssh2_session_free( session );                // free up memory
close( sock );                                  // closing socket
*/

return cmd_contents;

}

【问题讨论】:

    标签: iphone cocoa-touch xcode libssl remote-client


    【解决方案1】:

    试试这个,也许它有效......我还没有尝试过,但你可以得到足够的想法,可能是正确的解决方案

    libssh2_session_set_blocking(session, 0);
    char buffer[0x4000]; rc = libssh2_channel_read( channel, buffer, sizeof(buffer) ); 
    for( i=0; i < rc; ++i ) 
       fputc( buffer[i], stderr);
      if(cmd_contents)
      {
    
        free(cmd_contents);     
     }
    
      buffer[i] = '\0';
      cmd_contents = (char*)malloc(sizeof(buffer) + sizeof(cmd_contents));
      strcpy(cmd_contents, buffer);
      if( rc == LIBSSH2_ERROR_EAGAIN ) 
      {
        waitsocket(sock, session); 
      }
    

    编码愉快...

    【讨论】:

      【解决方案2】:

      libssh2_session_set_blocking(session, 0);

      字符缓冲区[0x4000]; rc = libssh2_channel_read(通道,缓冲区,sizeof(缓冲区)); for(i=0;i

                  if(cmd_contents){
                      free(cmd_contents);
                  }
      
                  buffer[i] = '\0';
                  cmd_contents = (char*)malloc(sizeof(buffer) + sizeof(cmd_contents));
                  strcpy(cmd_contents, buffer);
      

      如果(rc == LIBSSH2_ERROR_EAGAIN) { 等待套接字(袜子,会话); }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 2017-07-11
        • 2014-08-29
        相关资源
        最近更新 更多