libssh2--ssh2实例
#include "libssh2_config.h"
#include<libssh2.h>
#include<libssh2_sftp.h>
上述为所包含必备头文件。
以下为定义的静态子串常量
const char *keyfile1 = "~/.ssh/id_rsa.pub";
const char *keyfile2 = "~/.ssh/id_rsa";
const char *username = "username";
const char *password = "password";
unsigned long hostaddr;
int rc, sock, i, auth_pw = ;
struct sockaddr_in_sin;
const char *fingerprint;
char * userauthlist;
LIBSSH2_SESSION *session;
LIBSSH2_CHANNEL *channel;
连接到SSH2步骤:
(1)建立socket并连接到远程主机SSH2服务(22端口);
(2)创建一个LIBSSH2_SESSION 实例并启动它。启动动作包括设置欢迎横幅、交换密钥并且设置加密、压缩和MAC层。
session = libssh2_session_init(); //创建一个会话实例
if(libssh2_session_handshake(session, sock))
{
fprintf(stderr, "Failure establishing SSH session");
return -;
}
(3)认证:检查主机密钥指纹并检查可用的认证方式。
fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
userauthlist = libssh2_userauth_list(session, username, strlen(username));
if(strstr(userauthlist, "password") != NULL)
{
auth_pw |= ;
}
if(strstr(userauthlist, "keyboad-interactive") != NULL)
{
auth_pw |= ;
}
if(strstr(userauthlist, "publickey") != NULL)
{
auth_pw |= ;
}
(4)如果在参数列表中设置了认证方式,则将认证方式设为命令中的方式(前提是该方式是通过上个步骤检测可用的)。
if(argc > )
{
if((auth_pw & ) && !strcasecmp(argv[], "-p"))
{
auth_pw = ;
}
if((auth_pw & ) && !strcasecmp(argv[], "-i"))
{
auth_pw = ;
}
if((auth_pw && ) && !strcasecmp(argv[], "-k"))
{
auth_pw = ;
}
}
(5)根据上一步选定的认证方式开始认证。
if (auth_pw & ) {
/* We could authenticate via password */
if (libssh2_userauth_password(session, username, password)) {
fprintf(stderr, "\tAuthentication by password failed!\n");
goto shutdown;
} else {
fprintf(stderr, "\tAuthentication by password succeeded.\n");
}
} else if (auth_pw & ) {
/* Or via keyboard-interactive */
if (libssh2_userauth_keyboard_interactive(session, username,
&kbd_callback) ) {
fprintf(stderr,
"\tAuthentication by keyboard-interactive failed!\n");
goto shutdown;
} else {
fprintf(stderr,
"\tAuthentication by keyboard-interactive succeeded.\n");
}
} else if (auth_pw & ) {
/* Or by public key */
if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,
keyfile2, password)) {
fprintf(stderr, "\tAuthentication by public key failed!\n");
goto shutdown;
} else {
fprintf(stderr, "\tAuthentication by public key succeeded.\n");
}
} else {
fprintf(stderr, "No supported authentication methods found!\n");
goto shutdown;
}
(6)请求一个shell
if(!(channel = libssh2_channel_open_session(session)))
(7)设置一些环境变量,并上传给服务器
libssh2_channel_setenv(channel, "F00", "bar");
(8)请求一个vanilla的终端模拟。
libssh2_channel_request_pty(channel, "vanilla")
(9)在上一步请求的pty上开启SHELL。
libssh2_channel_shell(channel)
(10)至此,可以交互使用shell了
libssh2_channel_read();
libssh2_channel_read_stderr();
libssh2_channel_write(); libssh2_channel_write_stderr(); /* 打开或关闭阻塞模式 */ libssh2_channel_set_blocking(); /* 如果服务器发送EOF */ libssh2_channel_eof()返回非0; /* 关闭channel */ libssh2_channel_close(); /* 释放一个channel */ libssh2_channel_free();
(11)ssh交互完成后,关闭会话并释放会话
libssh2_session_disconnect(session, "Normal Shutdown");
libssh2_session_free(session);
(12)关闭sock并退出libssh2
close(sock);
libssh2_exit();
libssh2--ssh2实例的更多相关文章
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- 使用libssh2库实现支持密码参数的ssh2客户端
使用libssh2库实现支持密码参数的ssh2客户端 http://blog.chinaunix.net/uid-24382173-id-229823.html libssh2的简单应用 http:/ ...
- SSH2框架实现注冊发短信验证码实例
这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...
- SSH2 增删查改实例
(一)引入包 (共73个,不一定都需要,但是我的项目是这么多,经过调试,没有包冲突) (二)创建数据库表 建立数据库octtest,并创建user表,表里面一共4个字段:id,姓,名,年龄. 语句如下 ...
- Windows VS2017 编译 libssh2 1.7.0(执行命令、文件上传、下载)
下载安装 OpenSSL 要编译 libssh2,必须先编译好 OpenSSL 的静态库,直接从 http://slproweb.com/products/Win32OpenSSL.html 下载已经 ...
- 使用mapreduce计算环比的实例
最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...
- libssh2 的集成与应用
http://blog.csdn.net/wyc6668205/article/details/9179197 Xmanager Enterprise 4 putty 等工具都功能都是利用libssh ...
- SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》
这篇文章比较易懂,易理解: 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层W ...
- SSH框架总结(框架分析+环境搭建+实例源码下载)
来源于: http://blog.csdn.net/shan9liang/article/details/8803989 首先,SSH不是一个框架,而是多个框架(struts+spring+hiber ...
随机推荐
- spark osx:WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform
spark-env.sh文件中增加,确保${HADOOP_HOME}/lib/native目录下有libhadoop.so文件 export JAVA_LIBRARY_PATH=${HADOOP_HO ...
- Mysql开启审计功能
第一种经验证,有效. 第一种用macfee的mysql审计插件. 下载地址:https://bintray.com/mcafee/mysql-audit-plugin/release/1.1.4-72 ...
- 【ARTS】01_36_左耳听风-201900715~201900721
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【c# 学习笔记】面向对象编程的应用
在平时的开发过程中,面向对象编程的应用肯定必不可少.但前面的内容只是单独介绍了类.面向对象思想和接口,那么我们怎么在平时工作中来应用他们来实现面向对象编程呢? 如果你想设计一个Dog类,有了类的概念后 ...
- golang 日志模块(log)
log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...
- Xena L23网络测试仪Valkyrie使用技巧100例:修改设备管理IP,设备关机 (编号01)
Xena Valkyrie产品提供100M~400Gbps全速率接口速率支持 产品链接 https://xenanetworks.com/valkyrie/ 需求# 1.多个用户如何共享使用一个机箱? ...
- 查询父节点parentNode
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOCTYPE htm ...
- 关于AES加密,以及各种分组加密
http://blog.csdn.net/searchsun/article/details/2516191
- [转帖]新手必读,16个概念入门 Kubernetes
新手必读,16个概念入门 Kubernetes https://www.kubernetes.org.cn/5906.html 2019-09-29 22:13 中文社区 分类:Kubernetes教 ...
- ajax与jsonp中的几个封装函数
首先是ajax里的get 在页面上添加几个标签用作测试 <body> <input type="text" id="user"> < ...