昨晚,我发现 netcat 的行为……嗯,至少可以说很奇怪。当调用时(我没有使用标志,只是基本的“netcat [主机名] [端口号]”),它会根据使用它的内容执行两件事之一。也就是说,如果我运行使用 netcat 的 bash 脚本,而不是在命令行上使用它,它的行为会略有不同。该脚本还使用 echo 在端口 80 上提供 HEAD 请求,会像往常一样提示用户输入。但是,按下回车键后,脚本会立即结束并返回到命令行。但是,在命令行上,使用主机名和端口号调用 netcat 会开始一个没有命令行的新行。几秒钟后,它会转到下一行,我会得到命令行。长话短说,我尝试通过使用 sudo 从 /bin/ 中删除 netcat 文件来修复它(事后看来,我不确定为什么我认为这会有所帮助),然后立即意识到我搞砸了,而且从来没有备份过,所以我重新安装了虚拟机,这使 netcat 恢复了正常工作。至少,直到刚刚,因为它又在做同样的事情。我能做些什么来解决这个问题吗?
编辑:我没有意识到我仍在运行 13.04,这可能(我希望)与 netcat 无法正常工作有关。一旦我运行 14.04 版本,我将查看 netcat 是否再次工作,然后再次编辑问题以分享结果。如果它有效,我也会等待一两天,看看问题是否再次出现。如果没有,我会添加答案。
编辑:现在我很困惑。在我更新到 14.04 后,Netcat 仍然表现相同。更糟糕的是,通过 .iso 重新安装 14.04 并没有解决问题,即使是暂时的。如果有人能帮助我解决这个问题,我将不胜感激。
答案1
您的示例INPUT=hostname; echo -e "HEAD / HTTP/1.1\nhost: $INPUT\n\n" | nc $INPUT 80
在命令行中有效(显示来自服务器的正常结果),但在放入仅包含行的脚本中时无效(显示来自服务器的错误请求错误)。
这是由一个棘手的shell 不兼容相关dash
:
您可以使用极简 shell 运行 shell 脚本/bin/dash
- 它也链接为/bin/sh
,即默认 shell。当没有“shebang”行或 时使用它#!/bin/sh
。
问题是由echo
dash 的内置命令引起的,它不支持该-e
选项。-e
实际上是作为 HTTP 请求的一部分传递的 - 这导致服务器返回错误“400 Bad Request”。
要修复,请使用bash
而不是dash
,例如使用第一个脚本行#!/bin/bash