linux – 将dd数据从输出通过netcat分离到解析输出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 将dd数据从输出通过netcat分离到解析输出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2507字,纯文字阅读大概需要4分钟。
内容图文
我正在使用以下命令通过netcat复制dd输出
$dd if=/dev/zero bs=1024K count=1 | nc <IP_ADDR> <PORT> -q 0
1+0?enregistrements lus
1+0?enregistrements écrits
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,0590934 s, 17,7 MB/s
但是当我尝试解析输出时没有任何反应
$dd if=/dev/zero bs=1024K count=1 | nc <IP_ADDR> <PORT> -q 0 | grep copied
1+0?enregistrements lus
1+0?enregistrements écrits
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,058937 s, 17,8 MB/s
它应该只打印最后一行,为什么输出没有发送到grep?
我尝试了很少的重定向,但我无法按照我的意愿重定向.
我希望通过netcat发送数据,但是将输出消息(stderr和stdin)发送到stdout或文件后再解析它.
解决方法:
在
dd if=/dev/zero bs=1024K count=1 | nc <IP_ADDR> <PORT> -q 0 | grep copied
dd状态输出无法进入grep. grep正在读取nc的输出,而不是dd.如果dd在其stdout上写了那个输出,它会转到nc,而不是grep.
值得庆幸的是,dd不会将该状态消息写入其stdout(否则它将被发送到< IP_ADDR>我们不想要),但它会将其写入分离的流:stderr(因为它是诊断消息,不是它的正常输出).
要让dd的stderr连接到一个转到grep的管道(和nc的stdout stderr不变),你可以这样做:
{ {
dd if=/dev/zero bs=1M count=1 2>&3 3>&- |
nc -q 0 <IP_ADDR> <PORT> 3>&-
} 3>&1 >&4 4>&- | grep copied 4>&-; } 4>&1
假设shell的stdin / stdout / stderr转到I,O,E(如果从终端运行,则所有将在读写模式下打开tty设备),在上面我们将:
cmd \ fd | stdin stdout stderr 3 4
---------+------------------------------------
dd | I pipe1 pipe2 closed closed
nc | pipe1 O E closed closed
grep | pipe2 O E closed closed
或者让dd的stderr和nc的stdout stderr转到grep(但是dd的stdout仍然转到nc):
{
dd if=/dev/zero bs=1M count=1 |
nc -q 0 <IP_ADDR> <PORT>
} 2>&1 | grep copied
我们的每个命令的fd赋值表变为:
cmd \ fd | stdin stdout stderr
---------+--------------------
dd | I pipe1 pipe2
nc | pipe1 pipe2 pipe2
grep | pipe2 O E
另一种方法:
{
dd if=/dev/zero bs=1M count=1 2>&1 >&3 3>&- |
grep copied >&2 3>&-
} 3>&1 | nc -q 0 <IP_ADDR> <PORT>
cmd \ fd | stdin stdout stderr 3
---------+-----------------------
dd | I pipe1 pipe2
nc | pipe1 O E
grep | pipe2 E E
但请注意,该输出不是很相关. 1MiB数据可能适合管道缓冲区,nc的内部读缓冲区和套接字发送缓冲区,因此您无法真正计算网络吞吐量.在通过网络发送第一个数据包之前,可能会返回dd(在TCP连接启用后不久,nc开始读取其stdin).再看看iperf.
如果没有iperf,你可以更好地测量发送吞吐量,如果你做了类似的事情:
{
dd bs=1M count=50 2> /dev/null # buffers filled and the TCP connection
# established and into a steady state
dd bs=1M count=100 2>&1 >&3 3>&- | grep copied >&2 3>&-
} < /dev/zero 3>&1 | nc -q 0 <IP_ADDR> <PORT>
内容总结
以上是互联网集市为您收集整理的linux – 将dd数据从输出通过netcat分离到解析输出全部内容,希望文章能够帮你解决linux – 将dd数据从输出通过netcat分离到解析输出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。