http://blog.csdn.net/wyc6668205/article/details/9179197

Xmanager Enterprise 4 putty 等工具都功能都是利用libssh2来实现的。sftp ssh2等

集成:

下载libssh2-1.6.0

http://www.libssh2.org/

D:\libssh2-1.6.0\libssh2-1.6.0\win32\libssh2.dsw

..\win32,..\include,D:\openssl-1.0.0c\openssl-1.0.0c\include,D:\openssl-1.0.0c\openssl-1.0.0c\inc32

(需要提前编译好ssl)

根据工程类型分别编译生成dll和lib

在session.c的文件中,会出现错误:

/* Windows? */
    unsigned int option_value;
    socklen_t option_len = sizeof(option_value);

if (getsockopt
        (sockfd, SOL_SOCKET, SO_ERROR, (void *) &option_value, &option_len)) {
        /* Assume blocking on error */
        return 1;
    }

在前面加这一句即可

typedef int socklen_t;

应用:sftp上传文件

利用生成的静态库和D:\libssh2-1.6.0\libssh2-1.6.0\win32,D:\libssh2-1.6.0\libssh2-1.6.0\include生产文件。

/*
 * Sample showing how to do SFTP transfers.
 *
 * The sample code has default values for host name, user name, password
 * and path to copy, but you can specify them on the command line like:
 *
 * "sftp 192.168.0.1 user password /tmp/secrets -p|-i|-k"
 */
 #include "libssh2_config.h"
#include <libssh2.h>
#include <libssh2_sftp.h>   #ifdef HAVE_WINSOCK2_H
#include <winsock2.h>

#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>
#include <io.h>
#include <conio.h>
  const char *keyfile1="~/.ssh/id_rsa.pub"; const char *keyfile2="~/.ssh/id_rsa"; const char *username="username"; const char *password="password"; const char *sftppath="/tmp/TEST";
  
  static void kbd_callback(const char *name, int name_len,
             const char *instruction, int instruction_len, int num_prompts,
             const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
             LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,
             void **abstract)
{
    int i;
    size_t n;
    char buf[1024];
    (void)abstract;
  
    printf("Performing keyboard-interactive authentication.\n");
  
    printf("Authentication name: '");
    fwrite(name, 1, name_len, stdout);
    printf("'\n");
  
    printf("Authentication instruction: '");
    fwrite(instruction, 1, instruction_len, stdout);
    printf("'\n");
  
    printf("Number of prompts: %d\n\n", num_prompts);
  
    for (i = 0; i < num_prompts; i++) {
        printf("Prompt %d from server: '", i);
        fwrite(prompts[i].text, 1, prompts[i].length, stdout);
        printf("'\n");
  
        printf("Please type response: ");
        fgets(buf, sizeof(buf), stdin);
        n = strlen(buf);
        while (n > 0 && strchr("\r\n", buf[n - 1]))
          n--;
        buf[n] = 0;
  
        responses[i].text = strdup(buf);
        responses[i].length = n;
  
        printf("Response %d from user is '", i);
        fwrite(responses[i].text, 1, responses[i].length, stdout);
        printf("'\n\n");
    }
  
    printf("Done. Sending keyboard-interactive responses to server now.\n");
}
  
// ssh2.exe 10.11.0.33 aspect aspect /recordings/audio/LocStore1/EPro/M3-UserDef/
  int main(int argc, char *argv[])
{

char filename[100]={0};
int k=0;

unsigned long hostaddr;
    int sock, i, auth_pw = 0;
    struct sockaddr_in sin;
    const char *fingerprint;
    char *userauthlist;
    LIBSSH2_SESSION *session;
    int rc;
    LIBSSH2_SFTP *sftp_session;
    LIBSSH2_SFTP_HANDLE *sftp_handle;
    #ifdef WIN32    
 WSADATA wsadata;

WSAStartup(MAKEWORD(2,2), &wsadata);
#endif 
    if (argc > 1) {
        hostaddr = inet_addr(argv[1]);
    } else {
        hostaddr = htonl(0x7F000001);
    }
  
    if(argc > 2) {
        username = argv[2];
    }
    if(argc > 3) {
        password = argv[3];
    }
    if(argc > 4) {
        sftppath = argv[4];
    }
  
    rc = libssh2_init (0);
 
    if (rc != 0) {
        fprintf (stderr, "libssh2 initialization failed (%d)\n", rc);
        return 1;
    }
  
    /*
     * The application code is responsible for creating the socket
     * and establishing the connection
     */
    sock = socket(AF_INET, SOCK_STREAM, 0);
  
    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)) != 0) {
        fprintf(stderr, "failed to connect!\n");
        return -1;
    }
  
    /* Create a session instance
     */
    session = libssh2_session_init();
 
    if(!session)
        return -1;
  
    /* Since we have set non-blocking, tell libssh2 we are blocking */
    libssh2_session_set_blocking(session, 1);
 
  
    /* ... 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) {
        fprintf(stderr, "Failure establishing SSH session: %d\n", rc);
        return -1;
    }
  
    /* 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");
  
    /* check what authentication methods are available */
    userauthlist = libssh2_userauth_list(session, username, strlen(username));
 
    printf("Authentication methods: %s\n", userauthlist);
    if (strstr(userauthlist, "password") != NULL) {
        auth_pw |= 1;
    }
    if (strstr(userauthlist, "keyboard-interactive") != NULL) {
        auth_pw |= 2;
    }
    if (strstr(userauthlist, "publickey") != NULL) {
        auth_pw |= 4;
    }
  
    /* if we got an 4. argument we set this option if supported */
    if(argc > 5) {
        if ((auth_pw & 1) && !strcasecmp(argv[5], "-p")) {
            auth_pw = 1;
        }
        if ((auth_pw & 2) && !strcasecmp(argv[5], "-i")) {
            auth_pw = 2;
        }
        if ((auth_pw & 4) && !strcasecmp(argv[5], "-k")) {
            auth_pw = 4;
        }
    }

