/**
* CSSHClient.h
* @file 说明信息..
* DATE February 13 2015
*
* @author Ming_zhang
*/ #ifndef _CSSHCLIENT_H_
#define _CSSHCLIENT_H_ /***********************Global Variable Declare***************/
//#define -1; ///< 定义 的宏为0。
////////////////////////////////////////////////////////////// /************************INCLUDE FILES*************************/
#include <string>
extern "C"
{
#include "libssh2.h"
};
using namespace std;
/////////////////////////////////////////////////////////////// /**
* @brief SSH2协议进行远程登录
*
*/
class CSSHClient
{
public: // Constructors & Destructor
CSSHClient();
virtual ~CSSHClient();
static int Init();
static int ClearUp();
int Login(string sIp,int nPort,string sUser,string sPasswd);
int Logout();
int ExecuteCommand(string sCommand);
private:
int WaitSocket(int socket_fd, LIBSSH2_SESSION *session);
private:
SOCKET m_nSSHSocket;
LIBSSH2_SESSION *m_hSSHSession ;
LIBSSH2_CHANNEL *m_hSSHChannel ; }; #endif
/**
* CSSHClient.cpp
* @file 说明信息..
* DATE February 13 2015
*
* @author Ming_zhang
*/ /************************INCLUDE FILES*************************/
#include "stdafx.h"
#include "CSSHClient.h" #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_SYS_SELECT_H
#include <sys/select.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif #include <time.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h> #include <stdexcept>
using namespace std; #pragma comment(lib,"libssh2.lib") /////////////////////////////////////////////////////////////// CSSHClient::CSSHClient():m_nSSHSocket(INVALID_SOCKET)
,m_hSSHSession(0)
,m_hSSHChannel(0)
{
} CSSHClient::~CSSHClient()
{
} int CSSHClient::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); /* now make sure we wait in the correct direction */
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;
} int CSSHClient::Login(string sIp,int nPort,string sUser,string sPasswd)
{
ENTER_FUN(m_hSSHChannel); if(m_nSSHSocket!=INVALID_SOCKET)
{
WLE("<%s>Error: m_nSSHSocket=[%d] can't relogin\n",_FUN_,m_nSSHSocket);
return RET_FAIL;
}
string commandline ="ls /root/";
char *exitsignal=(char *)"none";
const char *fingerprint;
int exitcode;
#ifdef WIN32
WSADATA wsadata;
WSAStartup(MAKEWORD(2,0), &wsadata);
#endif
struct sockaddr_in sin;
int bytecount = 0;
size_t len;
LIBSSH2_KNOWNHOSTS *nh;
int type;
int rc = 0;
//建立SOCKET 连接
m_nSSHSocket = socket(AF_INET, SOCK_STREAM, 0);
memset(&sin, 0, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = inet_addr(sIp.c_str());
try
{ int nRet = connect(m_nSSHSocket, (struct sockaddr*)(&sin),sizeof(struct sockaddr_in));
if ( nRet!= 0)
{
WLI("<%s>Error: connect==[%d]\n ",_FUN_);
throw logic_error("Fail connect");
} m_hSSHSession = libssh2_session_init();
if (!m_hSSHSession)
{
WLI("<%s>Error: libssh2_session_init = [%d]\n",_FUN_,m_hSSHSession);
throw logic_error("Fail libssh2_session_init");
} /* ... start it up. This will trade welcome banners, exchange keys,
* and setup crypto, compression, and MAC layers
*/
while ((rc = libssh2_session_handshake(m_hSSHSession, m_nSSHSocket)) ==LIBSSH2_ERROR_EAGAIN); if (rc)
{
WLI("<%s>Error: libssh2_session_handshake = [%d]\n",_FUN_,rc);
throw logic_error("Fail libssh2_session_handshake");
}
nh = libssh2_knownhost_init(m_hSSHSession);
if(!nh)
{
WLI("<%s>Error: libssh2_knownhost_init = [%d]\n",_FUN_,nh);
throw logic_error("Fail libssh2_knownhost_init");
}
libssh2_knownhost_readfile(nh, "known_hosts",LIBSSH2_KNOWNHOST_FILE_OPENSSH); /* store all known hosts to here */
libssh2_knownhost_writefile(nh, "dumpfile",LIBSSH2_KNOWNHOST_FILE_OPENSSH);
fingerprint = libssh2_session_hostkey(m_hSSHSession, &len, &type);
if(fingerprint)
{
struct libssh2_knownhost *host;
#if LIBSSH2_VERSION_NUM >= 0x010206
/* introduced in 1.2.6 */
int check = libssh2_knownhost_checkp(nh, sIp.c_str(), 22, fingerprint, len,
LIBSSH2_KNOWNHOST_TYPE_PLAIN|
LIBSSH2_KNOWNHOST_KEYENC_RAW,
&host);
#else
/* 1.2.5 or older */
int check = libssh2_knownhost_check(nh, hostname, fingerprint, len,
LIBSSH2_KNOWNHOST_TYPE_PLAIN|
LIBSSH2_KNOWNHOST_KEYENC_RAW,
&host);
#endif
WLI( "Host check: %d, key: %s\n", check,
(check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)? host->key:"<none>"); /*****
* At this point, we could verify that 'check' tells us the key is
* fine or bail out.
*****/
}
else
{
/* eeek, do cleanup here */
WLI("<%s>Error: libssh2_session_hostkey = [%d]\n",_FUN_,fingerprint);
throw logic_error("Fail libssh2_session_hostkey");
}
libssh2_knownhost_free(nh); if ( strlen(sPasswd.c_str()) != 0 )
{
/* We could authenticate via password */
while ((rc = libssh2_userauth_password(m_hSSHSession, sUser.c_str(), sPasswd.c_str())) ==LIBSSH2_ERROR_EAGAIN); if (rc)
{
WLI("<%s>Error: Authentication by password failed.\n",_FUN_,fingerprint);
throw logic_error("Fail libssh2_userauth_password");
}
}
else
{
/* Or by public key */
while ((rc = libssh2_userauth_publickey_fromfile(m_hSSHSession, sUser.c_str(),
"/home/user/"
".ssh/id_rsa.pub",
"/home/user/"
".ssh/id_rsa",
sPasswd.c_str())) ==
LIBSSH2_ERROR_EAGAIN);
if (rc)
{
WLI("<%s>Error: Authentication by public key failed.\n",_FUN_,fingerprint);
throw logic_error("Fail libssh2_userauth_password"); }
}
}
catch (logic_error &e)
{
WLE("<%s>Error: Desc[%s]\n",_FUN_,e.what()); return RET_FAIL;
}
return RET_OK;
} int CSSHClient::Logout()
{
char *exitsignal=(char *)"none";
int exitcode= 0 ;
int rc = 0; if(m_hSSHSession!=0)
{
libssh2_session_disconnect(m_hSSHSession,"Normal Shutdown, Thank you for playing");
libssh2_session_free(m_hSSHSession);
m_hSSHSession = NULL;
} if(m_nSSHSocket!=INVALID_SOCKET)
{
#ifdef WIN32
closesocket(m_nSSHSocket);
#else
close(m_nSSHSocket);
#endif
m_nSSHSocket = INVALID_SOCKET;
} return RET_OK;
}
int CSSHClient::ExecuteCommand(string commandline)
{
ENTER_FUN(CSSHClient::ExecuteCommand); if(m_hSSHSession==0)
{
WLE("<%s>Error: m_hSSHSession==0 commandline[%s]\n",_FUN_,commandline.c_str());
return RET_FAIL;
}
char *exitsignal=(char *)"none";
/* Exec non-blocking on the remove host */
while( (m_hSSHChannel = libssh2_channel_open_session(m_hSSHSession)) == NULL &&libssh2_session_last_error(m_hSSHSession,NULL,NULL,0) ==LIBSSH2_ERROR_EAGAIN )
{
WaitSocket(m_nSSHSocket, m_hSSHSession);
}
if( m_hSSHChannel == NULL )
{
WLI("<%s>Error: libssh2_channel_open_session [%d].\n",_FUN_,m_hSSHChannel);
//throw logic_error("Fail libssh2_channel_open_session");
return RET_FAIL;
} int bytecount = 0;
int rc = 0;
int exitcode = 0;
while( (rc = libssh2_channel_exec(m_hSSHChannel, commandline.c_str()))==LIBSSH2_ERROR_EAGAIN )
{
WaitSocket(m_nSSHSocket, m_hSSHSession);
}
for( ;; )
{
/* loop until we block */
int rc;
do
{
char buffer[0x4000];
rc = libssh2_channel_read( m_hSSHChannel, buffer, sizeof(buffer) );
if( rc > 0 )
{
int i;
bytecount += rc;
TRACE("We read:\n");
for( i=0; i < rc; ++i )
TRACE("%c",buffer[i]);
TRACE("\n");
}
else {
if( rc != LIBSSH2_ERROR_EAGAIN )
TRACE( "libssh2_channel_read returned %d\n", rc); }
}
while( rc > 0 ); /* this is due to blocking that would occur otherwise so we loop on
this condition */
if( rc == LIBSSH2_ERROR_EAGAIN )
{
WaitSocket(m_nSSHSocket, m_hSSHSession);
}
else
break;
} if(m_hSSHChannel!=0)
{//释放 Channel
while( (rc = libssh2_channel_close(m_hSSHChannel)) == LIBSSH2_ERROR_EAGAIN )WaitSocket(m_nSSHSocket, m_hSSHSession);
if( rc == 0 )
{
exitcode = libssh2_channel_get_exit_status( m_hSSHChannel );
libssh2_channel_get_exit_signal(m_hSSHChannel, &exitsignal,NULL, NULL, NULL, NULL, NULL);
}
if(m_hSSHChannel!=0)
libssh2_channel_free(m_hSSHChannel);
m_hSSHChannel = 0;
} if( rc != 0 )
{
WLI("<%s>Error: libssh2_channel_exec [%d].\n",_FUN_,rc);
return RET_FAIL;
} WLE("<%s> Info:Success sCommand[%s]\n",_FUN_,commandline.c_str());
return RET_OK;
} int CSSHClient::Init()
{
ENTER_FUN(CSSHClient::Init);
int rc = libssh2_init (0);
if (rc != 0)
{
WLI("<%s>Error: libssh2_init = [%d]\n",_FUN_,rc);
return RET_FAIL;
}
return RET_OK;
} int CSSHClient::ClearUp()
{
libssh2_exit();
return RET_OK;
}

对 linux server进行远程运行命令。能够通过 libss2 库进行。以下是 使用这个库的类的定义
</pre><pre name="code" class="cpp">


libssh2进行远程运行LINUX命令的更多相关文章

  1. php 运行linux命令 与 linux下命令行执行php

    1.php运行linux命令 exec函数:string exec(string command, string [array], int [return_var]);  执行函数后不输出结果,返回最 ...

  2. Windows下运行Linux命令

    安装Gow软件,Gow-0.7.0.exe,这样就可以在Windows命令行运行Linux命令,比如通过scp把Windows下的文件拷贝到Linux下. 直接运行安装,不会生成任何客户端,直接使用W ...

  3. 利用java实现可远程执行linux命令的小工具

    在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令.为了解决这个问题,写了个小工具来解决这个问题. 后面的代码是利用java实现的可远程执行linux命令的小工具,代 ...

  4. java运行Linux命令

    <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...

  5. 在windows cgywinportable上,通过运行linux命令,批量改动文件名。

    在windows cgywinportable上.通过运行linux命令.批量改动文件名. 实例:将当前文件夹下的全部文件名称加上.sql find ./ -type f -exec mv {}  ' ...

  6. 在Windows上远程运行Linux程序

    1.在Windows主机上安装X Server软件,如Cygwin带的XWin Server 2.在Windows主机上启动X服务器,并将Linux主机设为允许访问该Windows主机上的X服务器. ...

  7. 如何远程运行PowerShell命令?

    首先, 被remote运行PowerShell的windows必须已经join了domain. 其次, 该Windows的PowerShell必须开启对remote command的接受, 运行下面的 ...

  8. 如何在windows下运行Linux命令?(转载)

    在windows上可以运行或使用linux下面的命令吗?可以,小编今天就来分享怎么样让Windows支持Linux命令,做这些安装和设置后,就可以非常方便的在windows系统中使用linux下面的命 ...

  9. 在window的cmd窗口下运行linux命令

    之前看很多视频老师都是用Linux命令操作命令框,感觉很方便,自己在cmd窗口试了一下,所有这些命令都提示不是内部或外部命令,后来发现了windows还有一个powershell命令行工具,用起来似乎 ...

随机推荐

  1. JDBC连接ORACLE无法登陆java.sql.SQLException: ORA-01017: invalid username/password; logon denied

    当用jdbc连接Oracle数据库的时候 private Connection getConnection() throws SQLException { OracleDataSource ods = ...

  2. 紫书 习题 10-6 UVa 1210(前缀和)

    素数筛然后前缀和 看代码 #include<cstdio> #include<vector> #include<cstring> #include<map&g ...

  3. uva 1292 树形dp

    UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...

  4. generate the call load file

    #!/usr/bin/perl -w $e911_call_percent = 0.0; $ims_node_number = 12; $local_ip = "10.86.52.2&quo ...

  5. Gonet2 游戏server框架解析之gRPC提高(5)

    上一篇blog是关于gRPC框架的基本使用,假设说gRPC仅仅是远程发几个參数,那和一个普通的http请求也没多大区别了. 所以今天我就来学习一下gRPC高级一点的用法. 流! 流能够依据用法,分为单 ...

  6. TwinCAT 3中基于UDP协议通讯的C++实现

    因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识.这个做个简单的笔记,方便以后查询. 1 概述 倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函 ...

  7. Smart Pointer Guidelines

    For Developers‎ > ‎ Smart Pointer Guidelines What are smart pointers? Smart pointers are a specif ...

  8. Ubuntu源配置

    一.图形界面配置 新手推荐使用图形界面配置: 系统工具 -> 软件和更新-> Ubuntu软件-> 下载自:-> 其他站点  点击 选择最佳服务器(将通过连接测试确定最佳镜像) ...

  9. 对win2012 server 虚拟机hyper-V 硬盘管理,容量变更及新增硬盘

    目的:对win2012 server 虚拟机hyper-V 硬盘管理,容量变更及新增硬盘 一.压缩虚拟机硬盘容量 进入Server 2012的操作系统,打开CMD框,输入:diskmgmt.msc,回 ...

  10. 大吉大利,晚饭吃鸡!——accept关闭问题

    假期收尾了,学芽子们都军训了.一群张一山和周冬雨在校内晃晃悠悠,说起来春风十里也就军训比较有意思.对于我这种一年追一部剧的人,显然是有点对不住.在我假期任务即将圆满之际,我开始放慢脚步寻找生活的美妙时 ...