繁体   English   中英

在后台C ++程序/ bash脚本中捕获linux命令的输出

[英]Catching output of linux command in background C++ program / bash script

我想创建将在后台运行的c ++程序或bash脚本,例如,每当我使用选择的命令时

pwd它将捕获该命令的输出,即~Desktop/folder1 ,它将输出更改为You are in ~Desktop/folder1 因此,结果是该用户在使用命令pwd将仅看到You are in ~Desktop/folder1

pwd命令只是示例,我想修改其他命令(如ls,ps等)的输出。

我希望脚本在所有终端中都能正常工作,也就是说,如果我打开另一个终端,它仍然会在该终端中捕获所选命令的输出。

题:

甚至有可能做这样的事情的c ++程序或bash脚本吗?

您可以将shell函数定义放入您的bash环境配置脚本中,以达到您描述的效果。 例如,

〜/ .bash_profile:

# ...

pwd() {
  echo You are in $(command pwd)
}

export -f pwd

请注意,使用command命令可避免在shell函数pwd递归。 另请注意export -f将功能导出到子进程。 对于要覆盖的每个命令,您都需要一个类似的代码段。

根据您的系统和配置,将它们放在~/.bashrc可能更合适。 或者,如果您希望它适用于每个用户,则可以将其放在系统级bash配置脚本之一中。 但是请注意,用户将能够覆盖它。

首先,您的问题中缺少两个重要参数。 首先是哪些外壳需要受到此影响。 这应该是系统范围的吗? 只有一个用户? 只是特定用户的几个特定Shell?

第二个缺少的参数是需要哪些权限。 这是根应该做的事情吗? 非特权用户?

您希望拦截的每个此类命令都是一个系统调用。 通常它是execve ,但有时它更具体(例如,根据定义, pwd是内部shell命令)。 假设您不希望编写内核模块(做您想要的事情的唯一真实方法),那么您将不得不变得更有创造力。

一种选择是用满足您需要的替代版本替换文件系统上的所有相关文件。 当然,如果您不是root用户,这是不可能的。

使用非特权用户更可能的另一种选择是使用ptrace接口来控制您希望控制的Shell进程。 但是请注意,这非常复杂,性能低下,并且只能与运行C ++程序的用户在同一用户上使用。 此外,最近的内核还提供了进一步的保护,以防止简单地作为调试器附加到随机进程,这意味着您将需要禁用它(需要root),或者通过程序运行受影响的shell。

已经执行类似操作的一个程序是<shameless_plug> fakeroot-ng </ shameless_plug>。 它设置调试器,并将其附加到外壳程序上,以便为它提供与实际系统不同的视图。 您可以尝试破解代码以执行所需的操作。 使用multithreaded_debugger分支可能会更容易,但是仍然不够稳定。

您问错了问题。

如果您要隐藏一组进程和文件,则/etc/ld.so.preload是您的朋友。

您需要做的是编写一个共享对象文件,该文件以某种方式重新实现readdirreaddir_r (两个函数应该或多或少地实现),以确保如果有人尝试获取该目录的内容, “隐藏”文件是,您在答复中忽略了文件。 同时,如果有人尝试获取/ proc /目录的内容,则将忽略与您要隐藏的进程相对应的目录。

您可以通过缓存其inode / dev对并检查它来轻松查看这是否是您希望将响应更改为的目录。 这将对重命名,符号链接等具有弹性。

在网上搜索如何编写LD_PRELOAD模块,以获取有关如何菊花链连接功能本身的说明。 这比修改每个二进制文件少得多。 如果您知道自己在做什么,则可以将其包装成约200行代码。

现在来了。 您无需将LD_PRELOAD环境变量放入每个进程。 只需在/etc/ld.so.preload和viola中列出您的共享库(用LD_PRELOAD测试后)即可! 系统中的所有进程都将注入您的库。

不要忽略测试建议。 在/etc/ld.so.preload中列出错误的文件可能会使您的系统完全无法使用。

要获得额外的好处,请在完成后安装chkrootkit并运行它,并观察它抱怨您的系统已受到威胁。 这是rootkit用来隐藏自身的(许多)技术之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM