从 C 中的终端获取所有输出

2023-12-10

我目前正在开发 ssh 程序,我希望能够通过网络完全控制终端。我的问题是,如果我向服务器发送命令以在终端中运行,如何获取终端打印的输出?我看到很多帖子说要使用popen()命令,但根据我的尝试,我无法更改目录并使用它执行其他命令,只能执行简单的操作,例如ls。除了将其发送到类似文件之外,还有其他方法可以从终端获取输出吗command > filetoholdcommand。提前致谢!


我会将其作为评论,但由于我是新人,所以我没有足够的代表。 cd 是一个内置的 shell 命令,因此您需要使用 system()。但是 cd 对你的进程没有影响(你必须使用 chdir() ),所以你真正想做的是通过 fork/exec 启动一个 shell 作为子进程,将管道连接到它的 stdin 和 stdout,然后在用户会话或连接期间通过管道传递命令。

以下代码给出了总体思路。基本的,但有缺陷的 - 使用 select() 而不是 usleep() 作为其中之一。

int argc2;
printf( "Server started - %d\n", getpid() );
char buf[1024] = {0};
int pid;
int pipe_fd_1[2];
int pipe_fd_2[2];
pipe( pipe_fd_1 );
pipe( pipe_fd_2 );

switch ( pid = fork() ) 
{
case -1:
    exit(1);
case 0: /* child */
    close(pipe_fd_1[1]);
    close(pipe_fd_2[0]);
    dup2( pipe_fd_1[0], STDIN_FILENO );
    dup2( pipe_fd_2[1], STDOUT_FILENO );
    execlp("/bin/bash", "bash", NULL);
default: /* parent */
    close(pipe_fd_1[0]);
    close(pipe_fd_2[1]);
    fcntl(pipe_fd_2[0], F_SETFL, fcntl(pipe_fd_2[0], F_GETFL, NULL ) | O_NONBLOCK );
    while(true)
    {
      int r = 0;
      printf( "Enter cmd:\n" );
      r = read( STDIN_FILENO, &buf, 1024 );
      if( r > 1 )
      {
        buf[r] = '\0';
        write(pipe_fd_1[1], &buf, r);
      }
      usleep(100000);
      while( ( r = read( pipe_fd_2[0], &buf, 1024 ) ) > 0 )
      {
        buf[r-1] = '\0';
        printf("%s", buf );
      }
      printf("\n");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C 中的终端获取所有输出 的相关文章

随机推荐

  • 从外部触发淘汰赛事件

    我有以下 html 表单中的 Select Element
  • 获取当前键盘光标位置

    无论如何 是否可以像获取鼠标光标位置一样全局获取键盘光标 插入符号 当前位置的坐标mouseLocation 不 没有办法在全球范围内做到这一点 如果您想在自己的应用程序中执行此操作 例如在 NSTextView 中 您可以这样做 NSRa
  • 为什么在 WPF 自定义 2D 绘图中使用具有破折号图案的笔会导致巨大(!)性能下降?

    希望有人能阐明这一点 以便我可以使用带有破折号图案的笔 我正在写一个可滚动的图表 Panel inside ScrollViewer实现IScrollInfo 在 WPF 中使用DrawingVisual s DataContext Dra
  • 使用 vs 2010 在负载测试中测试迭代设置

    我想测试 250 个并发用户的应用程序 我对负载测试设置有一些疑问 实现上述目标的正确设置应该是什么 我已将最大用户数设置为 250 并将运行设置中的测试迭代设置为 1 那么它会发送 250 个虚拟请求吗 or 我必须将最大用户数设置为 2
  • string类与其他类有何区别?

    我们可以做的 String string ourstring 但我们不能为用户定义的类创建这样的对象 UserClass uc Java 如何允许我们直接设置值java lang String只上课 java lang String是一个特
  • 如何在 IgGrid 单元格(Infragistics)中获取正则表达式?

    如何在 igGrid 更新中的 igTextEditor 上使用正则表达式 我尝试使用验证选项 但没有成功 schedulerTable igGrid columns scope schedulerColumns width 87 heig
  • 如何使用 React 删除待办事项列表中的项目

    我正在使用 React 创建一个待办事项列表应用程序 在我的应用程序中 当我单击 x 按钮删除项目并使用 console log 检查当前数组时 我可以看到该数组已正确更新为我要删除的项目从数组列表中 但 Dom 只渲染我想要删除的项目而不
  • 提高自定义无限滚动的速度

    我有一个自定义的无限滚动 运行完美 但速度非常慢 这是处理 ajax 请求的脚本 function ga infinite scroll trigger this on infinite scroll add filter woocomme
  • JFreeChart X 轴标签超出图表区域

    我有一个JFreeChart图表与DateAxis作为域 它看起来非常漂亮 但是最后一个轴标签有时会超出图表区域 这是要重现的示例代码 public class LineChart AWT extends ApplicationFrame
  • Visual basic 和 Json.net Web 请求

    基本上我想做的是制作一个程序来列出英雄联盟的游戏信息 使用 API 来提取数据 其工作原理是 您搜索用户名 它会返回链接到该帐户的整数 然后您使用该整数搜索该帐户的所有信息 EG 帐户级别 获胜 损失等 我遇到了一个我似乎无法弄清楚的问题
  • 安装tensorflow需要多少空间?

    我正在尝试跑步pip install tensorflow from a Jupyter笔记本 尝试运行它cmd给出一个更陌生的error 并且我的可用磁盘空间 目前还剩 1 2 GB 在安装过程中似乎会减少 然后我会看到 Errno 28
  • Spark - 评级文件中的相关矩阵

    我对 Scala 和 Spark 还很陌生 无法从评级文件创建相关矩阵 它类似于这个问题但我有矩阵形式的稀疏数据 我的数据如下所示
  • MySQL 进行多个连接时 tmp 表的密钥文件不正确

    我不经常来这里寻求帮助 但我对此感到非常沮丧 我希望有人以前遇到过这种情况 每当我尝试使用多个连接从表中获取记录时 我都会收到此错误 126 Incorrect key file for table tmp sql 64d 0 MYI tr
  • 模块中的 AngularFire2 应用程序初始化与动态配置数据冲突

    我遇到了一个问题 因为我的配置数据是在运行时加载的 而 AnuglarFire2 想要模块声明中的数据 我可以通过直接注入访问数据 但我不知道如何将数据获取到模块文件中的 AngularFireModule 在运行时加载数据是将配置数据获取
  • 编译SDK会影响Android函数返回的值吗?

    假设我有一个设备 A 并且我的应用程序编译了两次 第一次设置compileSDK 8 第二次设置compileSDK 22 当我现在从 Android 系统调用函数时 系统是否有可能返回两个不同的值或对象 我认为这是不可能的 因为这取决于设
  • Tank Auth 添加字段

    我一整天都在使用 Tank Auth 库 对此有一个疑问 我在注册表单中添加了两个字段 分别是名字和姓氏 我试图找出为什么它没有插入到用户个人资料页面中 使用更新后的代码 我收到此错误 遇到 PHP 错误 严重性 警告 消息 Tank au
  • 接收错误警告:mcrypt_decrypt():IV 参数必须与块大小一样长

    我收到此错误 Warning mcrypt decrypt The IV parameter must be as long as the blocksize 它来自于使用与 php 手册站点上的代码基本相同的代码加密变量 http php
  • Pandas - 将列转换为 int 并强制 NaN

    给定如下数据框 colVals 05 17 55 703 21 3 89 891 11 05 17 55 703 21 3 217 891 12 05 17 55 703 21 3 217 891 13 05 17 55 703 21 3
  • 在自定义 TreeView 中添加拖放支持

    我已经成功填充了TreeView通过创建一个TreeDataProvider并定制了图标及其可折叠属性 现在我希望能够拖放其ViewItem s 到 WebView 上 不幸的是 没有用于拖放的示例 阅读通过TreeView来源 ViewI
  • 从 C 中的终端获取所有输出

    我目前正在开发 ssh 程序 我希望能够通过网络完全控制终端 我的问题是 如果我向服务器发送命令以在终端中运行 如何获取终端打印的输出 我看到很多帖子说要使用popen 命令 但根据我的尝试 我无法更改目录并使用它执行其他命令 只能执行简单