使用libssh2建立安全的SSH连接:C++开发者的综合指南

使用libssh2建立安全的SSH连接:C++开发者的综合指南
  • 一、介绍
  • 二、准备工作
  • 三、建立SSH连接
  • * 3.1、初始化libssh2库
    
    • 3.2、连接到远程主机
    • 3.4、完整示例
  • 四、文件传输
  • * 4.1、上传文件到远程主机
    
    • 4.2、下载文件到本地主机
  • 五、总结

一、介绍

SSH和安全连接的重要性是不可忽视的。在今天的互联网环境中,保护敏感数据和网络通信的安全至关重要。

  1. 通过使用SSH建立安全连接,可以确保数据在传输过程中是加密的。这意味着即使在网络上拦截到数据包,攻击者也无法读取其内容。

  2. SSH提供了多种身份验证方法,如密码验证、公钥验证和证书验证。这些方法可以防止未经授权的用户访问远程系统,并确保只有合法用户能够建立连接。

  3. SSH使用了公钥加密来验证服务器的身份,从而防止中间人攻击。所以用户可以确认他们连接到的是真实的服务器,而不是一个恶意的第三方。

  4. SSH还提供了数据完整性检查,通过使用消息认证码(MAC)来验证数据在传输过程中是否被篡改。这确保了数据在传输过程中的完整性。

  5. SSH是一种被广泛接受和使用的安全协议,它有一系列的安全性标准和最佳实践。使用SSH可以确保连接符合这些标准,并提供可靠的安全性。

libssh2是一个用于C/C++开发的开源库,用于实现SSH客户端和服务器的功能。它提供了一组API,使开发者能够使用SSH协议建立安全连接,并进行远程命令执行、文件传输等操作。

  1. libssh2提供了广泛的功能,包括SSH2协议的各种认证方法(如密码、公钥、证书等),支持远程命令执行和文件传输,以及对SSH会话和通道的管理。

  2. libssh2可在多个操作系统上运行,包括Windows、Linux、macOS等。这使得开发者可以将其应用于各种环境和项目中。

  3. libssh2的API设计简洁明了,易于集成到现有的C/C++代码中。它提供了一致的接口,使开发者能够方便地使用SSH功能,而无需深入了解SSH协议的复杂细节。

  4. libssh2是一个开源项目,拥有活跃的社区支持。这意味着开发者可以自由地访问源代码、提出问题、报告错误,并参与项目的开发和改进。

通过使用libssh2,可以轻松地构建安全的SSH客户端和服务器应用程序,实现远程管理、自动化任务执行等功能。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/direct/3eb4fde1271e4e249c54b204f77b8eba.png)

二、准备工作

