2016-01-21 95 views
0

我自己做了很多搜索和测试,但似乎无法找到实现此目标的最佳方法。我想有一个bash脚本,可以在机器上找到一个脚本,执行脚本并能够在我的情况下添加交换机或所需信息,以便成功执行脚本。Bash - 查找脚本并执行选项

为了得到更具体一点,我在卡利Linux和我运行定位命令,像这样:

定位pattern_create

返回:

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

所以我想把它编成xargs来运行这样的脚本:

locate pattern_create | xargs的红宝石

但当然我不能指定我需要将成功运行该脚本的选项,这将是:

红宝石在/ usr /共享/ Metasploit的框架/工具/ pattern_create .rb 2700

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

我发现我可以运行:

pattern_create = $(定位pattern_create)& &红宝石$ pattern_create 2700

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

任何帮助都会很棒,我很欣赏每个人的时间。谢谢。

回答

0

你可以这样做:

ruby $(locate pattern_create) 

但要注意,如果有通过locate返回多行,那么这可能不是你想要的。

+0

这是完美的!我明白发出这个命令时的警惕。我的想法是验证脚本在那里,我发现它'找到',然后'↑'回到'找到'。接下来,用你的建议重写命令并添加所需的参数。最终,我是这样管道入xclip:'ruby $(locate pattern_create)2700 | xclip -selection c' – Matthew

+0

@Matthew您的方法很好,IMO。如果你只是不想在你的环境中有变量,你可以* unset * it:'var = $(locate pattern_create)&& ruby​​ $ var 2700;未设置var'。另外,请注意'locate'使用一个可能没有最新信息的数据库。它甚至可能无法找到您的系统上实际存在的文件。 'find'命令是一个更好的选择。 –

+0

当你不确定确切的路径时,是否有更好的方法来使用find?我不确定是否有这种能力。 – Matthew

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 
+0

非常好!这绝对是方便的,我很欣赏这一点。我唯一的想法是在我已经发布了“定位”命令并验证了结果。然后运行一个班轮,用一些参数来执行该脚本。 – Matthew

+0

如果您正在验证'locate',那么我会剪切并粘贴结果 - 双击左键,中键单击IIRC。没有比这更快的了! –

+0

真的!这绝对很快,我必须牢记这一点。谢谢你,先生! – Matthew