Bash - 找到脚本并执行选项

时间:2016-01-21 08:16:52

标签: linux bash xargs locate

我自己做了很多搜索和测试,但我似乎无法找到实现这一目标的最佳方法。我希望有一个bash one liner,可以在机器上找到一个脚本,执行脚本,并能够在我的情况下添加开关或所需信息,以便成功执行脚本。

为了更具体一点,我在Kali Linux中运行locate命令,如下所示:

  

找到pattern_create

返回:

  

/usr/share/metasploit-framework/tools/pattern_create.rb

所以我考虑将它管道化为xargs来运行脚本,如下所示:

  

找到pattern_create | xargs ruby​​

但当然我无法指定成功运行脚本所需的选项,即:

  

ruby​​ /usr/share/metasploit-framework/tools/pattern_create.rb 2700

我想出了一个解决方案,但我觉得它有点草率,这可以做得更容易,而且我希望我能得到任何输入/反馈。

我发现我可以跑:

  

pattern_create = $(locate pattern_create)&& ruby $ pattern_create 2700

得到我需要的东西,但后来我正在处理环境变量,在经常这样做时我不想要一堆。我希望用xargs或者甚至更清洁的方式解决这个问题,如果可能的话。我知道这可以通过find -exec轻松完成,但是在我没有存储脚本的情况下这不会起作用。

任何帮助都会很棒,我感谢大家的时间。谢谢。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

ruby $(locate pattern_create)

但请注意,如果locate返回多行,则可能无法执行您想要的操作。

答案 1 :(得分:0)

这是一件危险的事情,因为你不知道locate会返回什么,你最终可能会执行任意脚本。我建议您使用一个中间脚本来防止意外,例如找不到脚本或找到多个脚本。

#! /bin/sh
#
if [ $# -eq 0 ]
then
    echo >&2 "Usage: $0 script arguments"
    exit -1
fi
script=$(locate $1)
numfound=$(locate $1 | wc -l)
shift
if [ $numfound -eq 1 ]
then
    # Only run the script if exactly one match is found
    ruby $script $*
elif [ $numfound -eq 0 ]
then
    echo "No matching scripts found" >&2
    exit -1
else
    echo "Too many scripts found - $script" >&2
    exit -1
fi