C ++ shell命令提示输入密码

时间:2011-10-03 20:47:21

标签: c++ shell

我试图通过一个非常小的C ++程序调用一些shell命令。

诸如“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 个答案:

答案 0 :(得分:3)

你有两个选择。

首先,对于那些拥有一个的人,你可以使用每个程序的方法来解决这个问题。例如,gitGIT_ASKPASSssh具有基于密钥的身份验证。

其次,您可以使用pty与这些程序进行通信。您可以使用expect等程序或使用自己的代码执行此操作(请参阅posix_openpt命令)。