【问题标题】:How can I terminate netcat so my script can loop again?如何终止 netcat 以便我的脚本可以再次循环?
【发布时间】:2017-04-25 00:09:26
【问题描述】:

我正在运行一个 bash 脚本,该脚本遍历我的远程服务器 IP 列表,通过 netcat (telnet) 连接每一行,并运行一些命令。

问题是我似乎无法弄清楚如何终止 netcat,以便脚本可以循环到列表中的下一个 IP。

这是相关的部分:

#!/bin/bash
while ISF= read -r line;do
(
sleep 3
printf 'command1'
sleep 3
printf 'command2'
sleep 3
) | nc $line
done < ~/servers.txt

远程服务器不发送 EOF,所以我可以在 netcat 上使用echoprintf 来终止 netcat 以便脚本可以再次循环吗?我真的不想为超时设置-w 标志,因为我需要在很多服务器上执行此操作,而超时会使其花费更长的时间。

【问题讨论】:

  • 嗯,只是一个很长的猜测:printf 'echo "QUIT"' ?
  • 不,这行不通,因为这只会将单词“QUIT”发送到远程服务器。我会假设 netcat 中有某种类似于 telnet (CTRL+]) 的转义函数,但我不知道它是什么。
  • 但是将退出命令发送到活动连接会关闭当前连接...不是吗?无论如何,printf 'echo "^Z"' IIRC。
  • 查看Bash FAQ 001 了解逐行遍历文件的正确方法。
  • @chepner 谢谢,我只是很快把它放在一起。代码在上面更新。

标签: bash ubuntu-14.04 terminate netcat


【解决方案1】:

取决于您的 netcat 版本,但 -c 应该满足您的需求。从 gnu netcat 的使用说明(这可能是你在 Ubuntu 上运行的):

 -c, --close                close connection on EOF from stdin

【讨论】:

  • 很遗憾,我的版本中没有该选项。
  • 如果在特定时间段内没有从标准输入接收到任何内容,您是否有 -w 选项来超时?
  • @chepner 是这样工作的吗?我认为这是进程本身的超时,即计时器在连接时启动并在该时间长度后断开连接,无论输入如何。
  • 我想?我的手册页显示“如果连接和标准输入的空闲时间超过 timeout 秒,则连接会静默关闭。”我读到这一点,因为标准输入或远程端的任何活动都足以重置计时器。
  • @chepner 你是对的。这确实有效。如果你把它作为答案,我会把它标记为正确的。
【解决方案2】:

指定一个超时时间,在此之后nc 将在未收到来自远程端或通过标准输入的进一步输入时退出。

... | nc "$line" -w 10   # Choose a value for -w as appropriate

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2021-11-28
    • 2015-10-30
    相关资源
    最近更新 更多