bug bounty中常见的shell命令
声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
前言
最近几天重感冒了,咳嗽好几天了,好在情况在好转,小编也提醒一下大家做好防护工作,今天就分享一下前几天TomNomNom的那个演讲中的一些笔记
正文
标准输入输出与错误
/dev/null
表示空设备文件
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误
这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
输入
stdin(标准输入)是程序从中读取输入的流。默认情况下,stdin 从键盘读取输入,但也可以将其重定向为从文件或另一个程序的输出读取输入。
$ cat
Hello, world!
^D
Hello, world!
在此示例中,cat 命令从 stdin(在本例中为键盘)读取输入并将其写入 stdout(在本例中为控制台)。当用户按下 CTRL+D 时,cat 终止,输入显示在控制台上。
输出
stdout(标准输出)是程序写入输出的流。默认情况下,stdout 在控制台上显示输出,但也可以将其重定向以将输出写入文件或另一个程序的输入。
$ ls -l > listing.txt
在此示例中,ls 命令列出当前目录的内容,并使用 > 运算符将输出重定向到名为 listing.txt 的文件。
错误
stderr(标准错误)是程序向其写入错误消息的流。默认情况下,stderr 在控制台上显示错误消息,但也可以将其重定向以将错误消息写入文件或另一个程序的输入。
$ cat nonexistent.txt 2> errors.txt
⇒ cat errors.txt
cat: nonexistent.txt: No such file or directory
在此示例中,cat 命令尝试读取一个名为 nonexistent.txt 的文件,该文件不存在。错误消息打印到 stderr,错误消息使用 2> 运算符重定向到名为 errors.txt 的文件。
⇒ ls
errors.txt output.txt output01.txt stdin_out.txt
⇒ ls -l nonexistent.txt > listing.txt 2>&1
⇒ ls
errors.txt listing.txt output.txt output01.txt stdin_out.txt
⇒ cat listing.txt
ls: nonexistent.txt: No such file or directory
在此示例中,ls 命令尝试列出名为 nonexistent.txt 的文件的内容,该文件不存在。错误消息打印到 stderr,错误消息和 ls 命令的输出都使用 > 和 `2>&1 运算符重定向到名为 listing.txt 的文件。
就是说如果nonexistent.txt这个文件存在,那么就将里面的内容重定向到listing.txt
如果nonexistent.txt这个文件不存在,就将错误消息重定向到listing.txt
#2>&1--->如果有错误就将错误输入到标准输出的地方
cmdA 2>&1
此命令运行 cmdA 并将任何 stderr 输出重定向到与 stdout 相同的位置。
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
输入输出重定向
输出重定向
⇒ who
mac console Dec 18 10:30
mac ttys000 Dec 18 10:46
mac ttys004 Dec 18 10:57
⇒ who > users.txt
⇒ cat users.txt
mac console Dec 18 10:30
mac ttys000 Dec 18 10:46
mac ttys004 Dec 18 10:57
#如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
⇒ echo "菜鸟教程:www.runoob.com" >> users.txt
⇒ cat users.txt
mac console Dec 18 10:30
mac ttys000 Dec 18 10:46
mac ttys004 Dec 18 10:57
菜鸟教程:www.runoob.com
重定向输入
将输入重定向到 inputFile
cmd < inputFile
⇒ cat users.txt
mac console Dec 18 10:30
mac ttys000 Dec 18 10:46
mac ttys004 Dec 18 10:57
菜鸟教程:www.runoob.com
⇒ wc -l users.txt
4 users.txt
⇒ wc -l < users.txt
4
#注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
合二为一:
command1 < infile > outfile
#同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
⇒ wc -l < users.txt >outfile.txt
⇒ cat outfile.txt
4
在看一个例子:
⇒ ls
errors.txt outfile.txt output01.txt users.txt
listing.txt output.txt stdin_out.txt
⇒ cat listing.txt
ls: nonexistent.txt: No such file or directory
#读取listing.txt中内容,然后将输出写入到testlist.txt中
⇒ cat < listing.txt > testlist.txt
⇒ ls
errors.txt outfile.txt output01.txt testlist.txt
listing.txt output.txt stdin_out.txt users.txt
⇒ cat testlist.txt
ls: nonexistent.txt: No such file or directory
cmdA |& cmdB
cmdA |& cmdB
#shell 命令 cmdA |& cmdB 是两个 shell 运算符的组合:管道运算符|和 &.
#管道操作员 | 获取运算符左侧命令的输出(本例中为 cmdA),并将其作为输入传递给运算符右侧的命令(本例中为 cmdB)。 这类似于 | 其他编程语言中使用的运算符,用于将一个函数或方法的输出作为另一个函数或方法的输入。
#错误重定向运算符 & 将运算符左侧的命令(在本例中为 cmdA)的标准错误输出重定向到与标准输出相同的位置。 这对于从脚本或程序中的命令捕获错误消息,或将标准输出和错误输出重定向到同一文件或流非常有用。
#其实就是执行了两个命令,如果有错误就输出到与标准输出相同的位
<(cmd)
<(cmd)
语法称为进程替换,它允许您将一个命令的输出用作另一个命令的输入,就好像它是一个文件一样。
以下是使用进程替换对 ls 命令的输出进行排序并将其作为输入传递给 wc(字数统计)命令的示例,该命令计算输入中的行数:
⇒ ls
errors.txt outfile.txt output01.txt testlist.txt
listing.txt output.txt stdin_out.txt users.txt
⇒ wc -l <(ls)
8 /dev/fd/11
使用进程替换的另一个例子是比较两个文件的内容,即使其中一个是命令的输出:
diff <(sort file1) <(sort file2)
⇒ cat output.txt
1
2
3%
⇒ cat output01.txt
1
1
3
1%
⇒ diff <(sort output.txt) <(sort output01.txt)
2c2,3
< 2
---
> 1
> 1
⇒ cat output01.txt
1
1
3
⇒ cat output.txt
1
2
3%
⇒ diff <(sort output.txt) <(sort output01.txt)
2c2
< 2
---
> 1
$(cmd)
$(cmd) - 返回cmd的结果,并将其保存与变量中
如果您希望将命令输出保存在变量中,则非常方便
tee
tee 命令是一个 Unix 实用程序,它从标准输入读取并将输出写入标准输出和一个或多个文件。
shell 命令 cmd | tee outfile 将运行 cmd 命令和 outfile。如果文件 outfile 不存在,将创建它。如果它确实存在,它将被新的输出覆盖。
ls -l | tee filelist.txt
此命令将列出当前目录中的文件并将输出写入终端和文件 filelist.txt。
-
在终端显示 -
写入到文件filelist.txt
shell 命令 cmd | tee -a outfile
的工作方式类似,但它将 cmd 命令的输出附加到文件 outfile 的末尾,而不是覆盖它。
Plain text
提取或者排除(grep)
grep -v pattern: grep 命令用于在一个或多个文件中搜索特定模式。-v 选项告诉 grep 反转搜索,这意味着它将返回所有与指定模式不匹配的行。
⇒ cat file.txt
I love apples.
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.
⇒ grep -v apple file.txt
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.
⇒ cat file.txt | grep -v apple
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.
awk(打印删除特定字段)
awk '{print $3}':此awk命令将打印输入中每一行的第三个字段。例如,如果输入文件包含以下行:
⇒ cat file.txt
I love apples.
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.
⇒ cat file.txt | awk '{print $3}'
apples.
like
my
care
awk '{print $NF}':此awk命令将打印输入中每一行的最后一个字段。例如,如果输入文件包含以下行:
⇒ cat file.txt | awk '{print $NF}'
apples.
pears.
fruit.
bananas.
在看一个删除的例子:
⇒ cat awk01.txt
apple orange banana strawberry
grapefruit kiwi mango pineapple
⇒ cat awk01.txt | awk '{$3 = "";print $0}'
apple orange strawberry
grapefruit kiwi pineapple
#注意:原文是不变的
⇒ cat awk01.txt
apple orange banana strawberry
grapefruit kiwi mango pineapple
"cat input.txt | awk '{
参考
https://www.runoob.com/linux/linux-shell-io-redirections.html
往期回顾
原文始发于微信公众号(迪哥讲事):bug bounty中常见的shell命令
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论