2016-01-21 2 views
0

Я сам по себе неплохо разбирался и тестировался, но я не могу найти лучший способ достичь этой цели. Я хотел бы иметь bash one liner, который найдет скрипт на машине, выполнит сценарий и сможет добавить ключи или необходимую информацию в моем случае для успешного выполнения сценария.Bash - найти сценарий и выполнить с помощью опций

Чтобы получить немного более конкретно, я в Kali Linux, и я запустить команду найти так:

найти pattern_create

, которая возвращает:

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

Итак, я подумал о том, чтобы связать это с xargs, чтобы запустить сценарий следующим образом:

найти 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

Это идеальный вариант! Я понимаю осторожность при выдаче этой команды.Мои мысли состояли в том, чтобы проверить, что сценарий есть, и я узнаю его 'locate ', а затем '↑' назад, чтобы найти '. Затем переписываем команду с вашим предложением и добавляем необходимые аргументы. В конечном счете, я писал это в xclip так: 'ruby $ (locate pattern_create) 2700 | xclip -selection c' – Matthew

+0

@Matthew. Ваш подход в порядке, ИМО. Если вы просто не хотите иметь переменные в своей среде, вы можете * unset * it: 'var = $ (locate pattern_create) && ruby ​​$ var 2700; unset 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

Очень приятно! Это определенно удобно, я ценю это. Моя единственная мысль за одним лайнером заключалась в том, что я уже выпустил команду «locate » и проверил результаты. Затем запустите один лайнер, чтобы выполнить этот скрипт с некоторыми аргументами. – Matthew

+0

Если вы проверяете 'locate', то я бы вырезал и вставлял результат - дважды щелкнув левой кнопкой мыши, щелкните средним щелчком мыши IIRC. Нет ничего быстрее! –

+0

Правда! Это определенно быстро, я должен помнить об этом. Спасибо, сэр! – Matthew