HERE?Document是bash里面定義塊變量的途徑之一
定義的形式為:
命令<
...
...
...
HERE
它的作用即可以用來定義一段變量,會把命令和HERE之間的內容利用轉向輸入的方式交給該命令去處理。其中HERE相當于標記,可以是任何的字符串。
使用HERE Document用在變量設定:
[root@localhost ~]# WOW='Wow,great!'
[root@localhost ~]# m1=$(cat <
> Line 1 is good.
> They are jack,marry and john.
> $WOW
> HERE)
echo $m1
Line 1 is good. They are jack,marry and john. Wow,great!
如上例寫成
$(cat <<"HERE",表示這個Here Document擁有和雙引號一樣的特性,即支持變量替換的功能。
也可以用來定義一段注釋 ,利用HERE Document做多行批注,方法是:
:<
這是第一行批注
這是第二行批注
這是第三行批注
其它行,類推
HERE
:代表什么都不做
原本bash只支持單行批注(用#表示),現就可用于多行注釋了。
注意這里HERE還有一個特殊的用法 :
就是在HERE前面加上 - 或者給HERE加上' ',加上- 表明下述文字段所有TAB鍵將全部忽略,加上' '表明以下凡是變量定義用到了' ',將會使變量呈現所見即所得的形式,也即關閉變量替換;如果加上的是" "雙引號,則會進行變量替換。
[root@localhost ~]# cat<<-'HERE'
>? ? Line 1 is good.
>? ? They are jack,marry and john.
>? ? $WOW
> HERE
Line 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
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.sh
creating hello.c...
compiling hello.c...
excute hello...
Hello world!