在实际应用过程中,经常遇到需要忽略shell脚本中回车的问题,本文做了一些总结,既有常规操作,也有令人拍案叫绝的方法,且让我慢慢说来。
一、使用Linux shell自身的字符串操作
Linux shell内置了一系列的字符串操作符号,可以实现字符串的长度、查找、替换等功能,具体的内容大家可以https://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
这里主要使用对字符串的替换功能:
#替换一次
$ a="1\n2\n3"
$ echo $a
1\n2\n3
$ echo -e ${a/\\n/}
12
3
#全部替换
$ a="1\n2\n3"
$ echo $a
1\n2\n3
$ echo -e ${a//\\n/}
123
二、使用sed命令
假设1.sh中内容为:
1\n
2\n
3\n
目的是使用sed将”\n“替换为空字符。
按普通sed的用法,只要 :
sed "s/\n//g" 1.sh
但通过实操,没有起到作用。
通过查询相关资料,才知道sed是按行处理文本数据的,每次处理一行数据后,会在行尾自行添加一个换行符,这就产生了上述的问题。
如果非要使用sed命令,就要连续两行执行一次sed命令,感兴趣的同学可以看一下:
Sed and awk 笔记之 sed 篇:高级命令(一)
http://kodango.com/sed-and-awk-notes-part-4
Sed and awk 笔记之 sed 篇:高级命令(二)
http://kodango.com/sed-and-awk-notes-part-5
按它的说明,我们最终执行如下:
$ cat 1.sh
1
2
3
$ sed "s/\n//g" 1.sh
1
2
3
$ sed ":a;N;s/\n//g;ta" 1.sh
123
三、使用awk
这个就相当简单了,直接上过程:
$ cat 1.sh
1
2
3
$ awk '{printf $0}' 1.sh > 2.sh
$ cat 2.sh
123
四、使用tr
这个也相对简单,直接上过程:
$ cat 1.sh
1
2
3
#方法一,先用空格替换\n
$ cat 1.sh | tr '\n' ' '
1 2 3
#方法二,直接将\n删除:
$ cat 1.sh | tr -d '\n'
123
五、使用续行符“\”
bash过长时,可以使用续行符“\”进行参数的换行。只要反斜杠“\”后面紧跟回车,就表示下一行是当前的续行。看代码:
$ cat 1.sh
echo 1\
2\
3
$ ./1.sh
123
这个技巧看起来非常简单,但是在实际应用尤其在CTF比赛中可以让你做骚到极致的事情。
试想一下这个场景,你每次只能够执行有限长度的指令,比如说7个字节长度的指令,你想执行下列指令:
nc 127.0.0.1 8080
长度肯定超过7个字节,那只能想办法用脚本实现,问题来了,如何写这个脚本?
如果用echo,那想一下,“echo * > 1.sh",这是比较少的长度了(当然,将echo软链接为一个长度为1的程序也能减少整条命令的长度)。但是依然没有办法满足每次只能输入7个字节长度的指令。
来了,一个骚操作来了,直接看操作:
#注意,$ >中间有空格,即 “$[空格]>”!!!
$ >" 8080"
$ >"0.1\\"
$ >0.\\
$ >7.\\
$ >"12\\"
$ >"nc \\"
$ls -t > a.sh
$cat a.sh
a.sh
nc \
12\
7.\
0.\
0.1\
8080
测试一下,直接运行这个脚本,会发现确实运行了“nc 127.0.0.1 8080”这条命令。
在拼凑这样的指令时,需要注意的是'/'不能作为文件名;不能有同名的文件,否则覆盖;另外“.0.”也没法当作文件名。