『壹』 如何執行shell腳本其中一條命令
方法一:切換到shell腳本所在的目錄(此時,稱為工作目錄)執行shell腳本:
復制代碼代碼如下:
cd /data/shell
./hello.sh
./的意思是說在當前的工作目錄下執行hello.sh。如果不加上./,bash可能會響應找到不到hello.sh的錯誤信息。因為目前的工作目錄(/data/shell)可能不在執行程序默認的搜索路徑之列,也就是說,不在環境變數PASH的內容之中。查看PATH的內容可用 echo $PASH 命令。現在的/data/shell就不在環境變數PASH中的,所以必須加上./才可執行。
方法二:以絕對路徑的方式去執行bash shell腳本:
復制代碼代碼如下:
/data/shell/hello.sh
方法三:直接使用bash 或sh 來執行bash shell腳本:
復制代碼代碼如下:
cd /data/shell
bash hello.sh
或
復制代碼代碼如下:
cd /data/shell
sh hello.sh
注意,若是以方法三的方式來執行,那麼,可以不必事先設定shell的執行許可權,甚至都不用寫shell文件中的第一行(指定bash路徑)。因為方法三是將hello.sh作為參數傳給sh(bash)命令來執行的。這時不是hello.sh自己來執行,而是被人家調用執行,所以不要執行許可權。那麼不用指定bash路徑自然也好理解了啊,呵呵……。
方法四:在當前的shell環境中執行bash shell腳本:
復制代碼代碼如下:
cd /data/shell
. hello.sh
或
復制代碼代碼如下:
cd /data/shell
source hello.sh
前三種方法執行shell腳本時都是在當前shell(稱為父shell)開啟一個子shell環境,此shell腳本就在這個子shell環境中執行。shell腳本執行完後子shell環境隨即關閉,然後又回到父shell中。而方法四則是在當前shell中執行的。
『貳』 如何shell命令編寫自己的Web日誌分析腳本
一、讀取文件
按照上面的思路,先解決讀取問題。這里我用了判斷語句,起初我是想寫出類似於 access=more
/usr/access*.*,將這個路徑全部加到變數里,方便判斷,因為在shell里,只能將固定文件、文件夾作為變數,變數中不能加*號(我是沒找到別的方法,有知道大牛請提點下小弟),所以就想了個笨辦法,用匹配關鍵詞的方式來判斷特定目錄下,是apache日誌,還是weblogic日誌,還是IIS日誌,具體判斷方法如下:
if ls -l /usr/ | egrep "access";then
more /usr/access*.* | egrep "多個關鍵詞"
else
more /usr/ex*.log | egrep 「多個關鍵詞」
fi
這樣的方式來進行判斷,但是這樣判斷有個缺點,就是中間件日誌在/usr/目錄下,只能存在一種,比如同時存在apache和IIS的日誌,就會優先判斷apache的,進而不會執行IIS日誌分析的語句。而且,為了不跟之前的歷史數據混亂,在腳本執行開始,清空了下數據。
file=/usr/nmgxy/
if [ -e "$file" ];then
echo "日誌目錄存在,跳過創建過程,該操作會清空/usr/nmgxy/目錄下所有數據"
echo "按回車鍵開始清空數據,結束請點擊Ctrl+c"
read key
rm -r /usr/nmgxy/*
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
else
mkdir -p /usr/nmgxy/ /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/
/usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
fi
echo "分析結果日誌保存在/usr/nmgxy/目錄下"
echo ---------------------日誌目標文件---------------------------
if ls -l /usr/ | egrep "access";then
echo --------------------統計出現次數最多的前20個IP地址-----------------
cat /usr/access*.* |awk '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/top20.log
echo "統計完成"
二、定義攻擊特徵
日誌讀取的問題解決了,接下來就是定義攻擊特徵的事兒了,攻擊特徵比較好定義。例如,SQL注入攻擊的判斷:
echo ------------------------SQL注入攻擊sql.log----------------
echo "開始分析存在SQL注入的攻擊行為,並將結果保存在/usr/nmgxy/sql/目錄下"
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
echo "分析結束"
awk '{print "共檢測到SQL注入攻擊" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
echo "開始統計SQL注入攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "統計結束"
我把一些常見的SQL注入攻擊的特徵寫到了裡面,去掉了MSSQL資料庫存儲過程以及MSSQL資料庫才會出現的一些注入語句。
三、輸出匹配到的含有攻擊特徵的記錄
將匹配到的攻擊特徵內容,重新輸出到了另外一個log裡面,相當於做了一次篩選/usr/nmgxy/sql/sql.log
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
然後二次分析這個篩選過的文件,統計SQL注入攻擊出現的次數
awk '{print "共檢測到SQL注入攻擊" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
輸出完畢後,將攻擊出現最多的前20個IP地址進行統計並顯示到屏幕上
echo "開始統計SQL注入攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "統計結束"
四、輸出結果
這個在代碼開頭,創建了一些文件夾,用來存放篩選過的記錄
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
中間刪刪改改折騰了好幾次。後來針對特定的攻擊,我們比較關注(重點是比較好寫的= =)的內容做了HTTP響應請求200/500的判斷,並輸出結果。
echo -------------------------getshell-getshell.log----------------
echo "開始分析存在getshell的攻擊行為,並將結果保存在/usr/nmgxy/getshell/目錄下"
more /usr/access*.* |egrep "
eval|%eval|%execute|%3binsert|%20makewebtaski%20|/div.asp|/1.asp|/1.jsp|/1.php|/1.aspx|xiaoma.jsp|tom.jsp|py.jsp|k8cmd.jsp|/k8cmd|ver007.jsp|ver008.jsp|ver007|ver008|%if|\.aar"
>>/usr/nmgxy/getshell/getshell.log
echo "分析結束"
echo "二次分析結果中HTTP響應碼為200和500,結果另存為/usr/nmgxy/getshell/ok.log"
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=200) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/getshell/ok.log
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/getshell/ok.log
echo "二次分析結束"
awk '{print "共檢測到getshell行為" NR "次"}' /usr/nmgxy/getshell/getshell.log|tail -n1
echo "開始統計漏洞利用攻擊事件中,出現頻率最多的前20個IP地址"
cat /usr/nmgxy/getshell/getshell.log |awk -F "[" '{print $1}' |sort
|uniq -c |sort -rn |head -20 >/usr/nmgxy/getshell/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/getshell/top20.log
echo "統計結束"
統計HTTP響應狀態,IIS和apache有點區別。apache我以默認空格為分隔符,判斷第9個分隔符是否為200或500,如果等於,則輸出全部內容
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}'
而IIS的,我則是用獲取關鍵詞的方式,來進行判斷。
more /usr/nmgxy/getshell/getshell.log | egrep " 200" >/usr/nmgxy/getshell/ok.log
用egrep的方式,關鍵詞為" 200",200前面有個空格,如果不加空格的話,很容易跟其他的參數混起來,那個時候誤報就不是一點點了。例如asp?id=200,所以加入了空格做區分。
IIS和nginx的思路類似,唯一的區別就是特徵碼,稍微有點改動而已,這個就不一一例舉了。思路就是這個思路,其實後期想把報告整體輸出成HTML的方式,估計工作量挺大,這個還是得閑下來的時候,慢慢修改吧。
PS:這個腳本雖然寫的比較粗糙,但是精確度還是有的,測試了幾十次,精確度能達到至少80%以上。
分析1個多G的日誌文件,需要大致約30多秒左右,我是在虛擬機里做的測試。虛擬機ubuntu系統,1G的內存。
不見得能幫上大忙,至少可以給大家在分析日誌時節省點時間。。。。
先貼出apache、weblogic、IIS的腳本代碼,weblogic的從網盤直接下載就好。apache、weblogic、IIS的腳本代碼:
『叄』 如何在shell腳本中執行系統命令 小小知識站
方法一:切換到shell腳本所在的目錄(此時,稱為目錄)執行shell腳本:碼碼如下:cd /data/shell./hello.sh./的意思是說在當前的目錄下執行hello.sh。如果不加上./,bash可能會響應找到不到hello.sh的錯誤。因為目前的目錄(/data/shell)可能不在執行程序默認的搜索路徑之列,也就是說,不在環境變數PASH的內容之中。查看PATH的內容可用 echo $PASH 命令。現在的/data/shell就不在環境變數PASH中的,所以必須加上./才可執行。方法二:以絕對路徑的方式去執行bash shell腳本:碼碼如下:/data/shell/hello.sh方法三:直接使用bash 或sh 來執行bash shell腳本:碼碼如下:cd /data/shellbash hello.sh或碼碼如下:cd /data/shellsh hello.sh注意,若是以方法三的方式來執行,那麼,可以不必事先設定shell的執行許可權,甚至都不用寫shell中的第一行(指定bash路徑)。因為方法三是將hello.sh作為參數傳給sh(bash)命令來執行的。這時不是hello.sh自己來執行,而是被人家調用執行,所以不要執行許可權。那麼不用指定bash路徑自然也好理解了啊,呵呵……。方法四:在當前的shell環境中執行bash shell腳本:碼碼如下:cd /data/shell. hello.sh或碼碼如下:cd /data/shellsource hello.sh前三種方行shell腳本時都是在當前shell(稱為父shell)開啟一個子shell環境,此shell腳本就在這個子shell環境中執行。shell腳本執行完後子shell環境隨即關閉,然後又回到父shell中。而方法四則是在當前shell中執行的。
『肆』 linux如何進入shell命令行
你安裝的是redhat或者SUSE這樣的桌面版本么?
點擊桌面右鍵,找一個open
Terminal。
或者在system
tool中也可以找到
terminal
另外,ctrl
+alt+back
space本意不是回到shell行,是殺了X。
『伍』 如何運行shell命令第一行為什麼是# !/bin/sh
因為shell程序是解釋執行的,所以不需要編譯裝配成目標程序,按照shell編程的慣例,以bash為例,程序的第一行一般為 「# !/bin/bash」,其中# 表示該行是注釋,嘆號「!」告訴shell運行嘆號之後的命令並用文件的其餘部分作為輸入,也就是運行/bin/bash並讓/bin/bash去執行shell程序的內容。 執行shell程序的方法有三種:1、sh shell程序文件名 這種方法的命令格式為: bash shell程序文件名 這實際上是調用一個新的bash命令解釋程序,而把shell程序文件名作為參數傳遞給它。新啟動的shell將去讀指定的文件,執行文件中列出的命令,當所有的命令都執行完結束。該方法的優點是可以利用shell調試功能。 2、sh<shell程序文件名 格式為: bash<shell 程序文件名 這種方式就是利用輸入重定向,使shell命令解釋程序的輸入取自指定的程序文件。 3、用chmod命令使shell程序成為可執行的 一個文件能否運行取決於該文件的內容本身可執行且該文件具有執行權。對於shell程序,當用編 輯器生成一個文件時,系統賦予的許可許可權都是644(rw-r-r--),因此,當用戶需要運行這個文件時, 只需要直接鍵入文件名即可。 在這三種運行shell程序的方法中,最好按下面的方式選擇:當剛建立一個shell程序,對它的正確性還沒有把握時,應當使用第一種方式進行調試。當一個shell程序已經調試好時,應使用第三種方式把它固定下來,以後只要鍵入相應的文件名即可,並可被另一個程序所調用。
『陸』 如何用SHELL命令運行一個文件
1、Shell是命令解釋器,所執行的文件有兩種,一種是基於ELF文件格式的可執行文件,一種是基於Shell腳本格式的腳本文件。
2、不管是可執行文件還是shell腳本,如果存在於PATH變數所指明的路徑中,shell會自動尋找相應的可執行文件,用戶只需要輸入可執行文件名或者腳本名即可執行。
3、如果可執行文件或者Shell腳本的存放位置不在PATH變數所指明的路徑中,則需要通過".」來執行,比如下面的C語言寫的hello world程序,需要輸入./t才可以被shell運行。
『柒』 linux 怎麼進入shell編程模式
1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態下。
『捌』 如何在C語言中調用shell命令
1、system(執行shell 命令)
相關函數 fork,execve,waitpid,popen
表頭文件 #include<stdlib.h>
定義函數 int system(const char * string);
函數說明 system()會調用fork()產生子進程,由子進程來調用/bin/sh-c
string來執行參數string字元串所代表的命令,此命令執行完後隨
即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時
擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-
1。若參數string為空指針(NULL),則返回非零值。如果system()調
用成功則最後會返回執行shell命令後的返回值,但是此返回值也有
可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查
errno 來確認執行成功。
附加說明 在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會
繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例:
#include<stdlib.h>
main()
{
system(「ls -al /etc/passwd /etc/shadow」);
}
2、popen(建立管道I/O)
相關函數 pipe,mkfifo,pclose,fork,system,fopen
表頭文件 #include<stdio.h>
定義函數 FILE * popen( const char * command,const char * type);
函數說明 popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c
來執行參數command的指令。參數type可使用「r」代表讀取,「w」
代表寫入。依照此type值,popen()會建立管道連到子進程的標准輸
出設備或標准輸入設備,然後返回一個文件指針。隨後進程便可利
用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標准輸
入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使
用,除了fclose()以外。
返回值 若成功則返迴文件指針,否則返回NULL,錯誤原因存於errno中。
錯誤代碼 EINVAL參數type不合法。
注意事項 在編寫具SUID/SGID許可權的程序時請盡量避免使用popen(),popen()
會繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例:
#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(「cat /etc/passwd」,」r」);
fgets(buffer,sizeof(buffer),fp);
printf(「%s」,buffer);
pclose(fp);
}
執行 root :x:0 0: root: /root: /bin/bash
3、使用vfork()新建子進程,然後調用exec函數族
#include<unistd.h>
main()
{
char * argv[ ]={「ls」,」-al」,」/etc/passwd」,(char*) };
if(vfork() = =0)
{
execv(「/bin/ls」,argv);
}else{
printf(「This is the parent process\n」);
}
}
『玖』 如何用shell命令處理欄位
shell處理欄位,一般使用awk、sed、grep這三個正則表達式工具來進行操作。
要看具體的文字情況,一般行用sed處理,列用awk,雜用grep