在bash中如何进行各种文件重定向呢?

电子说

1.2w人已加入

描述

0x01 测试程序

本文会用以下测试程序,来演示在bash中,如何进行各种文件重定向:

TCP通信

上图是一段rust代码,其主要逻辑是,从标准输入读取数据,然后将这些数据分别写到标准输出和标准错误输出里。

0x02 将标准输入重定向到 /dev/null

TCP通信

/dev/null 是linux下的一个特殊文件,从该文件读取数据时,内核会直接返回EOF,即读不到任何数据,所以在上图中,stdout/stderr行的输出都为空。

0x03 将标准输入重定向到普通文件

TCP通信

上图先用echo命令,把hello字符串写到stdin.log,然后执行测试程序,把它的标准输入重定向到stdin.log,此时stdout/stderr行就都输出了hello字符串。

0x04 将标准输出重定向到普通文件

TCP通信

上图把标准输出重定向到了stdout.log,所以终端只输出了stderr行,而stdout行被写到了stdout.log文件中。

0x05 将标准错误输出重定向到普通文件

TCP通信

这次把标准错误输出也做了重定向,所以终端上没有任何输出,所有输出都保存到了各自的文件里。

因为标准错误输出的文件描述符是2,所以上面用了 2> 这种符号重定向标准错误输出。

0x06 将标准输出及错误输出重定向到同一文件

TCP通信

上图先把标准输出重定向到hello.log,然后再通过 2>&1 这个符号,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,即hello.log,这样标准错误输出就也指向了hello.log。

这里需要注意重定向操作符的顺序,比如下面这个就是错的:

TCP通信

上图中先通过 2>&1,把标准错误输出的文件描述符2,指向当前标准输出的文件描述符1指向的文件,因为当前文件描述符1和2都指向终端,所以这一步是没有任何效果的。

然后,再将标准输出重定向到hello.log

通过上述步骤,标准输出内容就写到了hello.log里,但标准错误输出内容,还是写到了终端里,所以这个写法是不行的。

除了上述方式外,我们还可以用下面的方式,将标准输出/错误输出都重定向到同一文件:

TCP通信

0x07 将标准输出及错误输出追加到同一文件

以上介绍的,将输出重定向到文件的方式,都会覆盖掉原文件的内容,如果不想覆盖原文件的内容,而是想把新的输出追加到该文件,可以用下面的方式:

TCP通信

和覆盖原文件使用的命令差不多,只是多了一个大于号而已。

0x08 将指定字符串作为标准输入内容

TCP通信

上面只是将单行字符串作为标准输入内容,如果想把多行字符串作为标准输入内容,可以用以下方式:

TCP通信

上图中,先将各种输出都重定向到hello.log,然后再将两个xxx之间的内容,作为标准输入。

注意,xxx这个字符串是可以任意指定的。

0x09 将标准输出及错误输出重定向到指定tcp服务器

先用ncat命令开启一个tcp服务器,监听端口9999:

TCP通信

然后用以下命令,将所有输出都重定向到该服务器:

TCP通信

上图中,localhost指定的是目标服务器的地址,9999指定的是目标服务器的端口,其余部分是固定的。

在执行完该命令后,查看ncat命令那张图,就能看到对应的输出了。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分