【问题标题】:Why does >/dev/null not work as expected?为什么 >/dev/null 不能按预期工作?
【发布时间】:2021-08-29 18:26:32
【问题描述】:

我编写了以下 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。

【问题讨论】:

  • MySQLscan2: This file is empty. - MySQLscan 中没有出现open
  • 好的,谢谢@ArkadiuszDrabczyk,但为什么我会在我的密码中找到 MySQLscan?它应该在 /dev/null 中?文件在 pwd 中是否有原因?

标签: bash shell kali-linux


【解决方案1】:

> /dev/null 导致 shell 重定向标准输出,即file with file descriptor to 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 阅读有关此功能的更多信息)。由于文件 在命令启动 MySQLscan 之前没有重定向描述符 4 被创建。还要注意,即使文件描述符 openat() 返回打开 MySQLscan 被重定向到 /dev/null:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多