• C ssh2 执行命令


    /*
     * The code sends a 'cat' command, and then writes a lot of data to it only to
     * check that reading the returned data sums up to the same amount.
     *
     * $ ./ssh2_echo 127.0.0.1 user password
     *
     */
    
    #include 
    
    #ifdef HAVE_SYS_SOCKET_H
    #include 
    #endif
    #ifdef HAVE_UNISTD_H
    #include 
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include 
    #endif
    #ifdef HAVE_ARPA_INET_H
    #include 
    #endif
    
    #include 
    #include 
    #include 
    
    static const char *hostname = "127.0.0.1";
    static const char *commandline = "ifconfig";
    static const char *username = "user";
    static const char *password = "password";
    
    static int waitsocket(libssh2_socket_t socket_fd, LIBSSH2_SESSION *session)
    {
        struct timeval timeout;
        int rc;
        fd_set fd;
        fd_set *writefd = NULL;
        fd_set *readfd = NULL;
        int dir;
    
        timeout.tv_sec = 10;
        timeout.tv_usec = 0;
    
        FD_ZERO(&fd);
    
        FD_SET(socket_fd, &fd);
    
        /* now make sure we wait in the correct direction */
        dir = libssh2_session_block_directions(session);
    
        if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)
            readfd = &fd;
    
        if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
            writefd = &fd;
    
        rc = select((int)(socket_fd + 1), readfd, writefd, NULL, &timeout);
    
        return rc;
    }
    
    #define BUFSIZE 32000
    
    int cmd(int argc, char *argv[])
    {
        uint32_t hostaddr;
        libssh2_socket_t sock;
        struct sockaddr_in sin;
        const char *fingerprint;
        int rc;
        LIBSSH2_SESSION *session = NULL;
        LIBSSH2_CHANNEL *channel;
        int exitcode = 0;
        char *exitsignal = (char *)"none";
        size_t len;
        LIBSSH2_KNOWNHOSTS *nh;
        int type;
    
    #ifdef WIN32
        WSADATA wsadata;
    
        rc = WSAStartup(MAKEWORD(2, 0), &wsadata);
        if(rc) {
            fprintf(stderr, "WSAStartup failed with error: %d\n", rc);
            return 1;
        }
    #endif
    
        if(argc > 1) {
            hostname = argv[1];  /* must be ip address only */
        }
        if(argc > 2) {
            username = argv[2];
        }
        if(argc > 3) {
            password = argv[3];
        }
    
        rc = libssh2_init(0);
        if(rc) {
            fprintf(stderr, "libssh2 initialization failed (%d)\n", rc);
            return 1;
        }
    
        hostaddr = inet_addr(hostname);
    
        /* Ultra basic "connect to port 22 on localhost".  Your code is
         * responsible for creating the socket establishing the connection
         */
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock == LIBSSH2_INVALID_SOCKET) {
            fprintf(stderr, "failed to create socket!\n");
            goto shutdown;
        }
    
        sin.sin_family = AF_INET;
        sin.sin_port = htons(22);
        sin.sin_addr.s_addr = hostaddr;
        if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in))) {
            fprintf(stderr, "failed to connect!\n");
            goto shutdown;
        }
    
        /* Create a session instance */
        session = libssh2_session_init();
        if(!session) {
            fprintf(stderr, "Could not initialize SSH session!\n");
            goto shutdown;
        }
    
        /* tell libssh2 we want it all done non-blocking */
        libssh2_session_set_blocking(session, 0);
    
        /* ... start it up. This will trade welcome banners, exchange keys,
         * and setup crypto, compression, and MAC layers
         */
        while((rc = libssh2_session_handshake(session, sock)) ==
              LIBSSH2_ERROR_EAGAIN);
        if(rc) {
            fprintf(stderr, "Failure establishing SSH session: %d\n", rc);
            goto shutdown;
        }
    
        nh = libssh2_knownhost_init(session);
        if(!nh) {
            /* eeek, do cleanup here */
            return 2;
        }
    
        /* read all hosts from here */
        libssh2_knownhost_readfile(nh, "known_hosts",
                                   LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    
        /* store all known hosts to here */
        libssh2_knownhost_writefile(nh, "dumpfile",
                                    LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    
        fingerprint = libssh2_session_hostkey(session, &len, &type);
        if(fingerprint) {
            struct libssh2_knownhost *host;
            int check = libssh2_knownhost_checkp(nh, hostname, 22,
                                                 fingerprint, len,
                                                 LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                                 LIBSSH2_KNOWNHOST_KEYENC_RAW,
                                                 &host);
    
            fprintf(stderr, "Host check: %d, key: %s\n", check,
                    (check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) ?
                    host->key : "");
    
            /*****
             * At this point, we could verify that 'check' tells us the key is
             * fine or bail out.
             *****/
        }
        else {
            /* eeek, do cleanup here */
            return 3;
        }
        libssh2_knownhost_free(nh);
    
        if(strlen(password) != 0) {
            /* We could authenticate via password */
            while((rc = libssh2_userauth_password(session, username, password)) ==
                  LIBSSH2_ERROR_EAGAIN);
            if(rc) {
                fprintf(stderr, "Authentication by password failed!\n");
                exit(1);
            }
        }
    
        libssh2_trace(session, LIBSSH2_TRACE_SOCKET);
    
        /* Exec non-blocking on the remote host */
        do {
            channel = libssh2_channel_open_session(session);
            if(channel ||
               libssh2_session_last_error(session, NULL, NULL, 0) !=
               LIBSSH2_ERROR_EAGAIN)
                break;
            waitsocket(sock, session);
        } while(1);
        if(!channel) {
            fprintf(stderr, "Error\n");
            exit(1);
        }
        while((rc = libssh2_channel_exec(channel, commandline)) ==
              LIBSSH2_ERROR_EAGAIN) {
            waitsocket(sock, session);
        }
        if(rc) {
            fprintf(stderr, "exec error\n");
            exit(1);
        }
        else {
            LIBSSH2_POLLFD *fds = NULL;
            int running = 1;
            ssize_t bufsize = BUFSIZE;
            char buffer[BUFSIZE];
            ssize_t totsize = 1500000;
            ssize_t totwritten = 0;
            ssize_t totread = 0;
            int rereads = 0;
            int rewrites = 0;
            int i;
            fds = (LIBSSH2_POLLFD*)malloc(sizeof(LIBSSH2_POLLFD));
            if(!fds) {
                fprintf(stderr, "malloc failed\n");
                exit(1);
            }
    
            fds[0].type = LIBSSH2_POLLFD_CHANNEL;
            fds[0].fd.channel = channel;
            fds[0].events = LIBSSH2_POLLFD_POLLIN | LIBSSH2_POLLFD_POLLOUT;
    
            do {
                int act = 0;
                rc = libssh2_poll(fds, 1, 10);
                if(rc < 1)
                    continue;
                if(fds[0].revents & LIBSSH2_POLLFD_POLLIN) {
                    ssize_t n = libssh2_channel_read(channel,
                                                     buffer, sizeof(buffer));
                    act++;
                    printf("%s\n",buffer);
                    if(n == LIBSSH2_ERROR_EAGAIN) {
                        rereads++;
                        fprintf(stderr, "will read again\n");
                    }
                    else if(n < 0) {
                        fprintf(stderr, "read failed\n");
                        exit(1);
                    }
                    else {
                        totread += n;
                        fprintf(stderr, "read %d bytes (%d in total)\n",
                                (int)n, (int)totread);
                    }
                }
                if(fds[0].revents & LIBSSH2_POLLFD_CHANNEL_CLOSED) {
                    if(!act) /* don't leave loop until we have read all data */
                        running = 0;
                }
            } while(running);
            exitcode = 127;
            while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN)
                waitsocket(sock, session);
    
            if(rc == 0) {
                exitcode = libssh2_channel_get_exit_status(channel);
                libssh2_channel_get_exit_signal(channel, &exitsignal,
                                                NULL, NULL, NULL, NULL, NULL);
            }
    
            if(exitsignal)
                fprintf(stderr, "\nGot signal: %s\n", exitsignal);
    
            libssh2_channel_free(channel);
            channel = NULL;
        }
    
    shutdown:
    
        if(session) {
            libssh2_session_disconnect(session, "Normal Shutdown");
            libssh2_session_free(session);
        }
    
        if(sock != LIBSSH2_INVALID_SOCKET) {
            shutdown(sock, 2);
    #ifdef WIN32
            closesocket(sock);
    #else
            close(sock);
    #endif
        }
    
        fprintf(stderr, "all done\n");
    
        libssh2_exit();
    
        return exitcode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304

    示例代码修改

    示例代码调整

    /*
     * The code sends a 'cat' command, and then writes a lot of data to it only to
     * check that reading the returned data sums up to the same amount.
     *
     * $ ./ssh2_echo 127.0.0.1 user password
     *
     */
    
    #include 
    
    #ifdef HAVE_SYS_SOCKET_H
    #include 
    #endif
    #ifdef HAVE_UNISTD_H
    #include 
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include 
    #endif
    #ifdef HAVE_ARPA_INET_H
    #include 
    #endif
    #include 
    #include 
    #include 
    #include 
    #include "ssh2_exec.h"
    const char *hostname = "192.168.1.110";
    const char *password = "root";
    const char *username = "root";
    static libssh2_socket_t sock;
    LIBSSH2_SESSION *session = NULL;
    LIBSSH2_CHANNEL *channel;
    
    static int waitsocket(libssh2_socket_t socket_fd, LIBSSH2_SESSION *_session) {
      struct timeval timeout;
      int rc;
      fd_set fd;
      fd_set *writefd = NULL;
      fd_set *readfd = NULL;
      int dir;
    
      timeout.tv_sec = 10;
      timeout.tv_usec = 0;
    
      FD_ZERO(&fd);
    
      FD_SET(socket_fd, &fd);
    
      /* now make sure we wait in the correct direction */
      dir = libssh2_session_block_directions(_session);
    
      if (dir & LIBSSH2_SESSION_BLOCK_INBOUND)
        readfd = &fd;
    
      if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
        writefd = &fd;
    
      rc = select((int)(socket_fd + 1), readfd, writefd, NULL, &timeout);
    
      return rc;
    }
    
    #define BUFSIZE 32000
    
    int setupSSH2(void) {
      uint32_t hostaddr;
      struct sockaddr_in sin;
      const char *fingerprint;
      int rc;
      size_t len;
      LIBSSH2_KNOWNHOSTS *nh;
      int type;
    #ifdef WIN32
      WSADATA wsadata;
      rc = WSAStartup(MAKEWORD(2, 0), &wsadata);
      if (rc) {
        fprintf(stderr, "WSAStartup failed with error: %d\n", rc);
        return 1;
      }
    #endif
      rc = libssh2_init(0);
      if (rc) {
        fprintf(stderr, "libssh2 initialization failed (%d)\n", rc);
        return 1;
      }
      hostaddr = inet_addr(hostname);
      /* Ultra basic "connect to port 22 on localhost".  Your code is
       * responsible for creating the socket establishing the connection
       */
      sock = socket(AF_INET, SOCK_STREAM, 0);
      if (sock == LIBSSH2_INVALID_SOCKET) {
        fprintf(stderr, "failed to create socket!\n");
        return 1;
      }
      sin.sin_family = AF_INET;
      sin.sin_port = htons(22);
      sin.sin_addr.s_addr = hostaddr;
      if (connect(sock, (struct sockaddr *)(&sin), sizeof(struct sockaddr_in))) {
        fprintf(stderr, "failed to connect!\n");
        return 1;
      }
      /* Create a session instance */
      session = libssh2_session_init();
      if (!session) {
        fprintf(stderr, "Could not initialize SSH session!\n");
        return 1;
      }
    
      /* tell libssh2 we want it all done non-blocking */
      libssh2_session_set_blocking(session, 0);
    
      /* ... start it up. This will trade welcome banners, exchange keys,
       * and setup crypto, compression, and MAC layers
       */
      while ((rc = libssh2_session_handshake(session, sock)) ==
             LIBSSH2_ERROR_EAGAIN)
        ;
      if (rc) {
        fprintf(stderr, "Failure establishing SSH session: %d\n", rc);
        return 1;
      }
    
      nh = libssh2_knownhost_init(session);
      if (!nh) {
        /* eeek, do cleanup here */
        return 2;
      }
    
      /* read all hosts from here */
      libssh2_knownhost_readfile(nh, "known_hosts", LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    
      /* store all known hosts to here */
      libssh2_knownhost_writefile(nh, "dumpfile", LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    
      fingerprint = libssh2_session_hostkey(session, &len, &type);
      if (fingerprint) {
        struct libssh2_knownhost *host;
        libssh2_knownhost_checkp(
            nh, hostname, 22, fingerprint, len,
            LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW, &host);
        /*****
         * At this point, we could verify that 'check' tells us the key is
         * fine or bail out.
         *****/
      } else {
        /* eeek, do cleanup here */
        return 3;
      }
      libssh2_knownhost_free(nh);
    
      if (strlen(password) != 0) {
        /* We could authenticate via password */
        while ((rc = libssh2_userauth_password(session, username, password)) ==
               LIBSSH2_ERROR_EAGAIN)
          ;
        if (rc) {
          fprintf(stderr, "Authentication by password failed!\n");
          exit(1);
        }
      }
      libssh2_trace(session, LIBSSH2_TRACE_SOCKET);
      /* Exec non-blocking on the remote host */
      return 0;
    }
    
    int32_t SSH2_CMD(const char *commandline, char *err, ssize_t e_len, char *out,
                     ssize_t o_len) {
      int32_t rc = 0;
      int32_t exitcode = 0;
      char buffer_cache[BUFSIZE];
      char *buffer = buffer_cache;
      ssize_t n = 0;
      do {
        channel = libssh2_channel_open_session(session);
        if (channel || libssh2_session_last_error(session, NULL, NULL, 0) !=
                           LIBSSH2_ERROR_EAGAIN)
          break;
        waitsocket(sock, session);
      } while (1);
      if (!channel) {
        fprintf(stderr, "Error\n");
        exit(1);
      }
      while ((rc = libssh2_channel_exec(channel, commandline)) ==
             LIBSSH2_ERROR_EAGAIN) {
        waitsocket(sock, session);
      }
      if (rc) {
        fprintf(stderr, "exec error\n");
        return 1;
      }
      while ((rc = libssh2_channel_send_eof(channel)) == LIBSSH2_ERROR_EAGAIN) {
        waitsocket(sock, session);
      }
      if (rc) {
        fprintf(stderr, "exec error\n");
        return 1;
      } else {
        memset(buffer, 0, BUFSIZ);
        do {
          n = libssh2_channel_read(channel, buffer, BUFSIZE);
          if (n < 0 && n != LIBSSH2_ERROR_EAGAIN) {
            fprintf(stderr, "read failed\n");
            break;
          }
        } while (n == LIBSSH2_ERROR_EAGAIN);
        memcpy(out ,buffer, n > o_len ? o_len : n);
        memset(buffer, 0, BUFSIZ);
        do {
          n = libssh2_channel_read_stderr(channel, buffer, BUFSIZE);
          if (n < 0 && n != LIBSSH2_ERROR_EAGAIN) {
            fprintf(stderr, "read failed\n");
            break;
          }
        } while (n == LIBSSH2_ERROR_EAGAIN);
        memcpy(err, buffer, n > e_len ? e_len : n);
        while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN)
          waitsocket(sock, session);
      }
      return 0;
    }
    
    int32_t SSH2_CLOSE(void) {
      if (sock != LIBSSH2_INVALID_SOCKET) {
        shutdown(sock, 2);
    #ifdef WIN32
        closesocket(sock);
    #else
        close(sock);
    #endif
      }
      libssh2_channel_free(channel);
      channel = NULL;
      if (session) {
        libssh2_session_disconnect(session, "Normal Shutdown");
        libssh2_session_free(session);
      }
      libssh2_exit();
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
  • 相关阅读:
    python毕业设计作品基于django框架 多用户商城平台系统毕设成品(7)中期检查报告
    DSP-FIR滤波器设计
    Vue2.0+AntvX6—节点 Node
    区块链实训教程(1)--相关概念
    【C语言】详解 malloc 、calloc函数的区别
    MySQL---索引+事务
    GBase 8c V3.0.0数据类型——HLL函数和操作符(功能函数)
    结合Redux Toolkit使用React Redux
    GBase 8s资源管理
    云原生--k8s一主多从架构搭建
  • 原文地址:https://blog.csdn.net/weixin_45647912/article/details/133330847