libssh2编译安装及例程

4 篇文章 0 订阅

一、下载源代码:

官网: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;
}

 

要下载和编译Linux的libssh2.so版本,可以按照以下步骤进行: 1. 首先,从libssh2官方网站(https://www.libssh2.org/)或者其他可靠的资源库中找到最新的libssh2版本的源代码压缩包。 2. 下载源代码压缩包到本地计算机,可以使用命令行工具如wget或者通过浏览器下载。 3. 解压缩源代码压缩包,在命令行中使用tar命令进行解压缩。例如,使用以下命令解压缩压缩包: tar -zxvf libssh2-x.x.x.tar.gz (其中x.x.x代表源代码压缩包的版本号) 4. 进入解压缩后的libssh2目录,使用cd命令切换到解压后的文件夹内。 5. 使用编译工具(如gcc)对libssh2进行编译,可以使用以下命令进行编译: ./configure make make install 注意:在编译之前,请确保您已经安装了必要的依赖项(如libssl-dev)。 6. 编译完成后,libssh2.so文件将会生成在系统默认的库文件路径中,一般为/usr/local/lib。如果您希望将其安装到其他位置,可以在configure命令中通过--prefix选项指定安装路径。 7. 可以使用ldconfig命令来刷新系统的动态链接器缓存,以便让系统找到新安装libssh2.so文件。可以使用以下命令来刷新缓存: sudo ldconfig 8. 现在,您可以在您的应用程序中使用libssh2库进行开发和测试。记得在编译应用程序时,使用-L选项指定libssh2.so所在的目录,并使用-lssh2选项链接到libssh2库。 以上是一个简单的示例解释如何在Linux上下载和编译libssh2.so版本。具体步骤和命令可能因系统版本和安装环境而有所不同,建议在实际操作中参考官方文档或其他可靠资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值