我编写了以下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] 删除。
我来说两句