gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:40 28 4
gpt4 key购买 nike

我有一个用 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/testHello 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com