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

时间:2016-05-16 16:01:05

标签: c++ linux bash background output

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

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

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

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

问题:

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

3 个答案:

答案 0 :(得分:1)

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

〜/ .bash_profile中:

# ...

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

export -f pwd

请注意使用command命令来避免shell函数pwd中的递归。另请注意export -f将函数导出到子进程。对于你想要覆盖的每个命令,你需要一个这样的代码片段。

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

答案 1 :(得分:1)

首先,你的问题遗漏了两个重要参数。首先是哪些炮弹需要受此影响。这是应该是系统范围的吗?只有一个用户?只是特定用户的一些特定shell?

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

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

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

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

已经执行类似操作的一个程序是&lt; shameless_plug&gt; fakeroot-ng&lt; / shameless_plug&gt;。它设置了一个调试器,并附加到一个shell,以便为它提供与真实系统不同的系统运行视图。您可以尝试破解代码以执行您想要的操作。 <{1}}分支可能会更容易,但那个分支仍然不太稳定。

答案 2 :(得分:1)

你提出了错误的问题。

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

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

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

在网上搜索如何编写LD_PRELOAD模块,以获取有关如何以菊花链形式连接函数的说明。与修改每个二进制文件相比,这是相当更少的工作。如果你知道自己在做什么,可以用大约200行代码完成。

现在是踢球者了。您不需要将LD_PRELOAD环境变量放入每个进程。只需在/etc/ld.so.preload和中提琴中列出您的共享对象(在使用LD_PRELOAD测试之后)!系统中的所有进程都会向其注入您的库。

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

为了获得额外的奖励,一旦完成,请安装chkrootkit并运行它,并观看它抱怨您的系统已被入侵。这是rootkit用于隐藏自身的(许多)技术之一。