Команда оболочки C ++, запрашивающая пароль - PullRequest
1 голос
/ 04 октября 2011

Я пытаюсь вызвать некоторые команды оболочки через очень маленькую программу на C ++.

Такие команды, как "git clone" или "rsync", для которых требуется пароль. Например, поскольку git использует SSH, который является интерактивным, я не могу предоставить ему пароль.

Моя программа на данный момент выглядит следующим образом:

#include <iostream>
#include <string>

std::string ExecuteShellCommand(const std::string& cmd) 
{  
  FILE* pipe = popen(cmd.c_str(), "r");

  if (!pipe) 
    return std::string("ERROR");

  char buffer[128];
  std::string result = "";

  while(!feof(pipe)) 
  {
    if(fgets(buffer, 128, pipe) != NULL)
      result += buffer;
  }

  pclose(pipe);
  return result;
}

int main()
{
  ExecuteShellCommand("git clone ssh://someurl/somerepo.git");
  return 0;
}

Выход:

ssh_askpass: exec (/ usr / libexec / ssh-askpass): такого файла или каталога нет

ssh_askpass: exec (/ usr / libexec / ssh-askpass): такого файла или каталога нет

ssh_askpass: exec (/ usr / libexec / ssh-askpass): такого файла или каталога нет

Есть ли способ, чтобы процесс запрашивал пароль, как если бы я выполнял команду прямо из командной строки?

Спасибо!

РЕДАКТИРОВАТЬ: В идеале я хотел бы сделать это непосредственно на Python или Shell, но моя программа должна читать различные структуры в C ++ (привязки Python вроде бы излишне), поэтому, поэтому я пытаюсь это в C ++.

1 Ответ

3 голосов
/ 04 октября 2011

У вас есть два варианта.

Во-первых, для тех, у кого он есть, вы можете использовать метод каждой программы, чтобы обойти это. Например, git имеет GIT_ASKPASS, а ssh имеет аутентификацию на основе ключей.

Во-вторых, вы можете использовать pty для связи с этими программами. Вы можете сделать это с помощью такой программы, как expect, или с вашим собственным кодом (см. Команду posix_openpt).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...