c++ - 如何使用 std::in 和 getline() 在后台进程中检测从 bash 注入(inject)的输入

标签 c++ bash sh file-descriptor io-redirection

我有一个用 Cpp 编译的二进制文件,代码如下:

std::string input;
getline(std::cin, input);
std::cout << "Message given: " << input << std::endl;

如果我执行此示例,并在终端中写入“Hello world!”完美运行:

Message given: Hello world!

现在,我启动重定向标准输出的可执行文件:

./basicsample >> output/test

如果我尝试使用文件描述符注入(inject)输入:

echo "Hello world!" > /proc/${PID}/fd/0

消息出现在启动进程的终端中:

[vgonisanz@foovar bash]$ ./basicsample >> output/test
Hello world!

但是消息没有出现在程序输出中。我希望通过 getline 处理消息,但未检测到!但是,如果我直接在那个 bash 中编写,程序就会得到输入。我正在尝试编写一个脚本以在后台进程中注入(inject)输入,但它不起作用。

如何在不手动执行的情况下将要检测的输入注入(inject)到流程中?

更新:

似乎使用 expect 可以工作,但我更愿意避免这样的依赖关系。经过几次尝试,没有依赖项的最佳方法是使用管道,例如:

mkdir tmp; mkfifo tmp/input.pipe; nohup ./basicsample  tmp/user.out 2> tmp/nohup.err

这将运行创建输入管道、控制台输出和错误。 然后,只需使用以下方法喂食管道:

echo "Hello world!" > tmp/input.pipe

问题是管道只工作一次。获得输入后,它就不会再听了。也许这是方法,但我不知道如何避免失去焦点。

我尝试使用文件等多种方式重定向它,但它不起作用。提前致谢。

最佳答案

没有依赖项的最好方法是使用管道,例如:

mkdir tmp
mkfifo tmp/input.pipe
(tail -f tmp/input.pipe) | ./basicsample > tmp/log.0 &

这将运行创建输入管道和保存在日志文件中的输出。您可以使用运算符 & 在后台启动它来防止控制台阻塞。

然后使用以下方式注入(inject)数据:

echo "YOUR_STRING" > tmp/input.pipe

它应该适用于您提出的问题。

关于c++ - 如何使用 std::in 和 getline() 在后台进程中检测从 bash 注入(inject)的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50388378/

相关文章:

c++ - 在 C++ lldb 中使用重载运算符评估表达式

c++ - 将结构上无序集中的选定字段存储到 vector

python - 如何使用 Docker 运行多个 Python 脚本和一个可执行文件?

bash - 直到用户输入等于某事做

linux - MAKE_LINTIAN_HAPPY 和 shell 脚本中的单引号有什么作用?

c++ - 从同一类中的另一个构造函数调用一个构造函数

c++ - 为什么在返回兼容类型时需要显式 std::move?

python - 连接多个文件内容

bash - 在 shell 脚本中,如何在不同的字符串之后替换第一次出现的字符串

linux - 我们如何识别与特定关键字或终端中的字符串匹配的文件中的行号?