安装和配置libssh2:

  1. 下载libssh2:从libssh2的官方网站(https://www.libssh2.org)或源代码存储库下载最新版本的libssh2库。

  2. 安装依赖项:在安装libssh2之前,请确保系统中已安装了必要的依赖项,如libcrypto、libssl和zlib等库。可以使用操作系统的包管理器来安装它们。例如,在Ubuntu上,可以运行以下命令安装所需的依赖项:

    sudo apt-get install libssl-dev zlib1g-dev

```
  1. 解压并编译:解压下载的libssh2源代码,并进入解压后的目录。然后运行以下命令来编译源代码:

    ./configure
    make

如果使用的是Windows,可以使用CMake来生成适合的编译环境的解决方案文件。

  1. 安装库文件:编译成功后,运行以下命令将生成的库文件安装到系统中:

    sudo make install

  2. 配置开发环境:在C/C++项目中配置开发环境以使用libssh2。这包括设置编译器选项和链接库文件。以下是一个简单的示例编译命令:

    gcc -o my_program my_program.c -lssh2

SSH密钥和身份验证是在SSH(Secure Shell)协议中用于安全身份验证的关键概念。

SSH密钥:SSH密钥是一对由公钥和私钥组成的加密密钥。公钥用于加密数据,而私钥用于解密数据。在SSH身份验证中,用户将公钥保存在服务器上,而私钥保留在本地。当用户尝试连接到服务器时,服务器会向其发送一个加密的随机挑战,用户使用私钥对其进行解密,并将解密后的挑战发送回服务器以验证身份。SSH密钥的优势在于其安全性和便捷性,因为私钥通常受到密码保护,并且可以在多个系统之间共享而无需传输密码。

身份验证方法:SSH支持多种身份验证方法,包括密码身份验证、公钥身份验证和基于主机的身份验证。

  • 密码身份验证:用户通过输入密码进行身份验证。这是最常见的身份验证方法,但也是最不安全的,因为密码可能会被猜测或破解。

  • 公钥身份验证:使用SSH密钥进行身份验证。用户将公钥添加到其帐户的授权密钥列表中,然后在连接时,服务器将检查用户提供的私钥是否与其帐户中的公钥匹配。这种方法安全性较高,因为私钥通常受到密码保护,并且不会在网络上传输密码。

  • 基于主机的身份验证:在主机级别进行身份验证,而不是用户级别。服务器和客户端之间会交换密钥,并在连接过程中使用这些密钥进行身份验证。这种方法可以用于验证服务器的身份,并提供额外的安全性。

通过使用SSH密钥和身份验证方法,用户可以实现更强大的安全性和身份验证控制,以保护远程连接和数据传输。

注意:具体的SSH配置和身份验证方法可能因操作系统、SSH服务器软件和安全策略而有所不同。

三、建立SSH连接

3.1、初始化libssh2库

  1. 包含必要的头文件:在C/C++代码中,包含libssh2的头文件。在源文件的开头添加以下行:
#include <libssh2.h>
  1. 初始化库:在使用任何libssh2函数之前,需要通过调用libssh2_init()函数来初始化库。该函数初始化底层资源并设置库以进行后续操作。
    函数原型如下:
int libssh2_init(int flags);

该函数接受一个整数参数flags,用于指定初始化的选项。

  • flags:用于指定初始化选项的整数值。通常,可以将其设置为0,表示使用默认的初始化选项,或者LIBSSH2_INIT_NO_CRYPTO(0x0001)表示不初始化crypto库。。

libssh2_init函数在使用libssh2库之前调用,用于初始化库的状态和资源。调用该函数将为libssh2库分配和设置所需的内存,并在成功时返回0,表示初始化成功。如果出现错误或初始化失败,函数将返回一个负值,其中的错误代码用于指示具体的初始化错误。

以下是一个示例,展示如何使用libssh2_init函数进行libssh2库的初始化:

int rc = libssh2_init(0);
if (rc != 0) {
    // 初始化失败,处理错误
    // ...
}

注意:libssh2_init函数只需要在应用程序启动时调用一次,用于初始化libssh2库。在使用libssh2的其他功能之前,不需要多次调用该函数。

  1. 执行所需操作:一旦库被初始化,就可以继续使用libssh2函数执行与SSH有关的操作。这可以包括建立SSH连接、验证用户身份、执行远程命令、传输文件等。可查阅libssh2文档以及相关函数说明文档

  2. 清理资源:在使用完libssh2库后,使用libssh2_exit()函数清理分配的资源是很重要的。

libssh2_exit();

这个函数释放库使用的任何资源,并进行必要的清理操作。

3.2、连接到远程主机

  1. 创建SSH会话:首先,需要创建一个libssh2会话(session)对象,用于维护连接和通信。可以使用libssh2_session_init()libssh2_session_init_ex()函数来初始化会话对象,并设置必要的参数。

    LIBSSH2_SESSION *session;
    session = libssh2_session_init_ex(NULL, NULL, NULL, NULL);
    if (session == NULL) {
    // 初始化会话失败,处理错误
    // …
    }

libssh2_session_init函数:

LIBSSH2_SESSION *libssh2_session_init(void);

该函数用于创建一个libssh2会话对象,并返回指向该对象的指针。它没有接受任何参数,并在创建成功时返回一个非空指针,否则返回NULL。

使用libssh2_session_init时,使用会话的默认选项,可以调用libssh2_session_set_timeout函数设置超时时间,或者使用libssh2_knownhost_readline函数加载已知主机列表。

libssh2_session_init_ex函数:

LIBSSH2_SESSION *libssh2_session_init_ex(
    libssh2_malloc_func malloc_func,
    libssh2_free_func free_func,
    libssh2_realloc_func realloc_func,
    void *abstract
);

该函数也用于创建libssh2会话对象,并返回指向该对象的指针。与libssh2_session_init不同的是,libssh2_session_init_ex允许传递一些额外的参数来指定自定义的内存管理函数和抽象指针。

  • malloc_func参数是用于申请内存的自定义函数的指针。你可以传递自己实现的malloc函数,或使用默认的malloc函数。
  • free_func参数是用于释放内存的自定义函数的指针。你可以传递自己实现的free函数,或使用默认的free函数。
  • realloc_func参数是用于重新分配内存的自定义函数的指针。你可以传递自己实现的realloc函数,或使用默认的realloc函数。
  • abstract参数是一个抽象指针,你可以将其用于传递上下文或与内存管理函数一起使用。

使用libssh2_session_init_ex可以根据需求自定义内存管理,以便更好地集成libssh2库到自己的应用程序中。

  1. 设置会话参数:可以使用libssh2_session_set_blocking()函数来设置会话的阻塞(blocking)或非阻塞(non-blocking)模式。阻塞模式意味着函数会一直等待操作完成,而非阻塞模式允许在等待时执行其他任务。

    libssh2_session_set_blocking(session, 1); // 阻塞模式
    // 或
    libssh2_session_set_blocking(session, 0); // 非阻塞模式

libssh2_session_set_blocking是libssh2库中的一个函数,用于设置SSH会话的阻塞模式。它的函数签名如下:

void libssh2_session_set_blocking(LIBSSH2_SESSION *session, int blocking);

该函数接受一个指向LIBSSH2_SESSION会话对象的指针和一个整数参数,用于指定阻塞模式。下面是对这两个参数的解释:

  • session:指向已创建的SSH会话对象的指针。
  • blocking:用于设置阻塞模式的整数值。当传入参数为0时,会话进入非阻塞模式;传入参数为非零值时,会话进入阻塞模式。

在阻塞模式下,调用 libssh2
函数时,如果所请求的操作没有立即完成,函数将一直阻塞(即处于等待状态)直到操作完成或超时。这意味着程序在等待操作完成时会暂停执行,直到收到响应或操作完成。

在非阻塞模式下,调用 libssh2
函数时,不会等待操作完成。如果调用一个可能阻塞的操作,函数会立即返回,并根据情况提供适当的错误代码或状态。在非阻塞模式下可以使用独立的方式监控和管理多个会话。

  1. 建立连接:使用libssh2_session_startup()函数来建立与远程主机的连接。在此之前,需要通过libssh2_session_handshake()函数进行会话握手。函数原型:
int libssh2_session_handshake(LIBSSH2_SESSION *session, LIBSSH2_SOCKET sock);

该函数接受两个参数:

  • session:一个指向已创建的SSH会话的指针。
  • sock:与远程主机通信的套接字。

libssh2_session_handshake()函数用于在SSH会话中进行握手操作,它执行以下任务:

  • 启动SSH协议版本交换。
  • 协商加密、认证和其他安全参数。
  • 使用密钥交换算法协商会话密钥。
  • 验证远程主机的主机密钥。

函数返回值:

  • 成功握手时,返回值为0。
  • 当需要进一步读取或写入套接字数据时,返回LIBSSH2_ERROR_EAGAIN。
  • 在握手过程中发生错误时,返回负值,表示错误的错误代码。

函数调用示例:

int rc = libssh2_session_handshake(session, sock);
if (rc == 0) {
    // 握手成功,可以继续进行其他操作
} else if (rc == LIBSSH2_ERROR_EAGAIN) {
    // 需要进一步读取或写入套接字数据
} else {
    // 握手失败,处理错误
}

在使用libssh2库进行SSH连接时,一般会在创建SSH会话后立即调用libssh2_session_handshake()函数进行握手操作。握手成功后,就可以继续使用libssh2库提供的其他函数执行各种SSH操作,如执行命令、传输文件等。

  1. 身份验证:完成连接后,需要使用合适的身份验证方法对客户端进行身份验证。常见的身份验证方法包括密码、公钥和证书认证。可以使用相关函数,如libssh2_userauth_password()libssh2_userauth_publickey_fromfile()等来进行身份验证。

    // 例如,使用密码进行身份验证
    int rc = libssh2_userauth_password(session, username, password);
    if (rc != 0) {
    // 身份验证失败,处理错误
    // …
    }

  2. 执行操作:完成身份验证后,可以执行远程命令、进行文件传输等操作。根据需求,使用相应的libssh2函数,如libssh2_channel_exec()等来执行操作。

    LIBSSH2_CHANNEL *channel;
    channel = libssh2_channel_open_session(session);
    if (channel == NULL) {
    // 打开会话通道失败,处理错误
    // …
    }

int rc = libssh2_channel_exec(channel, command);
if (rc != 0) {
    // 远程命令执行失败,处理错误
    // ...
}

其中的command可以是要执行的远程命令。

  1. 断开连接和清理:完成所有操作后,需要断开与远程主机的连接,并进行必要的清理操作。使用libssh2_session_disconnect()函数和libssh2_session_free()函数来断开连接并释放会话资源。

    libssh2_session_disconnect(session, “Goodbye”);
    libssh2_session_free(session);

3.4、完整示例

下面是一个使用libssh2连接到远程主机的完整示例:

#include <stdio.h>
#include <stdlib.h>
#include <libssh2.h>

int main()
{
    // 初始化libssh2库
    int rc = libssh2_init(0);
    if (rc != 0) {
        fprintf(stderr, "Failed to initialize libssh2. Error code %d
", rc);
        return 1;
    }

    // 创建SSH会话
    LIBSSH2_SESSION *session;
    session = libssh2_session_init();
    if (session == NULL) {
        fprintf(stderr, "Failed to create session
");
        return 1;
    }

    // 设置会话阻塞模式
    libssh2_session_set_blocking(session, 1);

    // 建立连接
    const char *hostname = "REMOTE_HOST";
    const int port = 22;
    const char *username = "REMOTE_USERNAME";
    const char *password = "REMOTE_PASSWORD";
    int socket = socket_connect(hostname, port); // 自定义函数,用于建立socket连接
    if (socket < 0) {
        fprintf(stderr, "Failed to connect to the remote host
");
        return 1;
    }

    rc = libssh2_session_handshake(session, socket);
    if (rc != 0) {
        fprintf(stderr, "Session handshake failed
");
        return 1;
    }

    rc = libssh2_userauth_password(session, username, password);
    if (rc != 0) {
        fprintf(stderr, "Authentication failed
");
        return 1;
    }

    // 执行远程命令
    LIBSSH2_CHANNEL *channel = libssh2_channel_open_session(session);
    if (channel == NULL) {
        fprintf(stderr, "Failed to open a channel
");
        return 1;
    }

    rc = libssh2_channel_exec(channel, "REMOTE_COMMAND");
    if (rc != 0) {
        fprintf(stderr, "Failed to execute remote command
");
        return 1;
    }

    // 读取并打印远程命令输出
    char buffer[1024];
    int nbytes;
    while ((nbytes = libssh2_channel_read(channel, buffer, sizeof(buffer) - 1)) > 0) {
        buffer[nbytes] = '\0';
        printf("%s", buffer);
    }

    // 断开连接和清理
    libssh2_channel_close(channel);
    libssh2_channel_free(channel);
    libssh2_session_disconnect(session, "Goodbye");
    libssh2_session_free(session);
    libssh2_exit();

    return 0;
}

四、文件传输

4.1、上传文件到远程主机

要使用libssh2上传文件到远程主机,按照以下步骤进行操作:

  1. 引入libssh2库,在代码中引入相关的头文件。

  2. 与远程主机建立SSH连接。

  3. 在建立SSH连接后,使用libssh2_sftp_init函数打开一个SFTP会话。

  4. 使用libssh2_sftp_open函数打开本地文件和远程文件。

  5. 使用libssh2_sftp_readlibssh2_sftp_write函数从本地文件读取数据并写入远程文件,实现文件的传输。

  6. 使用libssh2_sftp_close函数关闭本地文件和远程文件,然后使用libssh2_sftp_shutdown函数关闭SFTP会话。

  7. 最后,使用libssh2_session_disconnectlibssh2_session_free函数断开SSH连接,并释放相关资源。

以下是一个简单的C++代码示例:

#include <iostream>
#include <libssh2.h>
#include <libssh2_sftp.h>

int main() {
    // 初始化libssh2库
    int rc = libssh2_init(0);
    if (rc != 0) {
        std::cerr << "Failed to initialize libssh2. Error code: " << rc << std::endl;
        return 1;
    }

    // 建立SSH连接
    LIBSSH2_SESSION* session = libssh2_session_init();
    if (!session) {
        std::cerr << "Failed to create SSH session." << std::endl;
        return 1;
    }

    // 设置远程主机的IP地址和端口号
    const char* ip = "remote_host_ip";
    int port = 22;

    // 连接远程主机
    rc = libssh2_session_startup(session, socket);
    if (rc != 0) {
        std::cerr << "Failed to establish SSH connection. Error code: " << rc << std::endl;
        return 1;
    }

    // 进行身份验证(用户名和密码)
    const char* username = "your_username";
    const char* password = "your_password";
    rc = libssh2_userauth_password(session, username, password);
    if (rc != 0) {
        std::cerr << "Failed to authenticate. Error code: " << rc << std::endl;
        return 1;
    }

    // 打开SFTP会话
    LIBSSH2_SFTP* sftp_session = libssh2_sftp_init(session);
    if (!sftp_session) {
        std::cerr << "Failed to initialize SFTP session." << std::endl;
        return 1;
    }

    // 打开本地文件
    const char* local_file = "path_to_local_file";
    FILE* local_file_handle = fopen(local_file, "rb");
    if (!local_file_handle) {
        std::cerr << "Failed to open local file: " << local_file << std::endl;
        return 1;
    }

    // 打开远程文件
    const char* remote_file = "path_to_remote_file";
    LIBSSH2_SFTP_HANDLE* sftp_handle = libssh2_sftp_open(sftp_session, remote_file,
                                                        LIBSSH2_FXF_WRITE | LIBSSH2_FXF_CREAT | LIBSSH2_FXF_TRUNC,
                                                        LIBSSH2_SFTP_S_IRUSR | LIBSSH2_SFTP_S_IWUSR | LIBSSH2_SFTP_S_IRGRP | LIBSSH2_SFTP_S_IROTH);
    if (!sftp_handle) {
        std::cerr << "Failed to open remote file: " << remote_file << std::endl;
        return 1;
    }

    // 传输文件内容
    char buffer[1024];
    size_t bytes_read;
    ssize_t bytes_written;
    while ((bytes_read = fread(buffer, 1, sizeof(buffer), local_file_handle)) > 0) {
        bytes_written = libssh2_sftp_write(sftp_handle, buffer, bytes_read);
        if (bytes_written != bytes_read) {
            std::cerr << "Failed to write to remote file." << std::endl;
            return 1;
        }
    }

    // 关闭本地文件和远程文件
    fclose(local_file_handle);
    libssh2_sftp_close(sftp_handle);

    // 关闭SFTP会话和SSH连接
    libssh2_sftp_shutdown(sftp_session);
    libssh2_session_disconnect(session, "Goodbye");
    libssh2_session_free(session);

    // 清理libssh2库
    libssh2_exit();
    
    return 0;
}

4.2、下载文件到本地主机

一个简单的C++代码示例:

#include <iostream>
#include <libssh2.h>
#include <libssh2_sftp.h>

int main() {
    // 初始化libssh2库
    int rc = libssh2_init(0);
    if (rc != 0) {
        std::cerr << "Failed to initialize libssh2. Error code: " << rc << std::endl;
        return 1;
    }

    // 建立SSH连接
    LIBSSH2_SESSION* session = libssh2_session_init();
    if (!session) {
        std::cerr << "Failed to create SSH session." << std::endl;
        return 1;
    }

    // 设置远程主机的IP地址和端口号
    const char* ip = "remote_host_ip";
    int port = 22;

    // 连接远程主机
    rc = libssh2_session_startup(session, socket);
    if (rc != 0) {
        std::cerr << "Failed to establish SSH connection. Error code: " << rc << std::endl;
        return 1;
    }

    // 进行身份验证(用户名和密码)
    const char* username = "your_username";
    const char* password = "your_password";
    rc = libssh2_userauth_password(session, username, password);
    if (rc != 0) {
        std::cerr << "Failed to authenticate. Error code: " << rc << std::endl;
        return 1;
    }

    // 打开SFTP会话
    LIBSSH2_SFTP* sftp_session = libssh2_sftp_init(session);
    if (!sftp_session) {
        std::cerr << "Failed to initialize SFTP session." << std::endl;
        return 1;
    }

    // 打开远程文件
    const char* remote_file = "path_to_remote_file";
    LIBSSH2_SFTP_HANDLE* sftp_handle = libssh2_sftp_open(sftp_session, remote_file, LIBSSH2_FXF_READ, 0);
    if (!sftp_handle) {
        std::cerr << "Failed to open remote file: " << remote_file << std::endl;
        return 1;
    }

    // 打开本地文件
    const char* local_file = "path_to_local_file";
    FILE* local_file_handle = fopen(local_file, "wb");
    if (!local_file_handle) {
        std::cerr << "Failed to open local file: " << local_file << std::endl;
        return 1;
    }

    // 下载文件内容
    char buffer[1024];
    ssize_t bytes_read;
    ssize_t bytes_written;
    while ((bytes_read = libssh2_sftp_read(sftp_handle, buffer, sizeof(buffer))) > 0) {
        bytes_written = fwrite(buffer, 1, bytes_read, local_file_handle);
        if (bytes_written != bytes_read) {
            std::cerr << "Failed to write to local file." << std::endl;
            return 1;
        }
    }

    // 关闭本地文件和远程文件
    fclose(local_file_handle);
    libssh2_sftp_close(sftp_handle);

    // 关闭SFTP会话和SSH连接
    libssh2_sftp_shutdown(sftp_session);
    libssh2_session_disconnect(session, "Goodbye");
    libssh2_session_free(session);

    // 清理libssh2库
    libssh2_exit();
    
    return 0;
}

五、总结

本文全面介绍了使用libssh2库建立安全的SSH连接的过程。通过对文章的阅读,读者可以了解到如何使用libssh2库进行SSH连接的准备工作,以及建立SSH连接的具体步骤。文章还提供了文件传输的示例,帮助读者了解如何使用libssh2库进行文件上传和下载操作。通过本文的指导,C++开发者可以更好地利用libssh2库来实现安全的SSH连接和远程服务器管理。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/direct/8b301f2e3426410f9c0c879cd91b1a66.png)

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用libssh2实现SSH客户端并发送命令的示例: 1. 首先需要安装libssh2库,可以在Ubuntu下使用以下命令进行安装: ``` sudo apt-get install libssh2-1-dev ``` 2. 然后创建一个Qt项目,并在.pro文件中添加以下内容: ``` LIBS += -lssh2 ``` 3. 在Qt中创建一个类,例如名为SSHClient的类,并在其中添加以下代码: ``` #include <libssh2.h> #include <QByteArray> class SSHClient { public: SSHClient(const QString &host, const QString &user, const QString &password); ~SSHClient(); bool connect(); void disconnect(); QString execute(const QString &command); private: QString m_host; QString m_user; QString m_password; LIBSSH2_SESSION *m_session; LIBSSH2_CHANNEL *m_channel; }; SSHClient::SSHClient(const QString &host, const QString &user, const QString &password) : m_host(host), m_user(user), m_password(password), m_session(nullptr), m_channel(nullptr) { } SSHClient::~SSHClient() { disconnect(); } bool SSHClient::connect() { m_session = libssh2_session_init_ex(nullptr, nullptr, nullptr, this); if (!m_session) { qWarning("Failed to initialize SSH session."); return false; } libssh2_session_set_blocking(m_session, 1); int rc = libssh2_session_handshake(m_session, m_socket); if (rc) { qWarning("Failed to establish SSH session: %d", rc); return false; } rc = libssh2_userauth_password(m_session, m_user.toUtf8().constData(), m_password.toUtf8().constData()); if (rc) { qWarning("Failed to authenticate SSH session: %d", rc); return false; } return true; } void SSHClient::disconnect() { if (m_channel) { libssh2_channel_free(m_channel); m_channel = nullptr; } if (m_session) { libssh2_session_disconnect(m_session, "Normal Shutdown"); libssh2_session_free(m_session); m_session = nullptr; } } QString SSHClient::execute(const QString &command) { if (!m_session) { qWarning("SSH session is not established."); return ""; } m_channel = libssh2_channel_open_session(m_session); if (!m_channel) { qWarning("Failed to open SSH channel."); return ""; } int rc = libssh2_channel_exec(m_channel, command.toUtf8().constData()); if (rc) { qWarning("Failed to execute SSH command: %d", rc); return ""; } QByteArray result; char buf[1024]; while (true) { int nbytes = libssh2_channel_read(m_channel, buf, sizeof(buf)); if (nbytes > 0) { result.append(buf, nbytes); } else if (nbytes < 0) { qWarning("Failed to read SSH result: %d", nbytes); break; } else { break; } } libssh2_channel_free(m_channel); m_channel = nullptr; return QString::fromUtf8(result); } ``` 4. 在主窗口中可以使用以下代码进行测试: ``` SSHClient ssh("localhost", "username", "password"); if (ssh.connect()) { QString result = ssh.execute("ls"); qDebug() << result; ssh.disconnect(); } ``` 这个示例中创建了一个SSHClient类,该类具有connect()、disconnect()和execute()方法。connect()方法用于与SSH服务器建立连接,disconnect()方法用于断开连接,execute()方法用于执行命令并返回结果。在主窗口中可以创建SSHClient对象,并使用execute()方法发送命令并打印结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值