0x01 测试程序
本文会用以下测试程序,来演示在bash中,如何进行各种文件重定向:
上图是一段rust代码,其主要逻辑是,从标准输入读取数据,然后将这些数据分别写到标准输出和标准错误输出里。
有关什么是标准输入/输出/错误输出,请阅读我之前写的一篇文章:到底什么是标准输入输出。
0x02 将标准输入重定向到 /dev/null
/dev/null 是linux下的一个特殊文件,从该文件读取数据时,内核会直接返回EOF,即读不到任何数据,所以在上图中,stdout/stderr行的输出都为空。
0x03 将标准输入重定向到普通文件
上图先用echo命令,把hello字符串写到stdin.log,然后执行测试程序,把它的标准输入重定向到stdin.log,此时stdout/stderr行就都输出了hello字符串。
0x04 将标准输出重定向到普通文件
上图把标准输出重定向到了stdout.log,所以终端只输出了stderr行,而stdout行被写到了stdout.log文件中。
0x05 将标准错误输出重定向到普通文件
这次把标准错误输出也做了重定向,所以终端上没有任何输出,所有输出都保存到了各自的文件里。
因为标准错误输出的文件描述符是2,所以上面用了 2> 这种符号重定向标准错误输出。
0x06 将标准输出及错误输出重定向到同一文件
上图先把标准输出重定向到hello.log,然后再通过 2>&1 这个符号,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,即hello.log,这样标准错误输出就也指向了hello.log。
这里需要注意重定向操作符的顺序,比如下面这个就是错的:
上图中先通过 2>&1,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,因为当前文件描述符1和2都指向终端,所以这一步是没有任何效果的。
然后,再将标准输出重定向到hello.log
通过上述步骤,标准输出内容就写到了hello.log里,但标准错误输出内容,还是写到了终端里,所以这个写法是不行的。
除了上述方式外,我们还可以用下面的方式,将标准输出/错误输出都重定向到同一文件:
0x07 将标准输出及错误输出追加到同一文件
以上介绍的,将输出重定向到文件的方式,都会覆盖掉原文件的内容,如果不想覆盖原文件的内容,而是想把新的输出追加到该文件,可以用下面的方式:
和覆盖原文件使用的命令差不多,只是多了一个大于号而已。
0x08 将指定字符串作为标准输入内容
上面只是将单行字符串作为标准输入内容,如果想把多行字符串作为标准输入内容,可以用以下方式:
上图中,先将各种输出都重定向到hello.log,然后再将两个xxx之间的内容,作为标准输入。
注意,xxx这个字符串是可以任意指定的。
0x09 将标准输出及错误输出重定向到指定tcp服务器
先用ncat命令开启一个tcp服务器,监听端口9999:
然后用以下命令,将所有输出都重定向到该服务器:
上图中,localhost指定的是目标服务器的地址,9999指定的是目标服务器的端口,其余部分是固定的。
在执行完该命令后,查看ncat命令那张图,就能看到对应的输出了。
0x0a 最后
更多信息,请查看bash的man文档。
0x0b 其他
如果有对linux及linux内核感兴趣的,可以扫描右侧二维码添加我的微信。
另外,我开设了一门 linux内核启动流程源码分析 课程,有对内核源码感兴趣的,欢迎报名。