【问题标题】:Implementing netcat in bash在 bash 中实现 netcat
【发布时间】:2012-08-28 04:12:43
【问题描述】:

作为我正在尝试编写的更大脚本的基础,我正在尝试基本上在 bash 中实现一个基本的 netcat 客户端。我当前的脚本在技术上有效,它看起来像这样:

#!/bin/bash

exec 3<>/dev/tcp/$1/$2         

cat <&3 &                      
cat <&1 >3

它的问题是它留下了一个需要杀死的挂起的猫进程,但我想不出一种自动的方法来这样做,手动运行pkill cat 看起来并不运动。

【问题讨论】:

    标签: bash netcat


    【解决方案1】:

    我已经接受 Jeremy 的回答是正确的,但是对于任何好奇的人来说,这里是我最终得到的完整脚本:

    #!/bin/bash
    
    exec 3<>/dev/tcp/$1/$2         
    
    control_c()
    {
        kill $CAT_PID
        exit $?
    }
    
    trap control_c SIGINT
    
    cat <&3 &                      
    CAT_PID=$!
    cat >&3
    

    【讨论】:

    • 支持发布您的工作解决方案。人们这样做真是太好了!
    • 谢谢!我做了几乎相同的事情,但是使用 pkill -P $$ 而不是捕获 PID,并在最后使用额外的 pkill -P $$ 来捕获客户端关闭的连接(这导致一只被认出的猫在附近闲逛了一会儿)
    • 在末尾添加“等待”以防止脚本在远程端发送响应之前存在。否则一旦标准输入关闭,猫就会被遗弃。
    【解决方案2】:

    这是一个可怕的组合,但你可以产生一个子shell,所以像这样:

    CAT1_PID=$$
    echo CAT1_PID > /tmp/CAT1_PID
    exec cat <&3 &
    

    当然,如果该脚本的多个副本恰好在运行,您就会遇到竞争条件。

    根据您的 shell,您可能可以在 PS 列表中调用某种形式的 exec 和“重命名”cat。然后就可以了

    pkill the_cat_that_ate_the_network
    

    【讨论】:

    • 你知道当我 control-c 我的脚本时自动调用 pkill 的方法吗?
    • 好久没做真正的脚本了,只能靠全能的谷歌了。如果您使用的是bash,那么您可以试试这个。 Bash Trap 最近我发现了一堆不同的 shell 变体作为默认 shell,所以请确保你的 #! 指向正确的位置。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多