【libssh2在win32下封装库】

头文件 winssh.h



//========================================================================================================================
//= SSH函数 =============================================================================================================
//========================================================================================================================

LRESULT WINAPI SSH_Init(VOID);//初始化
LRESULT WINAPI SSH_Connect(LPWSTR host,WORD port);//连接服务器
LRESULT WINAPI SSH_FromPassword(LPWSTR user,LPWSTR password);//通过密码验证
LRESULT WINAPI SSH_FromPublicKey(LPWSTR user,LPWSTR filename,LPWSTR password);//通过公钥验证
LRESULT WINAPI SSH_ReConnect();//连接服务器
LRESULT WINAPI SSH_Delete();//关闭服务器
LRESULT WINAPI SSH_OpenFolder(LPCWSTR filename,DWORD index);//打开目录
LRESULT WINAPI SSH_ReadFolder(HANDLE hDir,LPWIN32_FIND_DATAW fileinfo,LPWSTR power);//读取目录
LRESULT WINAPI SSH_CloseFolder(HANDLE hDir);//关闭目录
LRESULT WINAPI SSH_Exec(LPWSTR string,LPVOID func,LPVOID lParam);//运行脚本
LRESULT WINAPI SSH_ExecFile(LPWSTR filename,LPVOID func,LPVOID lParam);//运行脚本
LRESULT WINAPI SSH_PutFile(LPWSTR local,LPWSTR filename,BOOL reset,LPVOID func,LPVOID lParam);//上传文件
LRESULT WINAPI SSH_DownFile(LPWSTR local,LPWSTR filename,BOOL reset,LPVOID func,LPVOID lParam);//下载文件
LRESULT WINAPI SSH_GetFileAttributes(LPWSTR filename);//获取文件类型
LRESULT WINAPI SSH_DeleteFile(LPWSTR filename);//删除文件
LRESULT WINAPI SSH_SetFileName(LPWSTR filename,LPWSTR newfilename);//重命名文件
LRESULT WINAPI SSH_CopyFile(LPWSTR filename,LPWSTR newfilename);//复制文件
LRESULT WINAPI SSH_CreateFile(LPWSTR filename);//创建文件
LRESULT WINAPI SSH_CreateFolder(LPWSTR filename);//创建目录
LRESULT WINAPI SSH_SetPower(LPWSTR filename,LPWSTR power,BOOL recursive);//设置权限
LRESULT WINAPI SSH_GetFolder(LPWSTR filename);//获取当前目录
LRESULT WINAPI SSH_SetFolder(LPWSTR folder);//设置当前目录

//========================================================================================================================
//= 线程函数 =============================================================================================================
//========================================================================================================================

LRESULT WINAPI WINAPI SSH_KeepAlive(LPVOID);//心跳连接
LRESULT WINAPI WINAPI SSH_ConnectThread(LPVOID);//连接到服务器

//========================================================================================================================
//= 替换转义 =============================================================================================================
//========================================================================================================================

LRESULT WINAPI SSH_FormString(LPWSTR input,LPWSTR output);



源文件

#include <libssh2.h>
#include <libssh2_sftp.h>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <time.h>
#include "winssh.h"
#pragma comment(lib,"imagehlp.lib")
#pragma comment(lib,"libssh2.lib")
#pragma comment(lib,"libeay32MT.lib")
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"shlwapi.lib")
#pragma comment(lib,"ws2_32.lib")

//========================================================================================================================
//= 全局变量 =============================================================================================================
//========================================================================================================================

static CRITICAL_SECTION cs = {
    0 };
static LIBSSH2_SESSION * session = {
    0 };
static LIBSSH2_SFTP * sftp = {
    0 };
static SOCKET sock = {
    0 };
static HANDLE hThread = {
    0 };
static CHAR ssh_host[1024] = {
    0 };
static CHAR ssh_user[1024] = {
    0 };
static CHAR ssh_password[1024] = {
    0 };
static CHAR ssh_folder[1024] = {
    0 };
static WORD ssh_port = {
    0 };

//========================================================================================================================
//= 套接字与SSH绑定 ======================================================================================================
//========================================================================================================================

static int libssh2_waitsocket(int 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);

    dir = libssh2_session_block_directions(session);

    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)
        readfd = &fd;
 
    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
        writefd = &fd;
 
    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);
 
    return rc;
}

//========================================================================================================================
//= 初始化 ===============================================================================================================
//========================================================================================================================

LRESULT WINAPI SSH_Init(VOID){
   

	WSADATA wsadata = {
    0 };

	/* 检查是否初始化 */
	if(!cs.LockCount && !cs.RecursionCount && !cs.OwningThread && !cs.LockSemaphore && !cs.SpinCount){
   

		/* 初始化库 */
		WSAStartup(MAKEWORD(2,2),&wsadata);

		/* 创建锁 */
		InitializeCriticalSection(&cs);

		/* 初始化 */
		if(libssh2_init(0) != 0) {
   

			return FALSE;
		}

		/* 创建检测进程 */
		if(hThread == NULL){
   

			hThread = ::CreateThread(0,0,(LPTHREAD_START_ROUTINE)SSH_KeepAlive,0,0,0);
		}

	}

	return TRUE;
}

