我试图通过一个非常小的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 ++做。
答案 0 :(得分:3)
你有两个选择。
首先,对于那些拥有一个的人,你可以使用每个程序的方法来解决这个问题。例如,git
有GIT_ASKPASS
,ssh
具有基于密钥的身份验证。
其次,您可以使用pty
与这些程序进行通信。您可以使用expect
等程序或使用自己的代码执行此操作(请参阅posix_openpt
命令)。