头文件 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