//========================================================================================================================
//= 连接服务器 ===========================================================================================================
//========================================================================================================================

LRESULT WINAPI SSH_Connect(LPWSTR host,WORD port){
   
	
	CHAR sHose[128] = {
    0 };
	LPSTR authlist = {
    0 };
	HANDLE hThread = {
    0 };
	DWORD exitCode = {
    0 };
	int rc = {
    0 };

	/* 进入许可区 */
	EnterCriticalSection(&cs);

	/* 转码 */
	WideCharToMultiByte(CP_UTF8,0,host,-1,sHose,sizeof(sHose),0,0);

	/* 不需要连接 */
	if(strcmp(sHose,ssh_host) == 0 && sftp && session && sock){
   

		LeaveCriticalSection(&cs);

		return TRUE;
	}

	/* 关闭文件会话 */
	if(sftp != NULL){
   

		libssh2_sftp_shutdown(sftp);
		sftp = NULL;
	}

	/* 关闭通道 */
	if(session != NULL){
   
		
		libssh2_session_disconnect(session,"Normal Shutdown");
		libssh2_session_free(session);
		session = NULL;

	}

	/* 关闭套接字 */
	if(sock != NULL){
   
		
		closesocket(sock);
		sock = NULL;

	}

	/* 初始化 */
	memset(ssh_host,0,sizeof(ssh_host));

	/* 转码 */
	WideCharToMultiByte(CP_UTF8,0,host,-1,ssh_host,sizeof(ssh_host),0,0);

	/* 获取端口 */
	ssh_port = port;

	/* 创建线程 */
	if((hThread = ::CreateThread(0,0,(LPTHREAD_START_ROUTINE)SSH_ConnectThread,0,0,0)) == NULL){
   

		closesocket(sock);
		sock = NULL;
		LeaveCriticalSection(&cs);
		return FALSE;
	}

	/* 等待线程 */
	if(WaitForSingleObject(hThread,10000) != WAIT_OBJECT_0){
   

		TerminateThread(hThread,0);
		closesocket(sock);
		sock = NULL;
		LeaveCriticalSection(&cs);
		return FALSE;

	}

	/* 检查是否成功 */
	if(GetExitCodeThread(hThread,&exitCode) == FALSE || exitCode == 0){
   

		closesocket(sock);
		sock = NULL;
		LeaveCriticalSection(&cs);
		return FALSE;

	}

	/* 初始化SSH */
    if(!(session = libssh2_session_init())){
   

		closesocket(sock);
		sock = NULL;
		LeaveCriticalSection(&cs);

		return FALSE;
	
	}

	/* 设置为非堵塞模式 */
	libssh2_session_set_blocking(session,0);

	/* 套接字与SSH绑定 这个函数在乌班图系统中将失败 返回 无法交换密钥 */
    while((rc = libssh2_session_handshake(session,sock)) == LIBSSH2_ERROR_EAGAIN){
   
	
		libssh2_waitsocket(sock,session);
	
	}

	/* 判断是否成功 */ 
	if(rc) {
   

		libssh2_session_disconnect(session,"Normal Shutdown");
		libssh2_session_free(session);
		closesocket(sock);
		sftp = NULL;
		session = NULL;
		sock = NULL;
		
		LeaveCriticalSection(&cs);

		return FALSE;

    }

	/* 获取验证信息 */
	if(libssh2_hostkey_hash(session,LIBSSH2_HOSTKEY_HASH_SHA1) == NULL){
   

		libssh2_session_disconnect(session,"Normal Shutdown");
		libssh2_session_free(session);
		closesocket(sock);
		sftp = NULL;
		session = NULL;
		sock = NULL;
		
		LeaveCriticalSection(&cs);

		return FALSE;

	}

	/* 获取验证方式 */   
	while((authlist = libssh2_userauth_list(session,ssh_user,strlen(ssh_user))) == NULL){
   
	
		if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN){
   
			break;
		}

		libssh2_waitsocket(sock,session);
	
	}

	/* 公钥验证 */ 
	if(authlist != NULL && strstr(authlist,"publickey") != NULL){
   
		  
		LeaveCriticalSection(&cs);

		return 4;

	}
	
	/* 密码验证 */ 
	if(authlist != NULL && strstr(authlist,"password") != NULL){
   
		  
		LeaveCriticalSection(&cs);

		return 1;

	}

	/* 关闭 */
	libssh2_session_disconnect(session,"Normal Shutdown");
	libssh2_session_free(session);
	closesocket(sock);
	
	sftp = NULL
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值