2010-02-02 78 views
1

看来我的问题很奇怪,我没有得到足够的帮助,但我回来了。 我还有一个奇怪的问题需要在紧急情况下解决。libssh + iPhone按顺序执行多个命令执行

我正在开发一个iPhone应用程序。它使用libssh 2来通过iPhone通过远程主机执行命令。没关系,如果我单独执行它们,就可以使用所有的方法和命令。

我的问题是, 考虑的命令序列,

PWD

=> O/P将是/用户/ mac01

CD XYZ

=>什么都没有o/p

PWD

=> O/P为/用户/ mac01/XYZ

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

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

的方法执行命令:

字符* cmd_exec(常量字符*命令行,为const char *主机,常量字符*用户名,为const char *密码,INT端口){ INT袜子,RC,BYTECOUNT = 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); if(rc == 0) {code} exitcode = libssh2_channel_get_exit_status(channel); } //
libssh2_channel_free(channel); //释放内存 channel = NULL;

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

return cmd_contents; 

}

回答

0

libssh2_session_set_blocking(会话,0);

char buffer [0x4000]; rc = libssh2_channel_read(channel,buffer,sizeof(buffer));对于(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); 

如果(RC == LIBSSH2_ERROR_EAGAIN) { waitsocket(袜子,会议); }

3

试试这个,也许它的工作...我还没有尝试过,但你可以得到足够的想法,并且可以妥善解决

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); 
    } 

编码快乐......

+3

感谢猪头...它看起来像是在工作, 我已经测试了这个 和酷。 – 2010-02-26 06:27:33