文档章节

使用 libssh 编写 client

for_
 for_
发布于 2016/02/26 22:10
字数 626
阅读 359
收藏 6

1. 使用 libssh 编写客户端程序

#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h> 

int verify_knownhost(ssh_session session);
char *getpass(const char *str);
int show_remote_processes(ssh_session session);

int main()
{
    ssh_session     my_ssh_session;
    //int             verbosity = SSH_LOG_PROTOCOL;
    int             port = 22;
    int             rc;
    char           *password;

    /* Creating the session and setting options */
    my_ssh_session = ssh_new();
    if (my_ssh_session == NULL) {
        exit(-1);
    }

    ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
    //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "likui");

    /* Connecting to the server */
    rc = ssh_connect(my_ssh_session);
    if (rc != SSH_OK) {
        fprintf(stderr, "Error connecting to localhost: %s\n",
                ssh_get_error(my_ssh_session));
        ssh_free(my_ssh_session);
        exit(-1);
    }

    /* Authenticating the server */
    if (verify_knownhost(my_ssh_session) < 0) {
        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
        exit(-1);
    }

    /* Authenticate ourselves */
    password = getpass("Password: ");
    rc = ssh_userauth_password(my_ssh_session, NULL, password);
    if (rc != SSH_AUTH_SUCCESS) {
        fprintf(stderr, "Error authenticating with password: %s\n",
                ssh_get_error(my_ssh_session));
        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
        exit(-1);
    }


    /************************/
    fprintf(stderr, "connect success!\n");

    show_remote_processes(my_ssh_session);

    /************************/

    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);

    exit(0);
}

char *getpass(const char *str)
{
    static char password[64];
    int         index;

    fprintf(stdout, "%s", str);
    if (fgets(password, sizeof(password), stdin) == NULL) {
        fprintf(stderr, "fgets error\n");
        return NULL;
    }
    
    index = strlen(password) - 1;
    if (password[index] == '\n') {
        password[index] = '\0';
    }
    
    return password;
}

/* Authenticating the server */
int verify_knownhost(ssh_session session)
{
    int             state, hlen;
    unsigned char  *hash = NULL;
    char           *hexa;
    char            buf[10];

    /* look into the known host file */
    state = ssh_is_server_known(session);

    /* get a binary version of the public key hash value */
    hlen = ssh_get_pubkey_hash(session, &hash);
    if (hlen < 0)
        return -1;

    switch(state) {
        case SSH_SERVER_KNOWN_OK:
            break;

        case SSH_SERVER_KNOWN_CHANGED:
            fprintf(stderr, "Host key for server changed: it is now:\n");
            ssh_print_hexa("Public key hash", hash, hlen);
            fprintf(stderr, "For security reasons, connection will be stopped\n");
            free(hash);
            return -1;

        case SSH_SERVER_FOUND_OTHER:
            fprintf(stderr, "The host key for this server was not found but an other"
                    "type of key exists.\n");
            fprintf(stderr, "An attacker might change the default server key to"
                    "confuse your client into thinking the key does not exist\n");
            free(hash);
            return -1;

        case SSH_SERVER_FILE_NOT_FOUND:
            fprintf(stderr, "Could not find known host file.\n");
            fprintf(stderr, "If you accept the host key here, the file will be"
                    "automatically created.\n");
            /* fallback to SSH_SERVER_NOT_KNOWN */

        case SSH_SERVER_NOT_KNOWN:
            /* Convert a buffer into a colon separated hex string */
            hexa = ssh_get_hexa(hash, hlen);
            fprintf(stderr, "The server is unknown. Do you trust the host key?\n");
            fprintf(stderr, "Public key hash: %s\n", hexa);
            free(hexa);

            if (fgets(buf, sizeof(buf), stdin) == NULL) {
                free(hash);
                return -1;
            }

            if (strncasecmp(buf, "yes", 3) != 0) {
                free(hash);
                return -1;
            }

            /* register it in the known hosts file */
            if (ssh_write_knownhost(session) < 0) {
                fprintf(stderr, "Error %s\n", strerror(errno));
                free(hash);
                return -1;
            }
            break;

        case SSH_SERVER_ERROR:
            fprintf(stderr, "Error %s",ssh_get_error(session));
            free(hash);
            return -1;
    }

    free(hash);
    return 0;
}

int show_remote_processes(ssh_session session)
{
    ssh_channel channel;
    int         rc;
    char        buffer[256];
    int         nbytes;

    /* Allocate a new channel */
    channel = ssh_channel_new(session);
    if (channel == NULL) {
        return SSH_ERROR;
    }

    /* Open session channel */
    rc = ssh_channel_open_session(channel);
    if (rc != SSH_OK) {
        ssh_channel_free(channel);
        return rc;
    }

    /* Run a shell command without an interactive shell */
    rc = ssh_channel_request_exec(channel, "pwd");
    if (rc != SSH_OK) {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return rc;
    }
    
    /* Reads data from a channel */
    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    while (nbytes > 0) {
        if (write(1, buffer, nbytes) != (unsigned int)nbytes) {
            ssh_channel_close(channel);
            ssh_channel_free(channel);
            return SSH_ERROR;
        }
        nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    }

    if (nbytes < 0) {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return SSH_ERROR;
    }

    /* Send an end of file on the channel */
    ssh_channel_send_eof(channel);
    /* Close a channel */
    ssh_channel_close(channel);
    /* Close and free a channel */
    ssh_channel_free(channel);

    return SSH_OK;
}

2. 编译

gcc client.c -o client -Wall -lssh

参考资料

http://api.libssh.org/master/libssh_tutorial.html

http://blog.csdn.net/vevenlcf/article/details/43273457

 

 

© 著作权归作者所有

for_

for_

粉丝 91
博文 47
码字总数 18257
作品 0
深圳
程序员
私信 提问
对libssh的golang 封装--ssh2go

ssh2go 是对libssh的go语言绑定。libssh作为ssh的实现库,支持SSHv2和SSHv1的客户、服务端实现,通过libssh你可以远程执行程序、拷贝文件等等。 ssh2go不像其他go语言对ssh简单封装(实则调用...

MrCode
2016/04/22
834
0
ssh2go: 将sshd纯C实现装入你的go程序

ssh2go 是对libssh的go语言绑定。libssh作为ssh的实现库,支持SSHv2和SSHv1的客户、服务端实现,通过libssh你可以远程执行程序、拷贝文件等等。 ssh2go不像其他go语言对ssh简单封装(实则调用...

MrCode
2016/04/25
0
0
libssh编写服务端应用

怎么用libssh编写服务端应用,自己找了很久也没有找到相关的资料,请大神给指点,非常感谢!

小朴
2015/05/19
284
1
Linux 下安装sogou输入法

最近闲来无事玩耍下Ubuntu ,首先安装完毕系统之后开始安装输入法和设置系统语言,这里系统更改语言不建议,如果不做开发无所谓,做开发还是英语状态比较好, 下面就是如何正确安装搜狗输入法...

Remix_jx
2016/07/04
58
0
Pylibssh2

Pylibssh2 是 libssh2 的 Python 移植版本。 Pylibssh2 is a C extension module to provide a high level python API. The libssh2 API is fairy well respected and exported into a Pyth......

匿名
2011/07/23
534
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
20分钟前
2
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部