2016-01-21 145 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