Shell Prog Challenge-查找从配置文件或脚本调用的文件的路径

Shell Prog Challenge-查找从配置文件或脚本调用的文件的路径,shell,parsing,scripting,Shell,Parsing,Scripting,我不知道怎么做,所以我来这里寻求帮助:)这是我需要的。我需要在Red Hat Linux系统上解析一些配置文件或bash/sh脚本,并查找它们执行的文件/命令/脚本的路径。配置文件可以具有不同的语法,也可以使用不同的语言 以下是我必须查看的文件: 配置脚本: /etc/inittab /var/spool/cron/root /var/spool/cron/tabs/root /etc/crontab /etc/xinetd.conf 递归地位于/etc/cron.d/*下的文件 Bash/

我不知道怎么做,所以我来这里寻求帮助:)这是我需要的。我需要在Red Hat Linux系统上解析一些配置文件或bash/sh脚本,并查找它们执行的文件/命令/脚本的路径。配置文件可以具有不同的语法,也可以使用不同的语言

以下是我必须查看的文件:

配置脚本:

  • /etc/inittab
  • /var/spool/cron/root
  • /var/spool/cron/tabs/root
  • /etc/crontab
  • /etc/xinetd.conf
  • 递归地位于/etc/cron.d/*下的文件
Bash/Sh脚本:

  • 递归地位于/etc/init.d/*或/etc/rc.d/*下的文件。这些文件夹只包含shell脚本,因此上面列出的所有其他文件可能需要单独处理
下面是我能想到的挑战:

  • 文件中的路径可以是绝对路径,也可以是相对路径
  • 文件中的路径可能位于行的开头,或者前面有空格、冒号或分号等字符
  • 必须忽略以命令/脚本参数表示的文件路径
  • 目录的路径必须被忽略
  • Shell函数或内置命令必须忽略
一些示例(摘自/etc/init.d/avahi守护进程):

->在上面的代码段中只能返回
/bin/cp
/bin/[
(这是实际执行的唯一命令)

->
/usr/sbin/avahi守护进程必须返回,但这只是因为变量是在之后调用的

请注意,我没有访问实际文件系统的权限,我只有一个要解析的文件副本

写了这篇文章后,我意识到这是多么复杂,不太可能有一个100%有效的解决方案……但如果您喜欢编程挑战:)

好的方面是我可以使用任何脚本语言:bash/sh/grep/sed/awk、php、python、perl、ruby或它们的组合

我试着用PHP开始写作,但我很难得到一致的结果


谢谢!

实现这一点所用的语言并不重要。重要的是问题是不可判定的,因为它相当于

正如我们所知,不可能确定一个程序是否会停止,也不可能知道一个程序是否会调用另一个程序。例如,您可能认为您的脚本将调用X然后调用Z,但如果X永远不会返回,则将永远不会调用Z。此外,您可能不会注意到您的脚本调用了Y,因为字符串Y可能是由dy确定的但实际上从未出现在程序文本中

还有其他一些问题也可能会妨碍您,例如:

python -c 'import subprocess; subprocess.call("ls")'
现在,您不仅需要一个完整的Bash解析器,还需要一个Python解析器,更不用说解决Python中的停顿问题了


换句话说,你想要什么是不可能的。要使之可行,你必须大大减少问题的范围,例如“查找所有以/usr/bin或/bin开头的、不在注释中的内容”。而且不清楚这有多有用。

“在上面的代码段中只需返回/bin/cp。”(这是唯一一个实际执行的命令)“-不完全正确。
/bin/[
也被执行。:)完全正确,我将编辑帖子…干杯!@Amadan:什么系统是
/bin/[
东西?@JohnZwinck:AFAIK,每一个类似UNIX的系统:Linux,OS X.
[
一直都是可执行的。(相反,
[…]
是一个shell内置结构。)--哦,对不起,在某些系统(如Debian)上它是
/usr/bin/[
;Mac在
/bin/[
@Amadan:是的,
/usr/bin/[
是一个东西,但即使在使用
[]时Bash实际上也不会调用它
。对于Bash来说,在内部实现这些东西要高效得多。Bash也在内部实现了
测试
:谢谢你的回答。我同意你的python示例,但在我的情况下,可以安全地忽略这些东西,因为它不太可能出现在我必须解析的文件中。至于停止问题,它是这对我来说不是什么问题。我需要找到脚本在任何情况下都可能执行的文件,无论它们是否实际未执行,因为之前可能有语句挂起了执行流。对,那么动态生成命令的情况如何?如果脚本运行
sort
by
$x$y怎么办
在哪里
x=so
y=rt
?即使你能回答这个问题,我们离完成还有很长的路要走——我能想出几十个案例,其中一些不那么做作,会让你烦恼。整个业务应该重新考虑。你是对的,我不能回答。我想我必须接受,它永远不会100%可靠,因为这里有这么多特殊情况。@jrm:另一个想法是使用
strace
或类似工具来检测实际程序的一次运行,以实际找出正在使用的程序(甚至是一般的文件)。例如,您可以运行
strace-f bash…| grep execve
并查看execve()打电话。这可能更容易实现,也可能更可靠。
AVAHI_BIN=/usr/sbin/avahi-daemon
$AVAHI_BIN -r
python -c 'import subprocess; subprocess.call("ls")'