基于libssh库实现SSH的Linux客户端程序

来源:互联网 发布:php 抓取 天猫 商品 编辑:程序博客网 时间:2024/05/30 04:13

代码如下:

#include <string.h>  #include <sys/ioctl.h>  #include <netinet/in.h>  #include <arpa/inet.h>  #include <unistd.h>  #include <sys/types.h>  #include <libgen.h>  #include <fcntl.h>  #include <errno.h>  #include <stdio.h>  #include <ctype.h>  #include <stdlib.h>  #include <termios.h>     #include <libssh2.h>    #define COPYRIGHT "SSH2 v1.0\nCopyright (C) 2014 \n\n"     struct termios _saved_tio;  int tio_saved = 0;     static int _raw_mode(void)  {      int rc;      struct termios tio;        rc = tcgetattr(fileno(stdin), &tio);      if (rc != -1) {          _saved_tio = tio;          tio_saved = 1;          cfmakeraw(&tio);          rc = tcsetattr(fileno(stdin), TCSADRAIN, &tio);      }        return rc;  }     static int _normal_mode(void)  {      if (tio_saved)          return tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio);        return 0;  }     int main (int argc, char *argv[])  {      int sock = 0;      unsigned long hostaddr = 0;      short port = 22;      char *username = NULL;      char *password = NULL;      struct sockaddr_in sin;      LIBSSH2_SESSION *session;      LIBSSH2_CHANNEL *channel;      int nfds = 1;      char buf;      LIBSSH2_POLLFD *fds = NULL;         /* Struct winsize for term size */       struct winsize w_size;      struct winsize w_size_bck;        /* For select on stdin */       fd_set set;      struct timeval timeval_out;      timeval_out.tv_sec = 0;      timeval_out.tv_usec = 10;        printf(COPYRIGHT);        if (argc > 4) {          hostaddr = inet_addr(argv[1]);          port = htons(atoi(argv[2]));          username = argv[3];          password = argv[4];      }      else {          fprintf(stderr, "Usage: %s ip port user password\n", basename(argv[0]));          return -1;      }        if (libssh2_init (0) != 0) {          fprintf (stderr, "libssh2 initialization failed\n");          return -1;      }        sock = socket (AF_INET, SOCK_STREAM, 0);      sin.sin_family = AF_INET;      sin.sin_port = port;      sin.sin_addr.s_addr = hostaddr;      if (connect(sock, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)) != 0) {          fprintf (stderr, "Failed to established connection!\n");          return -1;      }        /* Open a session */       session = libssh2_session_init();      if (libssh2_session_startup (session, sock) != 0) {          fprintf(stderr, "Failed Start the SSH session\n");          return -1;      }            /* Authenticate via password */       if (libssh2_userauth_password(session, username, password) != 0) {          fprintf(stderr, "Failed to authenticate\n");          close(sock);          goto ERROR;      }            /* Open a channel */       channel = libssh2_channel_open_session(session);            if ( channel == NULL ) {          fprintf(stderr, "Failed to open a new channel\n");          close(sock);          goto ERROR;      }            /* Request a PTY */       if (libssh2_channel_request_pty( channel, "xterm") != 0) {          fprintf(stderr, "Failed to request a pty\n");          close(sock);          goto ERROR;      }            /* Request a shell */       if (libssh2_channel_shell(channel) != 0) {          fprintf(stderr, "Failed to open a shell\n");          close(sock);          goto ERROR;      }            if (_raw_mode() != 0) {          fprintf(stderr, "Failed to entered in raw mode\n");          close(sock);          goto ERROR;      }            while (1) {          FD_ZERO(&set);          FD_SET(fileno(stdin),&set);                ioctl(fileno(stdin), TIOCGWINSZ, &w_size);          if ((w_size.ws_row != w_size_bck.ws_row) ||              (w_size.ws_col != w_size_bck.ws_col)) {              w_size_bck = w_size;              libssh2_channel_request_pty_size(channel, w_size.ws_col, w_size.ws_row);          }                if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL)              break;                fds[0].type = LIBSSH2_POLLFD_CHANNEL;          fds[0].fd.channel = channel;          fds[0].events = LIBSSH2_POLLFD_POLLIN;          fds[0].revents = LIBSSH2_POLLFD_POLLIN;                if (libssh2_poll(fds, nfds, 0) >0) {              libssh2_channel_read(channel, &buf, 1);              fprintf(stdout, "%c", buf);              fflush(stdout);          }                if (select(fileno(stdin)+1,&set,NULL,NULL,&timeval_out) > 0)              if (read(fileno(stdin), &buf, 1) > 0)                  libssh2_channel_write(channel, &buf, 1);                free (fds);                if (libssh2_channel_eof(channel) == 1)           break;      }            if (channel) {          libssh2_channel_free (channel);          channel = NULL;      }            _normal_mode();            libssh2_exit();        return 0;  ERROR:      libssh2_session_disconnect(session, "Session Shutdown, Thank you for playing");      libssh2_session_free(session);      return -1;  }  


0 0