首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过libssh (ssh_scp_push_file && ssh_scp_write)发送文件

通过libssh (ssh_scp_push_file && ssh_scp_write)发送文件
EN

Stack Overflow用户
提问于 2017-04-19 18:35:56
回答 1查看 1.6K关注 0票数 1

免责声明:,我在谷歌上搜索这个

  • 使用C++
  • 两端都是Linux。
  • 我可以通过TCPDUMP看到远端的SSH连接。
  • 除了0之外,没有生成错误或返回代码(调试说它很好)。
  • TCPDUMP看起来不像是它传输的足够的数据(它是一个2MB文件*)
  • 据我所知,连接/身份验证/授权正在正常进行。

当我到远端寻找被复制的文件时,它就不存在了。我已经尝试过updatedb &找到"file",但是找不到它。

提前感谢您的任何洞察力!

SSH函数(auth和connect)清除为“最小、完整和可验证的示例”,因为它们似乎工作得很好*

代码语言:javascript
复制
#include <cstdio>
#include <string>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <curl/curl.h>
#include <boost/regex.hpp>
#include <boost/system/error_code.hpp>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <x86_64-linux-gnu/sys/stat.h>
#define LIBSSH_STATIC 1
#include <libssh/libssh.h>

using namespace std;

int sourcePull(void)
{
    CURL *curl; 
    FILE *fp;
    CURLcode res;
    char *url = "https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset";
    char outfilename[FILENAME_MAX] = "fireHOL";
    curl = curl_easy_init();
    if (curl)
    {
        fp = fopen(outfilename, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

int sourceParse()
{
    //Regex for IP's in sourcePull result
    ifstream infile("fireHOL");
    string ipAddress;
    boost::regex expr1("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
    boost::regex expr2("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$");
    boost::smatch matches;

        while (infile >> ipAddress)
        {
            if (boost::regex_match(ipAddress, matches, expr1)) 
            {
                ofstream checkpoint;
                checkpoint.open("samp_batch.txt", ios::out | ios::app);
                checkpoint << "add -t 86400 -a d -l r -o icewall ip -s " << ipAddress << endl;
                checkpoint << "add -t 86400 -a r -l r -o icewall ip -d " << ipAddress << endl;
            }

            if (boost::regex_match(ipAddress, matches, expr2))
            {
                ofstream checkpoint;
                checkpoint.open("samp_batch.txt", ios::out | ios::app);
                checkpoint << "add -t 86400 -a d -l r -o icewall ip -s " << ipAddress << endl;
                checkpoint << "add -t 86400 -a r -l r -o icewall ip -d " << ipAddress << endl;
            }

        }

        ofstream terminate;
        terminate.open("samp_batch.txt", ios::out | ios::app);
        terminate << "EOF";

    return 0;
}

int fileSize()
{
    int size;
    streampos begin, end;
    ifstream inputFile("samp_batch", ios::binary);
    begin = inputFile.tellg();
    inputFile.seekg(0, ios::end);
    end = inputFile.tellg();
    inputFile.close();
    return size;
}

int ssh()
{
    ssh_session my_ssh_session;
    ssh_scp scp;
    int port = 22;
    int rc;
    int method;
    char password[128] = { 0 };
    char *banner;
    //open session & set options
    my_ssh_session = ssh_new();
    if (my_ssh_session == NULL)
        exit(-1);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "XXX.XXX.XXX.XXX");
    ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
    ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "security");

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

    //verify the servers identity
    if (verify_knownHost(my_ssh_session) < 0)
    {
        fprintf(stdout, "unkown host\n");
        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
        exit(-1);
    }


    // Try to authenticate
    rc = ssh_userauth_none(my_ssh_session, NULL);
    if (rc == SSH_AUTH_ERROR) {
        error(my_ssh_session);
        return rc;
    }

    method = ssh_auth_list(my_ssh_session);
    while (rc != SSH_AUTH_SUCCESS) {
        // Try to authenticate with public key first
        if (method & SSH_AUTH_METHOD_PUBLICKEY) {
            rc = ssh_userauth_autopubkey(my_ssh_session, NULL);
            if (rc == SSH_AUTH_ERROR) {
                error(my_ssh_session);
                return rc;
            }
            else if (rc == SSH_AUTH_SUCCESS) {
                break;
            }
        }

    return rc;

    //SCP samp_batch file here
    const int length = fileSize();
    const char *fileName = "samp_batch";


    ifstream inputFile(fileName);
    constexpr size_t bufferSize = 1024 * 1024 * 1024;
    unique_ptr<char[]> buffer(new char[bufferSize]);
    const void* cvp = &buffer;

    rc = ssh_scp_push_file(scp, "samp_batch", length, 0777);
    if (rc != SSH_OK)
    {
        fprintf(stderr, "Can't open remote file: %s\n", ssh_get_error(my_ssh_session));
        ssh_free(my_ssh_session);
        exit(-1);

    }

    while (inputFile)
    {

        inputFile.read(buffer.get(), 1024 * 1024 * 1024);

        rc = ssh_scp_write(scp, cvp, bufferSize);
        if (rc != SSH_OK)
        {
            fprintf(stderr, "Cant write to remote file: %s\n", ssh_get_error(my_ssh_session));
            ssh_free(my_ssh_session);
            exit(-1);

        }
    }

    return SSH_OK;

    ////execute remote command here


    //ssh_free(my_ssh_session);
}

int main()
{

    sourcePull();
    sourceParse();
    ssh();


    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-20 16:55:44

解决了这个问题当然,更多的阅读..。

实际上,我并没有在SSH系统中初始化SCP子系统。

(A)加入;

代码语言:javascript
复制
    scp = ssh_scp_new(my_ssh_session, SSH_SCP_WRITE, "/");
    if (scp == NULL)
    {
        fprintf(stderr, "Error allocating scp session: %s\n", ssh_get_error(my_ssh_session));
        return SSH_ERROR;
    }
    rc = ssh_scp_init(scp);
    if (rc != SSH_OK)
    {
        fprintf(stderr, "Error initializing scp session: %s\n", ssh_get_error(my_ssh_session));
        ssh_scp_free(scp);
        return rc;
    }

在我的推/写函数之上,我能够让SCP子系统“开始”。现在还没有得到她的功能(SCP状态码1d无效)错误,但我至少知道scp在这一点上是“清醒”的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43503595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档