Windows проблемы с путями при использовании библиотеки libs sh C ++ - PullRequest
0 голосов
/ 01 апреля 2020

У меня проблемы с Windows разделителями путей к файлам с использованием библиотеки libs sh c ++ libsshpp .

Предположим, у меня есть следующий код:

#define SSH_NO_CPP_EXCEPTIONS
#include "libssh/libsshpp.hpp"

#include <iostream>

#pragma comment(lib, "ssh")

int main() 
{
    ssh::Session session;

    int sessionMsg = -1;

    std::string host        = "myhost.com";
    std::string user        = "username";
    std::string idfile      = "%s\\.ssh\\id_ed25519";
    std::string hostkeys    = "ssh-ed25519";
    std::string keyExchange = "curve25519-sha256";

    session.setOption(SSH_OPTIONS_HOST,                 host.c_str());
    session.setOption(SSH_OPTIONS_USER,                 user.c_str());
    session.setOption(SSH_OPTIONS_STRICTHOSTKEYCHECK,   (long)0);
    session.setOption(SSH_OPTIONS_HOSTKEYS,             hostkeys.c_str());
    session.setOption(SSH_OPTIONS_KEY_EXCHANGE,         keyExchange.c_str());
    session.setOption(SSH_OPTIONS_ADD_IDENTITY,         idfile.c_str());

    std::cout << "Trying to connect to " << host << " with user " << user << "...\n";

    session.connect();

    if (session.isServerKnown() != SSH_SERVER_KNOWN_OK) {
        std::cout << "Server unknown.\n";

        if (session.writeKnownhost() != SSH_OK) {
            std::cout << "Unable to write to known_hosts file.\n";
        }
        else {
            session.connect();
        }
    }

    sessionMsg = session.userauthPublickeyAuto();

    std::string err = session.getError();

    if (sessionMsg != SSH_AUTH_SUCCESS) {
        if (!err.empty()) {
            std::cout << err;
        }

        std::cout << "Auth failed.";
    }
    else {
        std::cout << err.empty() ? session.getIssueBanner() : err;
    }
}

Сначала я установил значение idfile равным id_ed25519, но затем libs sh пожаловался: Failed to read private key: C:\Users\MyUser/.ssh/id_ed25519 (обратите внимание на косые черты переключения). После изменения его на %s\\.ssh\\id_ed25519 это, похоже, оказало положительное влияние на процедуру соединения, однако теперь я продолжаю попадать в часть кода (session.writeKnownhost() != SSH_OK).

Теперь мне интересно, может ли это быть из-за той же проблемы "переключения слешей", которая возникла для пути к файлу закрытого ключа, потому что, очевидно, libs sh хочет получить доступ к C:\Users\MyUser\.ssh\known_hosts, но вполне возможно, путь задается как что-то вроде C:\Users\MyUser/.ssh/known_hosts.

Мой вопрос: есть ли возможность каким-либо образом изменить разделители пути в стиле windows в сеансе или есть что-то еще, что я наблюдаю или делаю неправильно?

1 Ответ

0 голосов
/ 02 апреля 2020

Мне удалось решить проблему, добавив опцию SSH_OPTIONS_SSH_DIR и изменив пути к секретному ключу и known_hosts (теперь относительно пути к каталогу s sh):

// note here: %s will be replaced by libssh with the home directory path
std::string sshDir = "%s//.ssh"; 
std::string idFile = "id_ed25519";
std::string knownHosts = "known_hosts";

// ...
session.setOption(SSH_OPTIONS_USER, user.c_str());
session.setOption(SSH_OPTIONS_SSH_DIR, sshDir.c_str()); // <-- added
// ...
...