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!