libssh2进行远程运行LINUX命令
/**
* 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命令的更多相关文章
- php 运行linux命令 与 linux下命令行执行php
1.php运行linux命令 exec函数:string exec(string command, string [array], int [return_var]); 执行函数后不输出结果,返回最 ...
- Windows下运行Linux命令
安装Gow软件,Gow-0.7.0.exe,这样就可以在Windows命令行运行Linux命令,比如通过scp把Windows下的文件拷贝到Linux下. 直接运行安装,不会生成任何客户端,直接使用W ...
- 利用java实现可远程执行linux命令的小工具
在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令.为了解决这个问题,写了个小工具来解决这个问题. 后面的代码是利用java实现的可远程执行linux命令的小工具,代 ...
- java运行Linux命令
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...
- 在windows cgywinportable上,通过运行linux命令,批量改动文件名。
在windows cgywinportable上.通过运行linux命令.批量改动文件名. 实例:将当前文件夹下的全部文件名称加上.sql find ./ -type f -exec mv {} ' ...
- 在Windows上远程运行Linux程序
1.在Windows主机上安装X Server软件,如Cygwin带的XWin Server 2.在Windows主机上启动X服务器,并将Linux主机设为允许访问该Windows主机上的X服务器. ...
- 如何远程运行PowerShell命令?
首先, 被remote运行PowerShell的windows必须已经join了domain. 其次, 该Windows的PowerShell必须开启对remote command的接受, 运行下面的 ...
- 如何在windows下运行Linux命令?(转载)
在windows上可以运行或使用linux下面的命令吗?可以,小编今天就来分享怎么样让Windows支持Linux命令,做这些安装和设置后,就可以非常方便的在windows系统中使用linux下面的命 ...
- 在window的cmd窗口下运行linux命令
之前看很多视频老师都是用Linux命令操作命令框,感觉很方便,自己在cmd窗口试了一下,所有这些命令都提示不是内部或外部命令,后来发现了windows还有一个powershell命令行工具,用起来似乎 ...
随机推荐
- Centos7(阿里云服务器)安装Anaconda的详细步骤与心得
在本地安装Anaconda的各个版本的文章已经很多,但是感觉不是很详细,因此,在此发发自己在Centos7(阿里云服务器)安装Anaconda的心得和步骤: 注:需要注意的地方会用不同颜色区别. 1. ...
- SCU 1095运送物资(最短路)
SCU 1095运送物资(最短路) X国发生了内战.起义军得到了广大人民的支持.在一次战役中,反动军队结集了大量兵力,围攻起义军的主堡W城.为支援前线,后方各个供给基地城市纷纷准备将物资运往W城.各基 ...
- 钩子(hooks)—webhook-使用钩子自动触发部署
钩子(hooks)-webhook http://fighter.blog.51cto.com/1318618/1670667 https://www.lovelucy.info/auto-deplo ...
- C# DataTable中按字符串中的数字排序
例如datatable中有一列是门牌号格式是xx-xx-xx,或字符串中含有汉字或其他符号等等,如何按照正确的数字顺序排序呢? 1.获得字符串中的数字. 2.在datatable中添加一列,类型是In ...
- Android Studio更改项目SDK的版本
Elipse 中的安卓项目,在Android Studio中可以通过File -->new -- > Import Project的方法建立起来.但是有时候需要用到更改项目的API Lev ...
- UnrealEngine4编码风格的思考
第一次拿到UE4源码,扫了一遍.各种宏定义,各种模板,各种类层次.杂乱无章. 后来慢慢明确其规律: UE4的编码风格是在匈牙利命名法的基础下做了改进,使其更适用游戏引擎业务(业务特点:数据可视编辑.脚 ...
- Fragment的实际开发中总结(二)
在实际项目的开发过程Fragment的情况越来越多.大家肯定须要遇到过Fragment被销毁重建的情况. 结合自己在项目开发的一点总结和学习开源项目的代码.继续分享自己对Fragment的一点总结. ...
- nyoj 1104 just for you
just for you 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描写叙述 今天tlp和ly想去看电影了到了电影院才发现买票的人特别多 .ly不想让tlp等着急了,就先 ...
- php中局部变量和全局变量
php中局部变量和全局变量 代码1:函数内部使用函数外部变量错误方法 <?php $name = 'fish'; function animal() { echo $name; } animal ...
- OPENCV(6) —— 角点检测
图像特征的类型通常指边界.角点(兴趣点).斑点(兴趣区域).角点就是图像的一个局部特征,应用广泛.harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高,但由于采 ...