看来我的问题很奇怪,我没有得到足够的帮助,但我回来了。 我还有一个奇怪的问题需要在紧急情况下解决。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;
}
感谢猪头...它看起来像是在工作, 我已经测试了这个 和酷。 – 2010-02-26 06:27:33