HERE Document是bash裡面定義塊變數的途徑之一
定義的形式為:
命令<<HERE
...
...
...
HERE
它的作用即可以用來定義一段變數,會把命令和HERE之間的內容利用轉向輸入的方式交給該命令去處理。 其中HERE相當於標記,可以是任何的字串。
使用HERE Document用在變數設定:
[root@localhost ~]# WOW='Wow,great!'[root@localhost ~]# m1=$(cat <<HERE> Line 1 is good.> They are jack,marry and john.> $WOW> HERE)
echo $m1Line 1 is good. They are jack,marry and john. Wow,great!
如上例寫成
$(cat <<"HERE", 表示這個Here Document擁有和雙引號一樣的特性,即支援變數替換的功能。
也可以用來定義一段注釋 ,
利用HERE Document做多行批註,方法是:
:<<HERE 這是第一行批註 這是第二行批註 這是第三行批註 其它行,類推
HERE
:代表什麼都不做
原本bash只支援單行批註(用#表示),現就可用於多行注釋了。
注意這裡HERE還有一個特殊的用法 :
就是在HERE前面加
上 - 或者給HERE加上' ',
加上- 表明下述文欄位所有TAB鍵將全部忽略,
加上' '表明以下凡是變數定義用到了' ',將會使變數呈現所見即所得 (WYSIWYG)的形式,也即關閉變數替換;如果加上的是" "雙引號,則會進行變數替換。
[root@localhost ~]# cat<<-'HERE'
> Line 1 is good.
> They are jack,marry and john.> $WOW> HERELine 1 is good.They are jack,marry and john.$WOW
利用HERE Document
,打包C(或其它程式語言)的原始碼。這是Cracker散布安全性漏洞程式,最喜歡的方法。
1 #!/bin/bash 2 # Filename:create_prg.sh 3 echo "creating hello.c..." 4 echo 5 cat <<'EOF' > hello.c 6 #include <stdio.h> 7 8 int main() 9 { 10 printf("Hello world!\n"); 11 return 0; 12 } 13 EOF 14 15 echo "compiling hello.c..." 16 echo 17 #compile hello.c,create the excutable file 18 gcc -o hello hello.c 19 20 #if compile successfully,then excute it 21 if [ $? -eq 0 ];then 22 echo "excute hello..." 23 echo 24 chmod u+x hello 25 ./hello 26 else 27 echo 'Compile Error:hello.c' 28 fi
5到13行利用HERE Document夾帶了一個hello.c程式的原始碼,執行指令碼時會產生hello.c,接著調用gcc 編譯hello.c,若編譯無誤,就“執行”(開始攻擊)程式檔案hello.
這是shell script攜帶攻擊程式的原型。 執行結果:
[root@localhost sh]# ./create_prg.shcreating hello.c...compiling hello.c...excute hello...Hello world!