当前位置: 首页 > 工具软件 > libssh2.nim > 使用案例 >

libssh2编译安装及例程

孔星宇
2023-12-01

一、下载源代码:

官网:https://www.libssh2.org/

github:https://github.com/libssh2/libssh2

二、编译安装:

1.安装依赖库(选一个即可)

  • OpenSSL
  • Libgcrypt
  • WinCNG
  • mbedTLS

2.安装libssh2,生成静态库和动态库

三、例程

#include "libssh2.h"

#ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
# ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif

#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h>


int main()
{
    unsigned long hostaddr;
    int sock, i, auth_pw = 1;
    struct sockaddr_in sin;
    const char *fingerprint;
    LIBSSH2_SESSION *session;
    LIBSSH2_CHANNEL *channel;
    const char *username = "用户名";
    const char *password = "密码";
    int rc;

       /init_slot()
#ifdef WIN32
    WSADATA wsadata;
    int err;

    err = WSAStartup(MAKEWORD(2, 0), &wsadata);
    if(err != 0) {
        fprintf(stderr, "WSAStartup failed with error: %d\n", err);
        return 1;
    }
#endif


    rc = libssh2_init(0);
    if(rc != 0) {
        fprintf(stderr, "libssh2 initialization failed (%d)\n", rc);
        return 1;
    }

    hostaddr = inet_addr("IP地址");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(22);
    sin.sin_addr.s_addr = hostaddr;
    /* 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 == -1)
    {
        qDebug() << "failed to create socket!";
        return -1;
    }

    if(::connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) {
        fprintf(stderr, "failed to connect!\n");
        return -1;
    }

    fprintf(stderr, "sock connected!\n");

    /* Create a session instance
        */
    session = libssh2_session_init();
    if(!session)
        return -1;

    fprintf(stderr, "session inited!\n");

    /* ... start it up. This will trade welcome banners, exchange keys,
        * and setup crypto, compression, and MAC layers
        */
    rc = libssh2_session_handshake(session, sock);
    if(rc != 0) {
        qDebug() << rc;
        fprintf(stderr, " %d\n", rc);
        return -1;
    }

    fprintf(stderr, "session handshake!\n");

    /* At this point we havn't yet authenticated.  The first thing to do
        * is check the hostkey's fingerprint against our known hosts Your app
        * may have it hard coded, may go to a file, may present it to the
        * user, that's your call
        */
    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
    fprintf(stderr, "Fingerprint: ");
    for(i = 0; i < 20; i++) {
        fprintf(stderr, "%02X ", (unsigned char)fingerprint[i]);
    }
    fprintf(stderr, "\n");


    /* We could authenticate via password */
    if(libssh2_userauth_password(session, username, password)) {
        fprintf(stderr, "Authentication by password failed.\n");
        goto shutdown;
    }

    qDebug() << "Authentication by password successful";
    /
    /

    /* Request a file via SCP */

    const char* loclfile = "源文件";
    const char *scppath = "目标文件";
    FILE *local = fopen(loclfile, "rb");
    if(!local)
    {
        qDebug() << "Can't open local file: " << loclfile;
        return -1;
    }

    struct stat fileinfo;
    stat(loclfile, &fileinfo);


    channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777, (unsigned long)fileinfo.st_size);
    if(!channel)
    {
        char *errmsg;
        int errlen;
        int err = libssh2_session_last_error(session, &errmsg, &errlen, 0);

        qDebug() << "Create channel failed. " << err;
        goto shutdown;
    }

    qDebug() << "SCP session waiting to send file";

    do
    {
        char mem[1024];
        size_t nread = fread(mem, 1, sizeof(mem), local);
        if(nread <= 0) /* end of file */
        {
            break;
        }

        char *ptr = mem;
        do
        {
            /* write the same data over and over, until error or completion */
            int rc = libssh2_channel_write(channel, ptr, nread);
            if(rc < 0) // error
            {
                qDebug() << "ERROR " << rc;
                break;
            }
            else /* rc indicates how many bytes were written this time */
            {
                ptr += rc;
                nread -= rc;
            }
        } while(nread);

    } while(1);

    libssh2_channel_free(channel);
    channel = NULL;

shutdown:

    libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing");
    libssh2_session_free(session);

#ifdef WIN32
    closesocket(sock);
#else
    close(sock);
#endif
    fprintf(stderr, "all done\n");

    libssh2_exit();

    return 0;
}

 

 类似资料: