为什么 >/dev/null 不能按预期工作?

金纯

我编写了以下shell脚本:

#! /bin/bash

# This script is designed to find hosts with MySQL installed

nmap -sT my_IP_address -p 3306 >/dev/null -oG MySQLscan

cat MySQLscan | grep open > MySQLscan2

cat MySQLscan2

根据脚本,nmap 的输出应该发送到 /dev/null。另一方面,最终的输出应该写入我的密码中的 MySQLscan2 文件。

与我预期的不同,我的密码中写入了两个文件: MySQLscan:包含我预期在 MySQLscan2 中的扫描输出。MySQLscan2:这个文件是空的。

我的脚本有错误吗?我该如何解决问题?

今天早些时候,我设法以正确的输出运行脚本。我不确定我是否以某种方式更改了脚本。查了一遍又一遍,还是没找到,怎么回事……

我正在使用 Kali Linux 和 Oracle VM Virtual Box。

阿尔卡迪乌什·德拉布奇克

> /dev/null导致 shell在命令启动之前将标准输出(即文件描述符为 1文件)重定向到 /dev/null,换句话说就是丢弃它。当 nmap 与-oG MySQLscan选项一起运行时,它会打开一个新文件并获取一个新的文件描述符。您可以使用 strace 进行检查:

$ strace -f nmap -sT localhost -p 3306  -oG MySQLscan |& grep MySQLscan
execve("/usr/bin/nmap", ["nmap", "-sT", "localhost", "-p", "22", "-oG", "MySQLscan"], 0x7ffc88805198 /* 60 vars */) = 0
openat(AT_FDCWD, "MySQLscan", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4

在此示例中,openat()返回 4 作为新文件描述符(您可以使用 阅读有关此函数的更多信息man 2 openat)。由于文件描述符 4 在命令启动之前没有被重定向 MySQLscan 被创建。还要注意,即使 openat() 返回打开 MySQLscan 的文件描述符被重定向到 /dev/null:

nmap -sT localhost -p 22  -oG MySQLscan 4>/dev/null

它不会阻止 MySQLscan 的创建,因为 openat()每次运行时都会从内核请求一个新的未使用的文件描述符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章