// printf("--------------------%d",auth_pw);

if (auth_pw & 1) {
  printf("---------ddd-----------%d",auth_pw);
        /* We could authenticate via password */
        if (libssh2_userauth_password(session, username, password)) {
 
            fprintf(stderr, "Authentication by password failed.\n");
            goto shutdown;
        }
    } else if (auth_pw & 2) {
        /* Or via keyboard-interactive */
        if (libssh2_userauth_keyboard_interactive(session, username, &kbd_callback) ) {
 
            printf("\tAuthentication by keyboard-interactive failed!\n");
            goto shutdown;
        } else {
            printf("\tAuthentication by keyboard-interactive succeeded.\n");
        }
    } else if (auth_pw & 4) {
        /* Or by public key */
        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, keyfile2, password)) {
 
            printf("\tAuthentication by public key failed!\n");
            goto shutdown;
        } else {
            printf("\tAuthentication by public key succeeded.\n");
        }
    } else {
        printf("No supported authentication methods found!\n");
        goto shutdown;
    }
  
    fprintf(stderr, "libssh2_sftp_init()!\n");
 
    sftp_session = libssh2_sftp_init(session);
 
  
    if (!sftp_session) {
        fprintf(stderr, "Unable to init SFTP session\n");
        goto shutdown;
    }
  
    fprintf(stderr, "libssh2_sftp_open()!\n");

for (;k<2;k++)
 {
  
 sprintf(filename,"%s/%d.txt",sftppath,k);
 printf("---%s",filename);
    /* Request a file via SFTP */
    sftp_handle =
        libssh2_sftp_open(sftp_session, filename, LIBSSH2_FXF_READ, 0);
 
  
    if (!sftp_handle) {
        fprintf(stderr, "Unable to open file with SFTP: %ld\n",
                libssh2_sftp_last_error(sftp_session));
 
        goto shutdown;
    }
    fprintf(stderr, "libssh2_sftp_open() is done, now receive data!\n");

do {
        char mem[1024]={0};
  
        /* loop until we fail */
        fprintf(stderr, "libssh2_sftp_read()!\n");
 
        rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem));
 // libssh2_sftp_write(sftp_handle,)
 
        if (rc > 0) {
            write(1, mem, rc);
        } else {
            break;
        }
    } while (1);
  
 }
    libssh2_sftp_close(sftp_handle);
 
    libssh2_sftp_shutdown(sftp_session);
  printf("-----------------------down");
  
 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();
 
   getch();
    return 0;
}

libssh2 的集成与应用的更多相关文章

  1. vs2010 编译curl-7.42.1

    curl是一个sftp ssl 等功能工具. dos 进入到curl-7.42.1\lib下来:逐步执行以下操作 call "C:/Program Files/Microsoft Visua ...

  2. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  3. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  4. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  5. Travis CI用来持续集成你的项目

    这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...

  6. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  7. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  8. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  9. TODO:macOS上ThinkPHP5和Semantic-UI集成

    TODO:macOS上ThinkPHP5和Semantic-UI集成 1. 全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分 2. 把X ...

随机推荐

  1. LVDS,MIPI,EDP

    一.背景介绍: 随着显示分辨率的越来越高,传统的VGA.DVI等接口逐渐不能满足人们的视觉需求.随后就产生了以HDMI.DisplayPort为代表的新型数字接口,外部接口方面HDMI占据了较大市场优 ...

  2. hdu 2063

    ps:二分匹配法,匈牙利算法.感觉自己只是学了点皮毛...这里贴上大神的微博,深入浅出的讲了匈牙利算法: http://blog.csdn.net/dark_scope/article/details ...

  3. 在 C++ 代码中使用 UE4 插件---Using a plugin in C++ code

    例如使用 CustomMeshComponent 插件 在Build.cs 文件 中 添加以下两行代码 如图可配置路径,可解决#include "CustomMeshComponent&qu ...

  4. Eclipse设置JSP页面的默认编码

    1.一般新建jsp页面是默认编码为ISO-8895-1编码.但是,实际应用中为避免编码问题带来的麻烦,我们一般需要设置默认编码为UTF-8. 2.设置 Eclipse->Window->P ...

  5. CSS缩放函数, 旋转函数与倾斜函数

       1 :缩放        scale(x,y)函数让元素根据中心原点对对象进行缩放,大于1进行放大,小于1则缩小,如果为负值,则先进行翻转再进行缩放操作. 实例: HTML: <div c ...

  6. Oracle 12c SYSAUX表空间不足处理-清理audsys.cli_swp$a9b5f52c$1$1表

    今天在检查一台测试环境的表空间时,发现SYSAUX的使用率已经达到99.91% TABLESPACE_NAME FILES Freesize(MB) Usedsize(MB) Filesize(MB) ...

  7. 转:Task任务调度实现生产者消费者模式

    我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出)      ...

  8. 数论 UVA 10943

    这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这 ...

  9. TortoiseGit 添加ssh key

    TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在Tortoi ...

  10. java 生成8位数字作为UID

    java 生成8位数字作为UUID: /*** * 生成uid 8位数字 */public static String generateUID(){ Random random = new Rando ...